Hi, I recently came across a bug in the java executable with an argfile that's larger than 4096 bytes, if a 4096-byte-chunk ends in a comment line. One bug happens when the last character of a comment line is the 4096th byte and the trailing newline is the first byte in the next chunk. In that case, nextToken() in src/java.base/share/native/libjli/args.c calls JLI_List_addSubstring (in the if-block at the end of nextToken()) with the contents of the current comment line. The next "valid" option gets appended to that comment line and java errors out. I've added some debugging output to the last if-block and pctx- >state==FIND_NEXT and the the substring being added is the comment line. I've also tried and changed this line http://hg.openjdk.java.net/jdk-updates/jdk11u/annotate/20e49753c388/src/java.base/share/native/libjli/args.c#l294 to 'if (anchor != nextc && pctx->state == IN_TOKEN)' and the argfile is parsed correctly. Steps to reproduce:1. save the attached my-argfile2. run 'java @my- argfile my.className'3. java errors out with Error: Could not find or load main class # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-Dfoo=barCaused by: java.lang.ClassNotFoundException: # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-Dfoo=bar With the above change (the attached patch in argfile-parse-bug.txt), argfile parsing works as expected.Also updated the condition in the loop looking for a comment's newline, as it looks inconsistent to the condition in the loop for FIND_NEXT/SKIP_LEAD_WS and the condition of the outer for-loop. Robert
# 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # 23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # 2345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -Dfoo=bar
diff -r 20e49753c388 src/java.base/share/native/libjli/args.c --- a/src/java.base/share/native/libjli/args.c Wed Mar 04 15:26:22 2020 +0100 +++ b/src/java.base/share/native/libjli/args.c Thu Mar 05 19:57:55 2020 +0100 @@ -216,7 +216,7 @@ } else if (pctx->state == IN_COMMENT) { while (ch != '\n' && ch != '\r') { nextc++; - if (nextc > eob) { + if (nextc >= eob) { return NULL; } ch = *nextc; @@ -291,7 +291,7 @@ } assert(nextc == eob); - if (anchor != nextc) { + if (anchor != nextc && pctx->state == IN_TOKEN) { // not yet return until end of stream, we have part of a token. JLI_List_addSubstring(pctx->parts, anchor, nextc - anchor); }