src/java.base/share/native/libjli/java.c

Print this page

        

*** 214,238 **** } AddOption("-Dsun.java.launcher.diag=true", NULL); } /* ! * Make sure the specified version of the JRE is running. * ! * There are three things to note about the SelectVersion() routine: ! * 1) If the version running isn't correct, this routine doesn't ! * return (either the correct version has been exec'd or an error ! * was issued). ! * 2) Argc and Argv in this scope are *not* altered by this routine. ! * It is the responsibility of subsequent code to ignore the ! * arguments handled by this routine. ! * 3) As a side-effect, the variable "main_class" is guaranteed to ! * be set (if it should ever be set). This isn't exactly the ! * poster child for structured programming, but it is a small ! * price to pay for not processing a jar file operand twice. ! * (Note: This side effect has been disabled. See comment on ! * bugid 5030265 below.) */ SelectVersion(argc, argv, &main_class); CreateExecutionEnvironment(&argc, &argv, jrepath, sizeof(jrepath), --- 214,231 ---- } AddOption("-Dsun.java.launcher.diag=true", NULL); } /* ! * SelectVersion() has several responsibilities: * ! * 1) Disallow specification of another JRE. With 1.9, another ! * version of the JRE cannot be invoked. ! * 2) Allow for a JRE version to invoke JDK 1.9 or later. Since ! * all mJRE directives have been stripped from the request but ! * the pre 1.9 JRE [ 1.6 thru 1.8 ], it is as if 1.9+ has been ! * invoked from the command line. */ SelectVersion(argc, argv, &main_class); CreateExecutionEnvironment(&argc, &argv, jrepath, sizeof(jrepath),
*** 827,838 **** */ static void SelectVersion(int argc, char **argv, char **main_class) { char *arg; - char **new_argv; - char **new_argp; char *operand; char *version = NULL; char *jre = NULL; int jarflag = 0; int headlessflag = 0; --- 820,829 ----
*** 847,899 **** /* * If the version has already been selected, set *main_class * with the value passed through the environment (if any) and * simply return. */ if ((env_in = getenv(ENV_ENTRY)) != NULL) { if (*env_in != '\0') *main_class = JLI_StringDup(env_in); return; } /* * Scan through the arguments for options relevant to multiple JRE ! * support. For reference, the command line syntax is defined as: * ! * SYNOPSIS ! * java [options] class [argument...] ! * ! * java [options] -jar file.jar [argument...] ! * ! * As the scan is performed, make a copy of the argument list with ! * the version specification options (new to 1.5) removed, so that ! * a version less than 1.5 can be exec'd. ! * ! * Note that due to the syntax of the native Windows interface ! * CreateProcess(), processing similar to the following exists in ! * the Windows platform specific routine ExecJRE (in java_md.c). ! * Changes here should be reproduced there. */ - new_argv = JLI_MemAlloc((argc + 1) * sizeof(char*)); - new_argv[0] = argv[0]; - new_argp = &new_argv[1]; argc--; argv++; while ((arg = *argv) != 0 && *arg == '-') { if (JLI_StrCCmp(arg, "-version:") == 0) { ! version = arg + 9; } else if (JLI_StrCmp(arg, "-jre-restrict-search") == 0) { ! restrict_search = 1; ! } else if (JLI_StrCmp(arg, "-no-jre-restrict-search") == 0) { ! restrict_search = 0; } else { if (JLI_StrCmp(arg, "-jar") == 0) jarflag = 1; /* deal with "unfortunate" classpath syntax */ if ((JLI_StrCmp(arg, "-classpath") == 0 || JLI_StrCmp(arg, "-cp") == 0) && (argc >= 2)) { - *new_argp++ = arg; argc--; argv++; arg = *argv; } --- 838,886 ---- /* * If the version has already been selected, set *main_class * with the value passed through the environment (if any) and * simply return. */ + + /* + * This environmental variable can be set by mJRE capable JREs + * [ 1.5 thru 1.8 ]. All other aspects of mJRE processing have been + * stripped by those JREs. This environmental variable allows 1.9+ + * JREs to be started by these mJRE capable JREs. + * Note that mJRE directives in the jar manifest file would have been + * ignored for a JRE started by another JRE... + * .. skipped for JRE 1.5 and beyond. + * .. not even checked for pre 1.5. + */ if ((env_in = getenv(ENV_ENTRY)) != NULL) { if (*env_in != '\0') *main_class = JLI_StringDup(env_in); return; } /* * Scan through the arguments for options relevant to multiple JRE ! * support. Multiple JRE support existed in JRE versions 1.5 thru 1.8. * ! * This capability is no longer available with JRE versions 1.9 and later. ! * These command line options are reported as errors. */ argc--; argv++; while ((arg = *argv) != 0 && *arg == '-') { if (JLI_StrCCmp(arg, "-version:") == 0) { ! JLI_ReportErrorMessage(SPC_ERROR1); } else if (JLI_StrCmp(arg, "-jre-restrict-search") == 0) { ! JLI_ReportErrorMessage(SPC_ERROR2); ! } else if (JLI_StrCmp(arg, "-jre-no-restrict-search") == 0) { ! JLI_ReportErrorMessage(SPC_ERROR2); } else { if (JLI_StrCmp(arg, "-jar") == 0) jarflag = 1; /* deal with "unfortunate" classpath syntax */ if ((JLI_StrCmp(arg, "-classpath") == 0 || JLI_StrCmp(arg, "-cp") == 0) && (argc >= 2)) { argc--; argv++; arg = *argv; }
*** 906,929 **** } else if (JLI_StrCCmp(arg, "-Djava.awt.headless=") == 0) { headlessflag = 0; } else if (JLI_StrCCmp(arg, "-splash:") == 0) { splash_file_name = arg+8; } - *new_argp++ = arg; } argc--; argv++; } if (argc <= 0) { /* No operand? Possibly legit with -[full]version */ operand = NULL; } else { argc--; ! *new_argp++ = operand = *argv++; } - while (argc-- > 0) /* Copy over [argument...] */ - *new_argp++ = *argv++; - *new_argp = NULL; /* * If there is a jar file, read the manifest. If the jarfile can't be * read, the manifest can't be read from the jar file, or the manifest * is corrupt, issue the appropriate error messages and exit. --- 893,912 ---- } else if (JLI_StrCCmp(arg, "-Djava.awt.headless=") == 0) { headlessflag = 0; } else if (JLI_StrCCmp(arg, "-splash:") == 0) { splash_file_name = arg+8; } } argc--; argv++; } if (argc <= 0) { /* No operand? Possibly legit with -[full]version */ operand = NULL; } else { argc--; ! operand = *argv++; } /* * If there is a jar file, read the manifest. If the jarfile can't be * read, the manifest can't be read from the jar file, or the manifest * is corrupt, issue the appropriate error messages and exit.
*** 972,1063 **** JLI_StrCpy(splash_jar_entry, SPLASH_JAR_ENV_ENTRY "="); JLI_StrCat(splash_jar_entry, splash_jar_name); putenv(splash_jar_entry); } - /* - * The JRE-Version and JRE-Restrict-Search values (if any) from the - * manifest are overwritten by any specified on the command line. - */ - if (version != NULL) - info.jre_version = version; - if (restrict_search != -1) - info.jre_restrict_search = restrict_search; /* * "Valid" returns (other than unrecoverable errors) follow. Set * main_class as a side-effect of this routine. */ if (info.main_class != NULL) *main_class = JLI_StringDup(info.main_class); - /* - * If no version selection information is found either on the command - * line or in the manifest, simply return. - */ if (info.jre_version == NULL) { JLI_FreeManifest(); - JLI_MemFree(new_argv); return; } - /* - * Check for correct syntax of the version specification (JSR 56). - */ - if (!JLI_ValidVersionString(info.jre_version)) { - JLI_ReportErrorMessage(SPC_ERROR1, info.jre_version); - exit(1); - } - - /* - * Find the appropriate JVM on the system. Just to be as forgiving as - * possible, if the standard algorithms don't locate an appropriate - * jre, check to see if the one running will satisfy the requirements. - * This can happen on systems which haven't been set-up for multiple - * JRE support. - */ - jre = LocateJRE(&info); - JLI_TraceLauncher("JRE-Version = %s, JRE-Restrict-Search = %s Selected = %s\n", - (info.jre_version?info.jre_version:"null"), - (info.jre_restrict_search?"true":"false"), (jre?jre:"null")); - - if (jre == NULL) { - if (JLI_AcceptableRelease(GetFullVersion(), info.jre_version)) { - JLI_FreeManifest(); - JLI_MemFree(new_argv); - return; - } else { - JLI_ReportErrorMessage(CFG_ERROR4, info.jre_version); - exit(1); - } - } - - /* - * If I'm not the chosen one, exec the chosen one. Returning from - * ExecJRE indicates that I am indeed the chosen one. - * - * The private environment variable _JAVA_VERSION_SET is used to - * prevent the chosen one from re-reading the manifest file and - * using the values found within to override the (potential) command - * line flags stripped from argv (because the target may not - * understand them). Passing the MainClass value is an optimization - * to avoid locating, expanding and parsing the manifest extra - * times. - */ - if (info.main_class != NULL) { - if (JLI_StrLen(info.main_class) <= MAXNAMELEN) { - (void)JLI_StrCat(env_entry, info.main_class); - } else { - JLI_ReportErrorMessage(CLS_ERROR5, MAXNAMELEN); - exit(1); - } - } - (void)putenv(env_entry); - ExecJRE(jre, new_argv); - JLI_FreeManifest(); - JLI_MemFree(new_argv); - return; } /* * Parses command line arguments. Returns JNI_FALSE if launcher * should exit without starting vm, returns JNI_TRUE if vm needs --- 955,977 ----
*** 1152,1165 **** } else if (JLI_StrCmp(arg, "-checksource") == 0 || JLI_StrCmp(arg, "-cs") == 0 || JLI_StrCmp(arg, "-noasyncgc") == 0) { /* No longer supported */ JLI_ReportErrorMessage(ARG_WARN, arg); ! } else if (JLI_StrCCmp(arg, "-version:") == 0 || ! JLI_StrCmp(arg, "-no-jre-restrict-search") == 0 || ! JLI_StrCmp(arg, "-jre-restrict-search") == 0 || ! JLI_StrCCmp(arg, "-splash:") == 0) { ; /* Ignore machine independent options already handled */ } else if (ProcessPlatformOption(arg)) { ; /* Processing of platform dependent options */ } else if (RemovableOption(arg)) { ; /* Do not pass option to vm. */ --- 1066,1076 ---- } else if (JLI_StrCmp(arg, "-checksource") == 0 || JLI_StrCmp(arg, "-cs") == 0 || JLI_StrCmp(arg, "-noasyncgc") == 0) { /* No longer supported */ JLI_ReportErrorMessage(ARG_WARN, arg); ! } else if (JLI_StrCCmp(arg, "-splash:") == 0) { ; /* Ignore machine independent options already handled */ } else if (ProcessPlatformOption(arg)) { ; /* Processing of platform dependent options */ } else if (RemovableOption(arg)) { ; /* Do not pass option to vm. */