jdk9/10 reject zip/jar files where seconds value of timestamp is out of supported range 0 - 59

Xueming Shen xueming.shen at oracle.com
Fri Oct 6 14:55:05 UTC 2017


https://bugs.openjdk.java.net/browse/JDK-8188869

really wanted to suggest to just unzip/jar & jar those jar files again, 
as a workaround ...

-sherman

On 10/6/17, 7:02 AM, Claes Redestad wrote:
> Hi,
>
> it appears this is a difference where java.util.Date is carrying the 
> overflow(s), while the
> java.time-based implementation is more strict.  Same issue assumedly 
> exist for most
> fields in the dos format (minutes can be 0-63, hours 0-31, days 0-31...).
>
> The dosToJavaTime implementation was changed to use java.time mostly 
> as a cleanup
> (https://bugs.openjdk.java.net/browse/JDK-8066644), but this 
> difference in strictness was
> overlooked..
>
> Most compelling option for now might be to revert to the code in 8:
>
>     public static long dosToJavaTime8(long dtime) {
>         @SuppressWarnings("deprecation") // Use of date constructor.
>         Date d = new Date((int)(((dtime >> 25) & 0x7f) + 80),
>                           (int)(((dtime >> 21) & 0x0f) - 1),
>                           (int)((dtime >> 16) & 0x1f),
>                           (int)((dtime >> 11) & 0x1f),
>                           (int)((dtime >> 5) & 0x3f),
>                           (int)((dtime << 1) & 0x3e));
>         return d.getTime();
>     }
>
> /Claes
>
> On 2017-10-06 14:24, Baesken, Matthias wrote:
>> Hello,
>>
>> When iterating on the zip entries (and printing the time stamps)  of 
>> an old  sqljdbc.jar    the exception
>>
>> "java.time.DateTimeException: Invalid value for SecondOfMinute (valid 
>> values 0 - 59): 60"
>> occured (issue has been seen on Windows).
>>
>> Looks like the  dosToJavaTime function in  ZipUtils.java  of 
>> jdk9/jdk10 is a bit more "sensitive"
>> about the input it gets, compared to jdk8.
>> In both implementations :
>>
>> java.base/share/classes/java/util/zip/ZipUtils.java
>> jdk.zipfs/share/classes/jdk/nio/zipfs/ZipUtils.java
>>
>>
>> the computation of the "seconds" values is done by
>>
>> public static long dosToJavaTime(long dtime) {
>> ...
>> (int) ((dtime << 1) & 0x3e));
>> ...
>> }
>>
>> 0x3e is  binary 111110 or  decimal 62,  so larger values than the 
>> supported maximum 59 can occur
>> (maybe only with old/problematic archives but still we had such an 
>> example).
>>
>> When looking a bit more closely into it, we found that the "second = 
>> 60" value  was coming from a  long value  930973758
>> that was passed to  ZipUtils.dosToJavaTime as  dtime argument.
>>
>> (found this out by adding an enhanced chained exception to jdk9 
>> showing the dtime value passed to dosToJavaTime).
>>
>> Here is an example of the iteration on entries of such a "bad" zip 
>> file :
>>
>> C:\JVM\openjdk10\bin\java  ZipIterate
>>
>> Iterate von ZipFile:
>> --------------------------------------
>> name of 
>> ZipEntry:com/microsoft/sqlserver/jdbc/AppDTVImpl$SetValueOp.class
>> Exception in thread "main" java.time.DateTimeException: Invalid value 
>> for SecondOfMinute (valid values 0 - 59): 60
>>          at 
>> java.base/java.time.temporal.ValueRange.checkValidValue(ValueRange.java:311)
>>          at 
>> java.base/java.time.temporal.ChronoField.checkValidValue(ChronoField.java:714)
>>          at java.base/java.time.LocalTime.of(LocalTime.java:322)
>>          at java.base/java.time.LocalDateTime.of(LocalDateTime.java:337)
>>          at 
>> java.base/java.util.zip.ZipUtils.dosToJavaTime(ZipUtils.java:101)
>>          at 
>> java.base/java.util.zip.ZipUtils.extendedDosToJavaTime(ZipUtils.java:114)
>>          at java.base/java.util.zip.ZipEntry.getTime(ZipEntry.java:198)
>>          at ZipIterate.main(ZipIterate.java:37)
>>
>>
>>
>> A similar problem (dealing with days/months not seconds out of 
>> supported range) is described here :
>> https://bugs.openjdk.java.net/browse/JDK-8184940
>> "JDK 9 rejects zip files where the modified day or month is 0"
>>
>>
>> Compared to jdk8,  this is a regression so I think it would be good 
>> to have a better handling of problematic out of range seconds-values.
>>
>> Do you think it would be sufficient to adjust the out of range 
>> seconds to the supported max-value 59 ?
>> Or is something more sophisticated prefered ?
>> I found the enhanced chained exception showing the  dtime long values 
>> helpful too, should I submit it ?
>>
>> Best regards,
>>              Matthias
>



More information about the core-libs-dev mailing list