# HG changeset patch # User henryjen # Date 1467951324 25200 # Thu Jul 07 21:15:24 2016 -0700 # Node ID 3a3a9ecef6330776cc38c8e29a1cd070d42d339d # Parent cf7e30f5c03f046b2b8a85d60735cd045cef0735 8132379: -J options can cause crash or "Warning: app args parsing error passing arguments as-is" Reviewed-by: diff --git a/src/java.base/share/native/libjli/args.c b/src/java.base/share/native/libjli/args.c --- a/src/java.base/share/native/libjli/args.c +++ b/src/java.base/share/native/libjli/args.c @@ -130,7 +130,7 @@ expectingNoDashArg = JNI_FALSE; } // only update on java mode and not yet found main class - if (firstAppArgIndex == -1 && idx != 0) { + if (firstAppArgIndex == NOT_FOUND && idx != 0) { firstAppArgIndex = (int) idx; } } diff --git a/src/java.base/windows/native/libjli/java_md.c b/src/java.base/windows/native/libjli/java_md.c --- a/src/java.base/windows/native/libjli/java_md.c +++ b/src/java.base/windows/native/libjli/java_md.c @@ -943,26 +943,6 @@ return JNI_FALSE; } -int -filterArgs(StdArg *stdargs, const int nargc, StdArg **pargv) { - StdArg* argv = NULL; - int nargs = 0; - int i; - - /* Copy the non-vm args */ - for (i = 0; i < nargc ; i++) { - const char *arg = stdargs[i].arg; - if (arg[0] == '-' && arg[1] == 'J') - continue; - argv = (StdArg*) JLI_MemRealloc(argv, (nargs+1) * sizeof(StdArg)); - argv[nargs].arg = JLI_StringDup(arg); - argv[nargs].has_wildcard = stdargs[i].has_wildcard; - nargs++; - } - *pargv = argv; - return nargs; -} - /* * At this point we have the arguments to the application, and we need to * check with original stdargs in order to compare which of these truly @@ -975,12 +955,13 @@ int i, j, idx; size_t tlen; jobjectArray outArray, inArray; - char *ostart, *astart, **nargv; + char *arg, **nargv; jboolean needs_expansion = JNI_FALSE; jmethodID mid; - int filteredargc, stdargc; + int stdargc; StdArg *stdargs; - StdArg *filteredargs; + int *appArgIdx; + int isTool; jclass cls = GetLauncherHelperClass(env); NULL_CHECK0(cls); @@ -991,8 +972,6 @@ stdargs = JLI_GetStdArgs(); stdargc = JLI_GetStdArgc(); - filteredargc = filterArgs(stdargs, stdargc, &filteredargs); - // sanity check, this should never happen if (argc > stdargc) { JLI_TraceLauncher("Warning: app args is larger than the original, %d %d\n", argc, stdargc); @@ -1001,22 +980,35 @@ } // sanity check, match the args we have, to the holy grail - idx = filteredargc - argc; - ostart = filteredargs[idx].arg; - astart = strv[0]; - // sanity check, ensure that the first argument of the arrays are the same - if (JLI_StrCmp(ostart, astart) != 0) { - // some thing is amiss the args don't match - JLI_TraceLauncher("Warning: app args parsing error\n"); - JLI_TraceLauncher("passing arguments as-is\n"); + idx = JLI_GetAppArgIndex(); + isTool = (idx == 0); + if (isTool) { idx++; } // skip tool name + JLI_TraceLauncher("AppArgIndex: %d points to %s\n", idx, stdargs[idx].arg); + + appArgIdx = calloc(argc, sizeof(int)); + for (i = idx, j = 0; i < stdargc; i++) { + if (isTool) { // filter -J used by tools to pass JVM options + arg = stdargs[i].arg; + if (arg[0] == '-' && arg[1] == 'J') { + continue; + } + } + appArgIdx[j++] = i; + } + // sanity check, ensure same number of arguments for application + if (j != argc) { + JLI_TraceLauncher("Warning: app args count doesn't match, %d %d\n", j, argc); + JLI_TraceLauncher("passing arguments as-is.\n"); + JLI_MemFree(appArgIdx); return NewPlatformStringArray(env, strv, argc); } // make a copy of the args which will be expanded in java if required. nargv = (char **)JLI_MemAlloc(argc * sizeof(char*)); - for (i = 0, j = idx; i < argc; i++, j++) { - jboolean arg_expand = (JLI_StrCmp(filteredargs[j].arg, strv[i]) == 0) - ? filteredargs[j].has_wildcard + for (i = 0; i < argc; i++) { + j = appArgIdx[i]; + jboolean arg_expand = (JLI_StrCmp(stdargs[j].arg, strv[i]) == 0) + ? stdargs[j].has_wildcard : JNI_FALSE; if (needs_expansion == JNI_FALSE) needs_expansion = arg_expand; @@ -1039,6 +1031,7 @@ JLI_MemFree(nargv[i]); } JLI_MemFree(nargv); + JLI_MemFree(appArgIdx); return NewPlatformStringArray(env, strv, argc); } NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls, @@ -1053,6 +1046,6 @@ JLI_MemFree(nargv[i]); } JLI_MemFree(nargv); - JLI_MemFree(filteredargs); + JLI_MemFree(appArgIdx); return outArray; } diff --git a/test/tools/launcher/Arrrghs.java b/test/tools/launcher/Arrrghs.java --- a/test/tools/launcher/Arrrghs.java +++ b/test/tools/launcher/Arrrghs.java @@ -24,7 +24,7 @@ /** * @test * @bug 5030233 6214916 6356475 6571029 6684582 6742159 4459600 6758881 6753938 - * 6894719 6968053 7151434 7146424 8007333 8077822 8143640 + * 6894719 6968053 7151434 7146424 8007333 8077822 8143640 8132379 * @summary Argument parsing validation. * @compile -XDignore.symbol.file Arrrghs.java * @run main/othervm Arrrghs @@ -383,6 +383,12 @@ checkArgumentWildcard("empty\\*?", "empty\\*?"); checkArgumentWildcard("empty\\?*", "empty\\?*"); + // 8132379: java should not filter out -J options for application + String[] args = { "-J-one", "-Jtwo", "lib\\???.java", "-J-Dsomething", + "a", "-J-Dlast.arg" }; + String[] expected = { "-J-one", "-Jtwo", "lib\\Fbo.java", + "lib\\Foo.java", "-J-Dsomething", "a", "-J-Dlast.arg" }; + checkArgumentWildcard(args, expected); } void doArgumentCheck(String inArgs, String... expArgs) {