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 ( こんな人たちが、作っているプラットフォームなのですから、脆弱性が沢山あるのも納得ですね)

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です