Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8301875

java.util.TimeZone.getSystemTimeZoneID uses C library default file mode

XMLWordPrintable

    • b01
    • 17
    • b09
    • x86_64
    • windows_10

      ADDITIONAL SYSTEM INFORMATION :
      Any version of Windows, Java 12 and later. Tested amongst others with Windows 11 22H2 and:
      java version "19.0.2" 2023-01-17
      Java(TM) SE Runtime Environment (build 19.0.2+7-44)
      Java HotSpot(TM) 64-Bit Server VM (build 19.0.2+7-44, mixed mode, sharing)


      A DESCRIPTION OF THE PROBLEM :
      java.util.TimeZone.getSystemTimeZoneID fails with the message:
      Illegal format in tzmappings file: illegal non-newline character found at line 1, offset 46

      This is caused by java.util.TimeZone.getSystemTimeZoneID using the C library open function without specifying a file mode.

      If another native library changes the default file mode from _O_TEXT to _O_BINARY, getSystemTimeZoneID reads the line breaks in tzmappings without translation from \r\n to \n and chokes on the \r.

      Proposed fix: Specify _O_TEXT file mode when opening a file and requiring line break translation!

      REGRESSION : Last worked in version 11

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1. Load a native library that contains _fmode=_O_BINARY;
      2. Invoke java.text.DateFormat.getDateInstance()
      or anything else that triggers loading of tzmappings.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      No error message.
      ACTUAL -
      Error message "Illegal format in tzmappings file: illegal non-newline character found at line 1, offset 46" and JDK uses GMT+1 or GMT+2 instead of Berlin timezone.

      ---------- BEGIN SOURCE ----------
      Java Code:
      public class Test {
      private static native void setFileMode();
        public static void main(String[] args) {
      System.loadLibrary("myNativeLibrary");
      setFileMode();
      java.text.DateFormat.getDateInstance();
      }
      }

      C Code:
      JNIEXPORT void JNICALL Java_Test_setFileMode(JNIEnv *, jclass)
      {
      _fmode=_O_BINARY;
      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Invoke java.text.DateFormat.getDateInstance() to trigger loading of tzmappings before loading native libraray.

      FREQUENCY : always


            naoto Naoto Sato
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: