RFR: 8373448: jpackage: StackOverflowError when processing a very long argument

Alexey Semenyuk asemenyuk at openjdk.org
Fri Jan 9 00:34:49 UTC 2026


On Fri, 9 Jan 2026 00:21:32 GMT, Alexander Matveev <almatvee at openjdk.org> wrote:

>> Replace reluctant quantifier `*?` with the possessive alternative (`*+`) and get rid of back-references from the regexp tokenizing a value of the "--arguments" option into a string array to fix the catastrophic backtracking resulting in a stack overflow.
>> 
>> Old regexp: `(?:(?:(["'])(?:\\\1|.)*?(?:\1|$))|(?:\["'\s]|[^\s]))++`
>> 
>> New regexp `(?:(?:(?:'(?:\'|[^'])*+(?:'|$))|(?:"(?:\"|[^"])*+(?:"|$)))|(?:\["'\s]|\S))++`
>> 
>> Add test cases that pass both the old and the new variants of the regexp, except for the last test case that causes a stack overflow with the old regexp.
>> 
>> The initial intention was to replace the regexp with the tokenizer function. It was abandoned in favor of reworking the regexp to minimize the risk of regressions.
>
> src/jdk.jpackage/share/classes/jdk/jpackage/internal/cli/StandardOption.java line 744:
> 
>> 742: 
>> 743:         static {
>> 744:             System.out.println("OLD: " + pattern);
> 
> Why we need to print old and new pattern? Looks like debug code was not removed.

Oh, the debug output slipped in.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/29104#discussion_r2674369242


More information about the core-libs-dev mailing list