RFR: 8185529: JCK api/java_lang/Object/WaitTests failed with jdk10/hs nightly
Daniel D. Daugherty
daniel.daugherty at oracle.com
Fri Oct 6 13:58:01 UTC 2017
Thumbs up!
Dan
On 10/5/17 10:47 PM, David Holmes wrote:
> Bug is not public - sorry.
>
> webrev: http://cr.openjdk.java.net/~dholmes/8185529/webrev/
>
> Also patch inline below.
>
> Problem: o.wait(Long.MAX_VALUE) returns immediately
>
> Cause: arithmetic overflow gives a time in the past so the timeout
> expires immediately
>
> This was introduced by the fix for:
>
> https://bugs.openjdk.java.net/browse/JDK-8174231 "Factor out and share
> PlatformEvent and Parker code for POSIX systems."
>
> while we go to great lengths to ensure we avoid overflows inside the
> time calculation functions, I overlooked the fact that we now first
> convert a millisecond value into nanoseconds, which can overflow.
>
> Fix: limit the millis value to the existing hard limit of
> MAX_SECS*MILLIUNITS ms. That can not overflow when converted to nanos.
>
> Thanks,
> David
> -----
>
> --- old/src/hotspot/os/posix/os_posix.cpp 2017-10-06
> 00:34:31.595159338 -0400
> +++ new/src/hotspot/os/posix/os_posix.cpp 2017-10-06
> 00:34:29.443037883 -0400
> @@ -1770,6 +1770,12 @@
>
> if (v == 0) { // Do this the hard way by blocking ...
> struct timespec abst;
> + // We have to watch for overflow when converting millis to nanos,
> + // but if millis is that large then we will end up limiting to
> + // MAX_SECS anyway, so just do that here.
> + if (millis / MILLIUNITS > MAX_SECS) {
> + millis = jlong(MAX_SECS) * MILLIUNITS;
> + }
> to_abstime(&abst, millis * (NANOUNITS / MILLIUNITS), false);
More information about the hotspot-runtime-dev
mailing list