Java の更新から垣間見える オラクルのソース管理の酷さ
Java 7はサポートが切れて、延長サポートフェーズに入って久しいのですが、
Java SE 7u85から 7u91にアップデートしたときに、結構 Java SE 7 Advanced のドキュメントに書かれていない変更があるようです
その一つが、 TimeZone の参照にレジストリの DisableAutoDaylightTimeSet と DynamicDaylightTimeDisabled の読み込む方法が異なっているということなのですが、
Java 7u85 では DisableAutoDaylightTimeSet を先に読んで、 そのキーが無ければ、DynamicDaylightTimeDisabled は読み込まないという仕様になっています。
一方、Java 7u91 はこの順番が逆になっています。
これだけなら、別に大したことないと思われるかもしれませんが、この変更って実は、Java 8 の同じ世代の変更と同じものなのです、つまり、 Java 8u51 から Java 8u65のアップデートの過程で加えられた仕様の変更が、バグとして、修正報告に上がっていないにもかかわらず、延長サポート中の Java 7 にまで手が加えられてしまってるわけです。
そんな中で面白いバグを見つけました。
SUB_L6DA16B0D: push esi push FFFFFF80h pop esi push SSZ6DA24490_Kernel32_dll call JDK_LoadSystemLibrary pop ecx test eax,eax jz L6DA16B3D push SSZ6DA24470_GetDynamicTimeZoneInformation push eax call [KERNEL32.dll!GetProcAddress] mov ecx,SUB_L6DA16B0D test ecx,ecx jz L6DA16B3D push [esp+08h] call eax mov esi,eax L6DA16B3D: mov eax,esi pop esi retn |
このコードを分かり易くC言語で書いてみましょう
stubGetDynamicTimeZoneInformation(PDYNAMIC_TIME_ZONE_INFORMATION pTimeZoneInformation) { int errorCode = -0x80; FARPROC stubGetDynamicTimeZoneInfo; HINSTANCE hDll = JDK_LoadSystemLibrary("kernel32.dll"); if (hDll == NULL ) { return errorCode; } stubGetDynamicTimeZoneInfo = (FARPROC) GetProcAddress(hDll, "GetDynamicTimeZoneInformation"); if (stubGetDynamicTimeZoneInformation == NULL) { return errorCode; } errorCode = stubGetDynamicTimeZoneInfo(pTimeZoneInformation); return errorCode; } |
評価すべき値を、多分似たような名前を付けた関数本体で評価してしまったため、全く意味のないNULLチェックになってしまってるわけです。
実際この関数が、Java 7 では呼ばれることはないのですが こんないい加減なコードが、Java 7のメンテナンスのバイナリにまで、1年以上前からまぎれこんでしまってるのです。
しかも、今も未修正なまま。
このエラー自体は、定数参照してるわけですから、コンパイラに通せば、Warning メッセージとして、必ず false になる if 文と 警告が出てくるはずなのですが、これを考えると、 オラクルでJava を作っている連中は、 C言語の 警告文は無視しても構わないと考えていると考えることもできます。
|。・ω・) 。o ( こんな人たちが、作っているプラットフォームなのですから、脆弱性が沢山あるのも納得ですね)
Comments