8172309: classpath wildcards code does not support --class-path

Reviewed-by: ksrini
This commit is contained in:
Henry Jen 2017-01-27 13:10:27 -08:00
parent 812616397c
commit 265c58cb16
3 changed files with 46 additions and 15 deletions

View File

@ -1566,6 +1566,31 @@ GetApplicationClass(JNIEnv *env)
return (*env)->CallStaticObjectMethod(env, cls, mid);
}
static char* expandWildcardOnLongOpt(char* arg) {
char *p, *value;
size_t optLen, valueLen;
p = JLI_StrChr(arg, '=');
if (p == NULL || p[1] == '\0') {
JLI_ReportErrorMessage(ARG_ERROR1, arg);
exit(1);
}
p++;
value = (char *) JLI_WildcardExpandClasspath(p);
if (p == value) {
// no wildcard
return arg;
}
optLen = p - arg;
valueLen = JLI_StrLen(value);
p = JLI_MemAlloc(optLen + valueLen + 1);
memcpy(p, arg, optLen);
memcpy(p + optLen, value, valueLen);
p[optLen + valueLen + 1] = '\0';
return p;
}
/*
* For tools, convert command line args thus:
* javac -cp foo:foo/"*" -J-ms32m ...
@ -1616,14 +1641,17 @@ TranslateApplicationArgs(int jargc, const char **jargv, int *pargc, char ***parg
if (arg[0] == '-') {
if (arg[1] == 'J')
continue;
if (IsWildCardEnabled() && arg[1] == 'c'
&& (JLI_StrCmp(arg, "-cp") == 0 ||
JLI_StrCmp(arg, "-classpath") == 0)
&& i < argc - 1) {
*nargv++ = arg;
*nargv++ = (char *) JLI_WildcardExpandClasspath(argv[i+1]);
i++;
continue;
if (IsWildCardEnabled()) {
if (IsClassPathOption(arg) && i < argc - 1) {
*nargv++ = arg;
*nargv++ = (char *) JLI_WildcardExpandClasspath(argv[i+1]);
i++;
continue;
}
if (JLI_StrCCmp(arg, "--class-path=") == 0) {
*nargv++ = expandWildcardOnLongOpt(arg);
continue;
}
}
}
*nargv++ = arg;

View File

@ -272,14 +272,16 @@ isWildcard(const char *filename)
(! exists(filename));
}
static void
static int
FileList_expandWildcards(JLI_List fl)
{
size_t i, j;
int expandedCnt = 0;
for (i = 0; i < fl->size; i++) {
if (isWildcard(fl->elements[i])) {
JLI_List expanded = wildcardFileList(fl->elements[i]);
if (expanded != NULL && expanded->size > 0) {
expandedCnt++;
JLI_MemFree(fl->elements[i]);
JLI_List_ensureCapacity(fl, fl->size + expanded->size);
for (j = fl->size - 1; j >= i+1; j--)
@ -294,19 +296,20 @@ FileList_expandWildcards(JLI_List fl)
JLI_List_free(expanded);
}
}
return expandedCnt;
}
const char *
JLI_WildcardExpandClasspath(const char *classpath)
{
char *expanded;
const char *expanded;
JLI_List fl;
if (JLI_StrChr(classpath, '*') == NULL)
return classpath;
fl = JLI_List_split(classpath, PATH_SEPARATOR);
FileList_expandWildcards(fl);
expanded = JLI_List_join(fl, PATH_SEPARATOR);
expanded = FileList_expandWildcards(fl) ?
JLI_List_join(fl, PATH_SEPARATOR) : classpath;
JLI_List_free(fl);
if (getenv(JLDEBUG_ENV_ENTRY) != 0)
printf("Expanded wildcards:\n"

View File

@ -125,7 +125,7 @@ ExecJava() {
CheckFail TestA
rm -f TestB${OUTEXT}
$JAVA${variant} -classpath JarDir/"*"$NOOP TestB || exit 1
$JAVA${variant} -cp JarDir/"*"$NOOP TestB || exit 1
CheckFail TestB
@ -134,11 +134,11 @@ ExecJava() {
cp TestD/*.class JarDir
rm -f TestC${OUTEXT}
$JAVA${variant} -classpath JarDir${PATHSEP}JarDir/"*"$NOOP TestC || exit 1
$JAVA${variant} --class-path JarDir${PATHSEP}JarDir/"*"$NOOP TestC || exit 1
CheckFail TestC
rm -f TestD${OUTEXT}
$JAVA${variant} -classpath JarDir${PATHSEP}JarDir/"*"$NOOP TestD || exit 1
$JAVA${variant} --class-path=JarDir${PATHSEP}JarDir/"*"$NOOP TestD || exit 1
CheckFail TestD
}