8132379: -J options can cause crash or "Warning: app args parsing error passing arguments as-is"
Reviewed-by: ksrini
This commit is contained in:
parent
c748cd54ac
commit
d996c5d95f
@ -130,7 +130,7 @@ static void checkArg(const char *arg) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -943,26 +943,6 @@ ProcessPlatformOption(const char *arg)
|
||||
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 @@ CreateApplicationArgs(JNIEnv *env, char **strv, int argc)
|
||||
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 @@ CreateApplicationArgs(JNIEnv *env, char **strv, int argc)
|
||||
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 @@ CreateApplicationArgs(JNIEnv *env, char **strv, int argc)
|
||||
}
|
||||
|
||||
// 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 @@ CreateApplicationArgs(JNIEnv *env, char **strv, int argc)
|
||||
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 @@ CreateApplicationArgs(JNIEnv *env, char **strv, int argc)
|
||||
JLI_MemFree(nargv[i]);
|
||||
}
|
||||
JLI_MemFree(nargv);
|
||||
JLI_MemFree(filteredargs);
|
||||
JLI_MemFree(appArgIdx);
|
||||
return outArray;
|
||||
}
|
||||
|
@ -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 @@ public class Arrrghs extends TestHelper {
|
||||
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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user