RFR: 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
Stefan Karlsson
stefan.karlsson at oracle.com
Thu Jun 29 11:33:19 UTC 2017
Hi all,
I got a request form Kim to remove the friend macrology in the test.
Here's the update webrevs:
http://cr.openjdk.java.net/~stefank/8178491/webrev.01
http://cr.openjdk.java.net/~stefank/8178491/webrev.01.delta
StefanK
On 2017-06-28 16:05, Stefan Karlsson wrote:
> Hi all,
>
> Please review this patch to fix bugs in the -Xss parsing.
>
> http://cr.openjdk.java.net/~stefank/8178491/webrev.00/
> https://bugs.openjdk.java.net/browse/JDK-8178491
>
> I found this bug while working on an Enhancement to the align functions:
> https://bugs.openjdk.java.net/browse/JDK-8178489
>
> In arguments.cpp we have the following code in the section that
> converts the Xss value to a ThreadStackSize value:
> round_to((int)long_ThreadStackSize, K) / K) != Flag::SUCCESS)
>
> This explicit narrowing cast throws away the upper 32 bits of
> long_ThreadStackSize, the resulting int is then promoted to an
> intptr_t used as a argument to round_to. This causes weird error
> messages and behavior. For example, running:
> java -Xss2147483648 -version
>
> Yields:
> intx ThreadStackSize=18014398507384832 is outside the allowed range [
> 0 ... 9007199254740987 ]
>
> My initial reaction was that this could be solved by simply fixing the
> cast, but further inspection of the code parsing -Xss and
> ThreadStackSize revealed more issues.
>
> Changes in this patch:
>
> 1) Extract the -Xss parsing code into a separate, testable function.
> Unit tests added.
>
> 2) Extended parse_memory_size and check_memory_size, to take the
> maximum input value. Unit tests added.
>
> 3) Provide an upper limit for the values allowed in the call to
> parse_memory_size in the -Xss parsing. The upper limit is calculated
> backwards from the the upper limit of the ThreadStackSize.
>
> 4) The max input value for ThreadStackSize was artificially limited by
> the fact that round_to was used, and that limited values to fit in an
> intptr_t, even though size_t is used when the ThreadStackSize is
> finally expanded into page size aligned bytes. This meant that we had
> an extremly high upper limit, but it wasn't the absolute upper limit.
> I changed this to the absolute upper limit, so that it's easier to
> reason about why this limit was chosen. To make this possible, I
> replaced the usages round_to and round_down, with align_size_up_ and
> align_size_down_ macros. In future patches, when the input parameter
> types of our align functions have been fixed, I'll convert the usages
> of these macros.
>
> 5) More asserts to check for unintended overflows.
>
> IMHO, It's a bit silly to allow this high values for -Xss, and we
> could probably limit it to more practical values. I experimented with
> that, but I found that the code and tests became more unintuitive than
> they already are. So, I'd like to leave that as a future enhancement
> if the maintainers of this code allows it.
>
> Tested with JPRT, TooSmallStackSize.java, and
> TestThreadStackSizes.java. Any suggestions on how to further test this?
>
> Thanks,
> StefanK
More information about the hotspot-runtime-dev
mailing list