Až Vám zčerná obrazovka, přejděte na Linux!

Proč používat Linux

pátek 18. dubna 2008

Nepoužívejte CORBU, smrdí, aneb rychlost řešení chyb v Sun JDK

Tušil jsem, že rychlost řešení nebude přílš vysoká vzhledem k množství chyb, ale co je moc, to je někdy opravdu příliš.
V Barcu máme docházkový systém, který je řešený appletem komunikující se systémem přes CORBU. V JDK 1.4.2 fungoval naprosto spolehlivě. Při přechodu na 1.5 mu přestala chodit CORBA. Lidé z ComInfa dodali workaround - soubor java.policy obsahující:

// CORBA error workaround
grant codeBase "http://192.168.11.9/watt/jar/*" {
permission java.lang.RuntimePermission "modifyThread";
permission java.lang.RuntimePermission "modifyThreadGroup";
};

Přišlo mi to strašně divné, protože nutnost povolovat práci s Thready považuji za prasárnu. Tak jsem začal pátrat, co za svinstvo tam můžou vlastně dělat. Odpově byla přeqapující - jsou v tom nevinně!

Chybu má totiž na svědomí com.sun.corba.se.impl.transport.SelectorImpl, který na začátku metody run() udělá naprosto samozřejmou věc - nastaví si jméno. Potíž je v tom, že v Appletu je takováto operace by default zakázána! Aby ji bylo možno provést, je třeba si spustit v Privileged módu. Stačí tedy ono volání zabalit do doPrivileged() a máme vystaráno. Jednoduché, fix na deset minut, který navíc může být potencionálně na více místech, takže za hoďku za dvě může být pořešeno celé JDK.
Jenomže to bychom museli být někde jinde. Buga číslo 6203567 byla reportována v 03-DEC-2004 a podle všeho ještě pořád není fixnutá! A to je u reportu jednoduchý kód na její reprodukci včetně patche. Navíc bylo od Sunu před třemi lety získáno prohlášení, že to bude v tehdy příští verzi opraveno. Nevím, ale fixnutí by zabralo méně času než vydání onoho prohlášení :-)
Schválně si na vašem JREčku vyzkoušejte, jestli vám projde! Já dostal:

tapik@bilbo:~> java -version
java version "1.6.0_05"
Java(TM) SE Runtime Environment (build 1.6.0_05-b13)
Java HotSpot(TM) Server VM (build 10.0-b19, mixed mode)
tapik@bilbo:~> appletviewer CorbaTest.html
Exception in thread "Thread-2" java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThread)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at sun.applet.AppletSecurity.checkAccess(AppletSecurity.java:214)
at java.lang.Thread.checkAccess(Thread.java:1263)
at java.lang.Thread.setName(Thread.java:1050)
at com.sun.corba.se.impl.transport.SelectorImpl.run(SelectorImpl.java:239)

Žádné komentáře: