--- old/src/java.base/macosx/native/libjli/java_md_macosx.c Sun Dec 7 07:35:24 2014 +++ new/src/java.base/macosx/native/libjli/java_md_macosx.c Sun Dec 7 07:35:24 2014 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,7 +38,6 @@ #include #include "manifest_info.h" -#include "version_comp.h" /* Support Cocoa event loop on the main thread */ #include @@ -104,10 +103,6 @@ * (incoming argv) * | * \|/ - * SelectVersion - * (selects the JRE version, note: not data model) - * | - * \|/ * CreateExecutionEnvironment * (determines desired data model) * | --- old/src/java.base/share/native/libjli/emessages.h Sun Dec 7 07:35:26 2014 +++ new/src/java.base/share/native/libjli/emessages.h Sun Dec 7 07:35:25 2014 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -72,9 +72,6 @@ #define CFG_ERROR8 "Error: missing `%s' JVM at `%s'.\nPlease install or use the JRE or JDK that contains these missing components." #define CFG_ERROR9 "Error: could not determine JVM type." - -#define SPC_ERROR1 "Error: Syntax error in version specification \"%s\"" - #define JRE_ERROR1 "Error: Could not find Java SE Runtime Environment." #define JRE_ERROR2 "Error: This Java instance does not support a %d-bit JVM.\nPlease install the desired version." #define JRE_ERROR3 "Error: Improper value at line %d." @@ -89,6 +86,9 @@ #define JRE_ERROR12 "Error: Exec of %s failed" #define JRE_ERROR13 "Error: String processing operation failed" +#define SPC_ERROR1 "Error: Specifying an alternate JDK/JRE version is no longer supported.\n The use of the flag '-version:' is no longer valid.\n Please download and execute the appropriate version." +#define SPC_ERROR2 "Error: Specifying an alternate JDK/JRE is no longer supported.\n The related flags -jre-restrict-search | -jre-no-restrict-search are also no longer valid." + #define DLL_ERROR1 "Error: dl failure on line %d" #define DLL_ERROR2 "Error: failed %s, because %s" #define DLL_ERROR3 "Error: could not find executable %s" --- old/src/java.base/share/native/libjli/java.c Sun Dec 7 07:35:27 2014 +++ new/src/java.base/share/native/libjli/java.c Sun Dec 7 07:35:27 2014 @@ -216,21 +216,14 @@ } /* - * Make sure the specified version of the JRE is running. + * SelectVersion() has several responsibilities: * - * 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.) + * 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); @@ -829,8 +822,6 @@ SelectVersion(int argc, char **argv, char **main_class) { char *arg; - char **new_argv; - char **new_argp; char *operand; char *version = NULL; char *jre = NULL; @@ -849,6 +840,17 @@ * 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); @@ -857,34 +859,20 @@ /* * Scan through the arguments for options relevant to multiple JRE - * support. For reference, the command line syntax is defined as: + * support. Multiple JRE support existed in JRE versions 1.5 thru 1.8. * - * 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. + * This capability is no longer available with JRE versions 1.9 and later. + * These command line options are reported as errors. */ - 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; + JLI_ReportErrorMessage(SPC_ERROR1); } 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; + 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; @@ -891,7 +879,6 @@ /* 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; @@ -908,7 +895,6 @@ } else if (JLI_StrCCmp(arg, "-splash:") == 0) { splash_file_name = arg+8; } - *new_argp++ = arg; } argc--; argv++; @@ -917,11 +903,8 @@ operand = NULL; } else { argc--; - *new_argp++ = operand = *argv++; + 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 @@ -974,14 +957,6 @@ 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 @@ -990,72 +965,11 @@ 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; } /* @@ -1154,10 +1068,7 @@ 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) { + } else if (JLI_StrCCmp(arg, "-splash:") == 0) { ; /* Ignore machine independent options already handled */ } else if (ProcessPlatformOption(arg)) { ; /* Processing of platform dependent options */ --- old/src/java.base/share/native/libjli/java.h Sun Dec 7 07:35:29 2014 +++ new/src/java.base/share/native/libjli/java.h Sun Dec 7 07:35:28 2014 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,9 +40,7 @@ #include "emessages.h" #include "java_md.h" #include "jli_util.h" - #include "manifest_info.h" -#include "version_comp.h" #include "wildcard.h" #include "splashscreen.h" --- old/src/java.base/share/native/libjli/parse_manifest.c Sun Dec 7 07:35:30 2014 +++ new/src/java.base/share/native/libjli/parse_manifest.c Sun Dec 7 07:35:30 2014 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -588,15 +588,16 @@ } lp = manifest; while ((rc = parse_nv_pair(&lp, &name, &value)) > 0) { - if (JLI_StrCaseCmp(name, "Manifest-Version") == 0) + if (JLI_StrCaseCmp(name, "Manifest-Version") == 0) { info->manifest_version = value; - else if (JLI_StrCaseCmp(name, "Main-Class") == 0) + } else if (JLI_StrCaseCmp(name, "Main-Class") == 0) { info->main_class = value; - else if (JLI_StrCaseCmp(name, "JRE-Version") == 0) - info->jre_version = value; - else if (JLI_StrCaseCmp(name, "JRE-Restrict-Search") == 0) { - if (JLI_StrCaseCmp(value, "true") == 0) - info->jre_restrict_search = 1; + } else if (JLI_StrCaseCmp(name, "JRE-Version") == 0) { + /* + * Manifest specification overridden by command line option + * so we will silently override there with no specification. + */ + info->jre_version = 0; } else if (JLI_StrCaseCmp(name, "Splashscreen-Image") == 0) { info->splashscreen_image_file_name = value; } --- old/src/java.base/unix/native/libjli/java_md.h Sun Dec 7 07:35:32 2014 +++ new/src/java.base/unix/native/libjli/java_md.h Sun Dec 7 07:35:31 2014 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,11 +43,6 @@ #define MAXNAMELEN PATH_MAX #endif -/* - * Common function prototypes and sundries. - */ -char *LocateJRE(manifest_info *info); -void ExecJRE(char *jre, char **argv); int UnsetEnv(char *name); char *FindExecName(char *program); const char *SetExecname(char **argv); --- old/src/java.base/unix/native/libjli/java_md_common.c Sun Dec 7 07:35:33 2014 +++ new/src/java.base/unix/native/libjli/java_md_common.c Sun Dec 7 07:35:33 2014 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -190,200 +190,6 @@ return ((access(buffer, X_OK) == 0) ? 1 : 0); } -/* - * Determine if there is an acceptable JRE in the directory dirname. - * Upon locating the "best" one, return a fully qualified path to - * it. "Best" is defined as the most advanced JRE meeting the - * constraints contained in the manifest_info. If no JRE in this - * directory meets the constraints, return NULL. - * - * Note that we don't check for errors in reading the directory - * (which would be done by checking errno). This is because it - * doesn't matter if we get an error reading the directory, or - * we just don't find anything interesting in the directory. We - * just return NULL in either case. - * - * The historical names of j2sdk and j2re were changed to jdk and - * jre respecively as part of the 1.5 rebranding effort. Since the - * former names are legacy on Linux, they must be recognized for - * all time. Fortunately, this is a minor cost. - */ -static char -*ProcessDir(manifest_info *info, char *dirname) -{ - DIR *dirp; - struct dirent *dp; - char *best = NULL; - int offset; - int best_offset = 0; - char *ret_str = NULL; - char buffer[PATH_MAX]; - - if ((dirp = opendir(dirname)) == NULL) - return (NULL); - - do { - if ((dp = readdir(dirp)) != NULL) { - offset = 0; - if ((JLI_StrNCmp(dp->d_name, "jre", 3) == 0) || - (JLI_StrNCmp(dp->d_name, "jdk", 3) == 0)) - offset = 3; - else if (JLI_StrNCmp(dp->d_name, "j2re", 4) == 0) - offset = 4; - else if (JLI_StrNCmp(dp->d_name, "j2sdk", 5) == 0) - offset = 5; - if (offset > 0) { - if ((JLI_AcceptableRelease(dp->d_name + offset, - info->jre_version)) && CheckSanity(dirname, dp->d_name)) - if ((best == NULL) || (JLI_ExactVersionId( - dp->d_name + offset, best + best_offset) > 0)) { - if (best != NULL) - JLI_MemFree(best); - best = JLI_StringDup(dp->d_name); - best_offset = offset; - } - } - } - } while (dp != NULL); - (void) closedir(dirp); - if (best == NULL) - return (NULL); - else { - ret_str = JLI_MemAlloc(JLI_StrLen(dirname) + JLI_StrLen(best) + 2); - sprintf(ret_str, "%s/%s", dirname, best); - JLI_MemFree(best); - return (ret_str); - } -} - -/* - * This is the global entry point. It examines the host for the optimal - * JRE to be used by scanning a set of directories. The set of directories - * is platform dependent and can be overridden by the environment - * variable JAVA_VERSION_PATH. - * - * This routine itself simply determines the set of appropriate - * directories before passing control onto ProcessDir(). - */ -char* -LocateJRE(manifest_info* info) -{ - char *path; - char *home; - char *target = NULL; - char *dp; - char *cp; - - /* - * Start by getting JAVA_VERSION_PATH - */ - if (info->jre_restrict_search) { - path = JLI_StringDup(system_dir); - } else if ((path = getenv("JAVA_VERSION_PATH")) != NULL) { - path = JLI_StringDup(path); - } else { - if ((home = getenv("HOME")) != NULL) { - path = (char *)JLI_MemAlloc(JLI_StrLen(home) + \ - JLI_StrLen(system_dir) + JLI_StrLen(user_dir) + 2); - sprintf(path, "%s%s:%s", home, user_dir, system_dir); - } else { - path = JLI_StringDup(system_dir); - } - } - - /* - * Step through each directory on the path. Terminate the scan with - * the first directory with an acceptable JRE. - */ - cp = dp = path; - while (dp != NULL) { - cp = JLI_StrChr(dp, (int)':'); - if (cp != NULL) - *cp = '\0'; - if ((target = ProcessDir(info, dp)) != NULL) - break; - dp = cp; - if (dp != NULL) - dp++; - } - JLI_MemFree(path); - return (target); -} - -/* - * Given a path to a jre to execute, this routine checks if this process - * is indeed that jre. If not, it exec's that jre. - * - * We want to actually check the paths rather than just the version string - * built into the executable, so that given version specification (and - * JAVA_VERSION_PATH) will yield the exact same Java environment, regardless - * of the version of the arbitrary launcher we start with. - */ -void -ExecJRE(char *jre, char **argv) -{ - char wanted[PATH_MAX]; - const char* progname = GetProgramName(); - const char* execname = NULL; - - /* - * Resolve the real path to the directory containing the selected JRE. - */ - if (realpath(jre, wanted) == NULL) { - JLI_ReportErrorMessage(JRE_ERROR9, jre); - exit(1); - } - - /* - * Resolve the real path to the currently running launcher. - */ - SetExecname(argv); - execname = GetExecName(); - if (execname == NULL) { - JLI_ReportErrorMessage(JRE_ERROR10); - exit(1); - } - - /* - * If the path to the selected JRE directory is a match to the initial - * portion of the path to the currently executing JRE, we have a winner! - * If so, just return. - */ - if (JLI_StrNCmp(wanted, execname, JLI_StrLen(wanted)) == 0) - return; /* I am the droid you were looking for */ - - - /* - * This should never happen (because of the selection code in SelectJRE), - * but check for "impossibly" long path names just because buffer overruns - * can be so deadly. - */ - if (JLI_StrLen(wanted) + JLI_StrLen(progname) + 6 > PATH_MAX) { - JLI_ReportErrorMessage(JRE_ERROR11); - exit(1); - } - - /* - * Construct the path and exec it. - */ - (void)JLI_StrCat(JLI_StrCat(wanted, "/bin/"), progname); - argv[0] = JLI_StringDup(progname); - if (JLI_IsTraceLauncher()) { - int i; - printf("ReExec Command: %s (%s)\n", wanted, argv[0]); - printf("ReExec Args:"); - for (i = 1; argv[i] != NULL; i++) - printf(" %s", argv[i]); - printf("\n"); - } - JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n"); - (void)fflush(stdout); - (void)fflush(stderr); - execv(wanted, argv); - JLI_ReportErrorMessageSys(JRE_ERROR12, wanted); - exit(1); -} - /* * "Borrowed" from Solaris 10 where the unsetenv() function is being added * to libc thanks to SUSv3 (Standard Unix Specification, version 3). As --- old/src/java.base/unix/native/libjli/java_md_solinux.c Sun Dec 7 07:35:34 2014 +++ new/src/java.base/unix/native/libjli/java_md_solinux.c Sun Dec 7 07:35:34 2014 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,6 @@ #include #include #include "manifest_info.h" -#include "version_comp.h" #define JVM_DLL "libjvm.so" @@ -100,10 +99,6 @@ * (incoming argv) * | * \|/ - * SelectVersion - * (selects the JRE version, note: not data model) - * | - * \|/ * CreateExecutionEnvironment * (determines desired data model) * | --- old/src/java.base/windows/native/libjli/java_md.c Sun Dec 7 07:35:36 2014 +++ new/src/java.base/windows/native/libjli/java_md.c Sun Dec 7 07:35:36 2014 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,6 @@ #include #include "java.h" -#include "version_comp.h" #define JVM_DLL "jvm.dll" #define JAVA_DLL "java.dll" @@ -674,420 +673,6 @@ return (GetErgoPolicy() == ALWAYS_SERVER_CLASS) ? JNI_TRUE : JNI_FALSE; } -/* - * Determine if there is an acceptable JRE in the registry directory top_key. - * Upon locating the "best" one, return a fully qualified path to it. - * "Best" is defined as the most advanced JRE meeting the constraints - * contained in the manifest_info. If no JRE in this directory meets the - * constraints, return NULL. - * - * It doesn't matter if we get an error reading the registry, or we just - * don't find anything interesting in the directory. We just return NULL - * in either case. - */ -static char * -ProcessDir(manifest_info* info, HKEY top_key) { - DWORD index = 0; - HKEY ver_key; - char name[MAXNAMELEN]; - int len; - char *best = NULL; - - /* - * Enumerate "/SOFTWARE/JavaSoft/Java Runtime Environment" - * searching for the best available version. - */ - while (RegEnumKey(top_key, index, name, MAXNAMELEN) == ERROR_SUCCESS) { - index++; - if (JLI_AcceptableRelease(name, info->jre_version)) - if ((best == NULL) || (JLI_ExactVersionId(name, best) > 0)) { - if (best != NULL) - JLI_MemFree(best); - best = JLI_StringDup(name); - } - } - - /* - * Extract "JavaHome" from the "best" registry directory and return - * that path. If no appropriate version was located, or there is an - * error in extracting the "JavaHome" string, return null. - */ - if (best == NULL) - return (NULL); - else { - if (RegOpenKeyEx(top_key, best, 0, KEY_READ, &ver_key) - != ERROR_SUCCESS) { - JLI_MemFree(best); - if (ver_key != NULL) - RegCloseKey(ver_key); - return (NULL); - } - JLI_MemFree(best); - len = MAXNAMELEN; - if (RegQueryValueEx(ver_key, "JavaHome", NULL, NULL, (LPBYTE)name, &len) - != ERROR_SUCCESS) { - if (ver_key != NULL) - RegCloseKey(ver_key); - return (NULL); - } - if (ver_key != NULL) - RegCloseKey(ver_key); - return (JLI_StringDup(name)); - } -} - -/* - * This is the global entry point. It examines the host for the optimal - * JRE to be used by scanning a set of registry entries. This set of entries - * is hardwired on Windows as "Software\JavaSoft\Java Runtime Environment" - * under the set of roots "{ HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE }". - * - * This routine simply opens each of these registry directories before passing - * control onto ProcessDir(). - */ -char * -LocateJRE(manifest_info* info) { - HKEY key = NULL; - char *path; - int key_index; - HKEY root_keys[2] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE }; - - for (key_index = 0; key_index <= 1; key_index++) { - if (RegOpenKeyEx(root_keys[key_index], JRE_KEY, 0, KEY_READ, &key) - == ERROR_SUCCESS) - if ((path = ProcessDir(info, key)) != NULL) { - if (key != NULL) - RegCloseKey(key); - return (path); - } - if (key != NULL) - RegCloseKey(key); - } - return NULL; -} - -/* - * Local helper routine to isolate a single token (option or argument) - * from the command line. - * - * This routine accepts a pointer to a character pointer. The first - * token (as defined by MSDN command-line argument syntax) is isolated - * from that string. - * - * Upon return, the input character pointer pointed to by the parameter s - * is updated to point to the remainding, unscanned, portion of the string, - * or to a null character if the entire string has been consummed. - * - * This function returns a pointer to a null-terminated string which - * contains the isolated first token, or to the null character if no - * token could be isolated. - * - * Note the side effect of modifying the input string s by the insertion - * of a null character, making it two strings. - * - * See "Parsing C Command-Line Arguments" in the MSDN Library for the - * parsing rule details. The rule summary from that specification is: - * - * * Arguments are delimited by white space, which is either a space or a tab. - * - * * A string surrounded by double quotation marks is interpreted as a single - * argument, regardless of white space contained within. A quoted string can - * be embedded in an argument. Note that the caret (^) is not recognized as - * an escape character or delimiter. - * - * * A double quotation mark preceded by a backslash, \", is interpreted as a - * literal double quotation mark ("). - * - * * Backslashes are interpreted literally, unless they immediately precede a - * double quotation mark. - * - * * If an even number of backslashes is followed by a double quotation mark, - * then one backslash (\) is placed in the argv array for every pair of - * backslashes (\\), and the double quotation mark (") is interpreted as a - * string delimiter. - * - * * If an odd number of backslashes is followed by a double quotation mark, - * then one backslash (\) is placed in the argv array for every pair of - * backslashes (\\) and the double quotation mark is interpreted as an - * escape sequence by the remaining backslash, causing a literal double - * quotation mark (") to be placed in argv. - */ -static char* -nextarg(char** s) { - char *p = *s; - char *head; - int slashes = 0; - int inquote = 0; - - /* - * Strip leading whitespace, which MSDN defines as only space or tab. - * (Hence, no locale specific "isspace" here.) - */ - while (*p != (char)0 && (*p == ' ' || *p == '\t')) - p++; - head = p; /* Save the start of the token to return */ - - /* - * Isolate a token from the command line. - */ - while (*p != (char)0 && (inquote || !(*p == ' ' || *p == '\t'))) { - if (*p == '\\' && *(p+1) == '"' && slashes % 2 == 0) - p++; - else if (*p == '"') - inquote = !inquote; - slashes = (*p++ == '\\') ? slashes + 1 : 0; - } - - /* - * If the token isolated isn't already terminated in a "char zero", - * then replace the whitespace character with one and move to the - * next character. - */ - if (*p != (char)0) - *p++ = (char)0; - - /* - * Update the parameter to point to the head of the remaining string - * reflecting the command line and return a pointer to the leading - * token which was isolated from the command line. - */ - *s = p; - return (head); -} - -/* - * Local helper routine to return a string equivalent to the input string - * s, but with quotes removed so the result is a string as would be found - * in argv[]. The returned string should be freed by a call to JLI_MemFree(). - * - * The rules for quoting (and escaped quotes) are: - * - * 1 A double quotation mark preceded by a backslash, \", is interpreted as a - * literal double quotation mark ("). - * - * 2 Backslashes are interpreted literally, unless they immediately precede a - * double quotation mark. - * - * 3 If an even number of backslashes is followed by a double quotation mark, - * then one backslash (\) is placed in the argv array for every pair of - * backslashes (\\), and the double quotation mark (") is interpreted as a - * string delimiter. - * - * 4 If an odd number of backslashes is followed by a double quotation mark, - * then one backslash (\) is placed in the argv array for every pair of - * backslashes (\\) and the double quotation mark is interpreted as an - * escape sequence by the remaining backslash, causing a literal double - * quotation mark (") to be placed in argv. - */ -static char* -unquote(const char *s) { - const char *p = s; /* Pointer to the tail of the original string */ - char *un = (char*)JLI_MemAlloc(JLI_StrLen(s) + 1); /* Ptr to unquoted string */ - char *pun = un; /* Pointer to the tail of the unquoted string */ - - while (*p != '\0') { - if (*p == '"') { - p++; - } else if (*p == '\\') { - const char *q = p + JLI_StrSpn(p,"\\"); - if (*q == '"') - do { - *pun++ = '\\'; - p += 2; - } while (*p == '\\' && p < q); - else - while (p < q) - *pun++ = *p++; - } else { - *pun++ = *p++; - } - } - *pun = '\0'; - return un; -} - -/* - * Given a path to a jre to execute, this routine checks if this process - * is indeed that jre. If not, it exec's that jre. - * - * We want to actually check the paths rather than just the version string - * built into the executable, so that given version specification will yield - * the exact same Java environment, regardless of the version of the arbitrary - * launcher we start with. - */ -void -ExecJRE(char *jre, char **argv) { - jint len; - char path[MAXPATHLEN + 1]; - - const char *progname = GetProgramName(); - - /* - * Resolve the real path to the currently running launcher. - */ - len = GetModuleFileName(NULL, path, MAXPATHLEN + 1); - if (len == 0 || len > MAXPATHLEN) { - JLI_ReportErrorMessageSys(JRE_ERROR9, progname); - exit(1); - } - - JLI_TraceLauncher("ExecJRE: old: %s\n", path); - JLI_TraceLauncher("ExecJRE: new: %s\n", jre); - - /* - * If the path to the selected JRE directory is a match to the initial - * portion of the path to the currently executing JRE, we have a winner! - * If so, just return. - */ - if (JLI_StrNCaseCmp(jre, path, JLI_StrLen(jre)) == 0) - return; /* I am the droid you were looking for */ - - /* - * If this isn't the selected version, exec the selected version. - */ - JLI_Snprintf(path, sizeof(path), "%s\\bin\\%s.exe", jre, progname); - - /* - * Although Windows has an execv() entrypoint, it doesn't actually - * overlay a process: it can only create a new process and terminate - * the old process. Therefore, any processes waiting on the initial - * process wake up and they shouldn't. Hence, a chain of pseudo-zombie - * processes must be retained to maintain the proper wait semantics. - * Fortunately the image size of the launcher isn't too large at this - * time. - * - * If it weren't for this semantic flaw, the code below would be ... - * - * execv(path, argv); - * JLI_ReportErrorMessage("Error: Exec of %s failed\n", path); - * exit(1); - * - * The incorrect exec semantics could be addressed by: - * - * exit((int)spawnv(_P_WAIT, path, argv)); - * - * Unfortunately, a bug in Windows spawn/exec impementation prevents - * this from completely working. All the Windows POSIX process creation - * interfaces are implemented as wrappers around the native Windows - * function CreateProcess(). CreateProcess() takes a single string - * to specify command line options and arguments, so the POSIX routine - * wrappers build a single string from the argv[] array and in the - * process, any quoting information is lost. - * - * The solution to this to get the original command line, to process it - * to remove the new multiple JRE options (if any) as was done for argv - * in the common SelectVersion() routine and finally to pass it directly - * to the native CreateProcess() Windows process control interface. - */ - { - char *cmdline; - char *p; - char *np; - char *ocl; - char *ccl; - char *unquoted; - DWORD exitCode; - STARTUPINFO si; - PROCESS_INFORMATION pi; - - /* - * The following code block gets and processes the original command - * line, replacing the argv[0] equivalent in the command line with - * the path to the new executable and removing the appropriate - * Multiple JRE support options. Note that similar logic exists - * in the platform independent SelectVersion routine, but is - * replicated here due to the syntax of CreateProcess(). - * - * The magic "+ 4" characters added to the command line length are - * 2 possible quotes around the path (argv[0]), a space after the - * path and a terminating null character. - */ - ocl = GetCommandLine(); - np = ccl = JLI_StringDup(ocl); - p = nextarg(&np); /* Discard argv[0] */ - cmdline = (char *)JLI_MemAlloc(JLI_StrLen(path) + JLI_StrLen(np) + 4); - if (JLI_StrChr(path, (int)' ') == NULL && JLI_StrChr(path, (int)'\t') == NULL) - cmdline = JLI_StrCpy(cmdline, path); - else - cmdline = JLI_StrCat(JLI_StrCat(JLI_StrCpy(cmdline, "\""), path), "\""); - - while (*np != (char)0) { /* While more command-line */ - p = nextarg(&np); - if (*p != (char)0) { /* If a token was isolated */ - unquoted = unquote(p); - if (*unquoted == '-') { /* Looks like an option */ - if (JLI_StrCmp(unquoted, "-classpath") == 0 || - JLI_StrCmp(unquoted, "-cp") == 0) { /* Unique cp syntax */ - cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p); - p = nextarg(&np); - if (*p != (char)0) /* If a token was isolated */ - cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p); - } else if (JLI_StrNCmp(unquoted, "-version:", 9) != 0 && - JLI_StrCmp(unquoted, "-jre-restrict-search") != 0 && - JLI_StrCmp(unquoted, "-no-jre-restrict-search") != 0) { - cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p); - } - } else { /* End of options */ - cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p); - cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), np); - JLI_MemFree((void *)unquoted); - break; - } - JLI_MemFree((void *)unquoted); - } - } - JLI_MemFree((void *)ccl); - - if (JLI_IsTraceLauncher()) { - np = ccl = JLI_StringDup(cmdline); - p = nextarg(&np); - printf("ReExec Command: %s (%s)\n", path, p); - printf("ReExec Args: %s\n", np); - JLI_MemFree((void *)ccl); - } - (void)fflush(stdout); - (void)fflush(stderr); - - /* - * The following code is modeled after a model presented in the - * Microsoft Technical Article "Moving Unix Applications to - * Windows NT" (March 6, 1994) and "Creating Processes" on MSDN - * (Februrary 2005). It approximates UNIX spawn semantics with - * the parent waiting for termination of the child. - */ - memset(&si, 0, sizeof(si)); - si.cb =sizeof(STARTUPINFO); - memset(&pi, 0, sizeof(pi)); - - if (!CreateProcess((LPCTSTR)path, /* executable name */ - (LPTSTR)cmdline, /* command line */ - (LPSECURITY_ATTRIBUTES)NULL, /* process security attr. */ - (LPSECURITY_ATTRIBUTES)NULL, /* thread security attr. */ - (BOOL)TRUE, /* inherits system handles */ - (DWORD)0, /* creation flags */ - (LPVOID)NULL, /* environment block */ - (LPCTSTR)NULL, /* current directory */ - (LPSTARTUPINFO)&si, /* (in) startup information */ - (LPPROCESS_INFORMATION)&pi)) { /* (out) process information */ - JLI_ReportErrorMessageSys(SYS_ERROR1, path); - exit(1); - } - - if (WaitForSingleObject(pi.hProcess, INFINITE) != WAIT_FAILED) { - if (GetExitCodeProcess(pi.hProcess, &exitCode) == FALSE) - exitCode = 1; - } else { - JLI_ReportErrorMessage(SYS_ERROR2); - exitCode = 1; - } - - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); - - exit(exitCode); - } -} - /* * Wrapper for platform dependent unsetenv function. */ --- old/src/java.base/windows/native/libjli/java_md.h Sun Dec 7 07:35:37 2014 +++ new/src/java.base/windows/native/libjli/java_md.h Sun Dec 7 07:35:37 2014 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,8 +50,7 @@ /* * Function prototypes. */ -char *LocateJRE(manifest_info *info); -void ExecJRE(char *jre, char **argv); + int UnsetEnv(char *name); #endif /* JAVA_MD_H */ --- old/test/tools/launcher/Arrrghs.java Sun Dec 7 07:35:39 2014 +++ new/test/tools/launcher/Arrrghs.java Sun Dec 7 07:35:38 2014 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -732,23 +732,6 @@ tr.contains("java.lang.ClassNotFoundException: NonExistentClass"); if (!tr.testStatus) System.out.println(tr); - } - - @Test - static void testJreRestrictSearchFlag() { - // test both arguments to ensure they exist - TestResult tr = null; - tr = doExec(javaCmd, - "-no-jre-restrict-search", "-version"); - tr.checkPositive(); - if (!tr.testStatus) - System.out.println(tr); - - tr = doExec(javaCmd, - "-jre-restrict-search", "-version"); - tr.checkPositive(); - if (!tr.testStatus) - System.out.println(tr); } /** --- old/test/tools/launcher/MultipleJRE.sh Sun Dec 7 07:35:40 2014 +++ new/test/tools/launcher/MultipleJRE.sh Sun Dec 7 07:35:40 2014 @@ -5,7 +5,7 @@ # @build UglyPrintVersion # @build ZipMeUp # @run shell MultipleJRE.sh -# @summary Verify Multiple JRE version support +# @summary Verify Multiple JRE version support has been removed # @author Joseph E. Kowalski # @@ -222,37 +222,76 @@ # long file name (path) or a long "Ext" entry, but adding the long # comment is the easiest way. # +MONDO=" Mondo comment line 00 is designed to take up space - lots and lots of space. Mondo comment line 01 is designed to take up space - lots and lots of space. Mondo comment line 02 is designed to take up space - lots and lots of space. Mondo comment line 03 is designed to take up space - lots and lots of space. Mondo comment line 04 is designed to take up space - lots and lots of space. Mondo comment line 05 is designed to take up space - lots and lots of space. Mondo comment line 06 is designed to take up space - lots and lots of space. Mondo comment line 07 is designed to take up space - lots and lots of space. Mondo comment line 08 is designed to take up space - lots and lots of space. Mondo comment line 09 is designed to take up space - lots and lots of space. Mondo comment line 0a is designed to take up space - lots and lots of space. Mondo comment line 0b is designed to take up space - lots and lots of space. Mondo comment line 0c is designed to take up space - lots and lots of space. Mondo comment line 0d is designed to take up space - lots and lots of space. Mondo comment line 0e is designed to take up space - lots and lots of space. Mondo comment line 0f is designed to take up space - lots and lots of space. Mondo comment line 10 is designed to take up space - lots and lots of space. Mondo comment line 11 is designed to take up space - lots and lots of space. Mondo comment line 12 is designed to take up space - lots and lots of space. Mondo comment line 13 is designed to take up space - lots and lots of space. Mondo comment line 14 is designed to take up space - lots and lots of space. Mondo comment line 15 is designed to take up space - lots and lots of space. Mondo comment line 16 is designed to take up space - lots and lots of space. Mondo comment line 17 is designed to take up space - lots and lots of space. Mondo comment line 18 is designed to take up space - lots and lots of space. Mondo comment line 19 is designed to take up space - lots and lots of space. Mondo comment line 1a is designed to take up space - lots and lots of space. Mondo comment line 1b is designed to take up space - lots and lots of space. Mondo comment line 1c is designed to take up space - lots and lots of space. Mondo comment line 1d is designed to take up space - lots and lots of space. Mondo comment line 1e is designed to take up space - lots and lots of space. Mondo comment line 1f is designed to take up space - lots and lots of space. Mondo comment line 20 is designed to take up space - lots and lots of space. Mondo comment line 21 is designed to take up space - lots and lots of space. Mondo comment line 22 is designed to take up space - lots and lots of space. Mondo comment line 23 is designed to take up space - lots and lots of space. Mondo comment line 24 is designed to take up space - lots and lots of space. Mondo comment line 25 is designed to take up space - lots and lots of space. Mondo comment line 26 is designed to take up space - lots and lots of space. Mondo comment line 27 is designed to take up space - lots and lots of space. Mondo comment line 28 is designed to take up space - lots and lots of space. Mondo comment line 29 is designed to take up space - lots and lots of space. Mondo comment line 2a is designed to take up space - lots and lots of space. Mondo comment line 2b is designed to take up space - lots and lots of space. Mondo comment line 2c is designed to take up space - lots and lots of space. Mondo comment line 2d is designed to take up space - lots and lots of space. Mondo comment line 2e is designed to take up space - lots and lots of space. Mondo comment line 2f is designed to take up space - lots and lots of space. Mondo comment line 30 is designed to take up space - lots and lots of space. Mondo comment line 31 is designed to take up space - lots and lots of space. Mondo comment line 32 is designed to take up space - lots and lots of space. Mondo comment line 33 is designed to take up space - lots and lots of space. Mondo comment line 34 is designed to take up space - lots and lots of space. Mondo comment line 35 is designed to take up space - lots and lots of space. Mondo comment line 36 is designed to take up space - lots and lots of space. Mondo comment line 37 is designed to take up space - lots and lots of space. Mondo comment line 38 is designed to take up space - lots and lots of space. Mondo comment line 39 is designed to take up space - lots and lots of space. Mondo comment line 3a is designed to take up space - lots and lots of space. Mondo comment line 3b is designed to take up space - lots and lots of space. Mondo comment line 3c is designed to take up space - lots and lots of space. Mondo comment line 3d is designed to take up space - lots and lots of space. Mondo comment line 3e is designed to take up space - lots and lots of space. Mondo comment line 3f is designed to take up space - lots and lots of space. Mondo comment line 40 is designed to take up space - lots and lots of space. Mondo comment line 41 is designed to take up space - lots and lots of space. Mondo comment line 42 is designed to take up space - lots and lots of space. Mondo comment line 43 is designed to take up space - lots and lots of space. Mondo comment line 44 is designed to take up space - lots and lots of space. Mondo comment line 45 is designed to take up space - lots and lots of space. Mondo comment line 46 is designed to take up space - lots and lots of space. Mondo comment line 47 is designed to take up space - lots and lots of space. Mondo comment line 48 is designed to take up space - lots and lots of space. Mondo comment line 49 is designed to take up space - lots and lots of space. Mondo comment line 4a is designed to take up space - lots and lots of space. Mondo comment line 4b is designed to take up space - lots and lots of space. Mondo comment line 4c is designed to take up space - lots and lots of space. Mondo comment line 4d is designed to take up space - lots and lots of space. Mondo comment line 4e is designed to take up space - lots and lots of space. Mondo comment line 4f is designed to take up space - lots and lots of space. Mondo comment line 50 is designed to take up space - lots and lots of space. Mondo comment line 51 is designed to take up space - lots and lots of space. Mondo comment line 52 is designed to take up space - lots and lots of space. Mondo comment line 53 is designed to take up space - lots and lots of space. Mondo comment line 54 is designed to take up space - lots and lots of space. Mondo comment line 55 is designed to take up space - lots and lots of space. Mondo comment line 56 is designed to take up space - lots and lots of space. Mondo comment line 57 is designed to take up space - lots and lots of space. Mondo comment line 58 is designed to take up space - lots and lots of space. Mondo comment line 59 is designed to take up space - lots and lots of space. Mondo comment line 5a is designed to take up space - lots and lots of space. Mondo comment line 5b is designed to take up space - lots and lots of space. Mondo comment line 5c is designed to take up space - lots and lots of space. Mondo comment line 5d is designed to take up space - lots and lots of space. Mondo comment line 5e is designed to take up space - lots and lots of space. Mondo comment line 5f is designed to take up space - lots and lots of space. Mondo comment line 60 is designed to take up space - lots and lots of space. Mondo comment line 61 is designed to take up space - lots and lots of space. Mondo comment line 62 is designed to take up space - lots and lots of space. Mondo comment line 63 is designed to take up space - lots and lots of space. Mondo comment line 64 is designed to take up space - lots and lots of space. Mondo comment line 65 is designed to take up space - lots and lots of space. Mondo comment line 66 is designed to take up space - lots and lots of space. Mondo comment line 67 is designed to take up space - lots and lots of space. Mondo comment line 68 is designed to take up space - lots and lots of space. Mondo comment line 69 is designed to take up space - lots and lots of space. Mondo comment line 6a is designed to take up space - lots and lots of space. Mondo comment line 6b is designed to take up space - lots and lots of space. Mondo comment line 6c is designed to take up space - lots and lots of space. Mondo comment line 6d is designed to take up space - lots and lots of space. Mondo comment line 6e is designed to take up space - lots and lots of space. Mondo comment line 6f is designed to take up space - lots and lots of space. Mondo comment line 70 is designed to take up space - lots and lots of space. Mondo comment line 71 is designed to take up space - lots and lots of space. Mondo comment line 72 is designed to take up space - lots and lots of space. Mondo comment line 73 is designed to take up space - lots and lots of space. Mondo comment line 74 is designed to take up space - lots and lots of space. Mondo comment line 75 is designed to take up space - lots and lots of space. Mondo comment line 76 is designed to take up space - lots and lots of space. Mondo comment line 77 is designed to take up space - lots and lots of space. Mondo comment line 78 is designed to take up space - lots and lots of space. Mondo comment line 79 is designed to take up space - lots and lots of space. Mondo comment line 7a is designed to take up space - lots and lots of space. Mondo comment line 7b is designed to take up space - lots and lots of space. Mondo comment line 7c is designed to take up space - lots and lots of space. Mondo comment line 7d is designed to take up space - lots and lots of space. Mondo comment line 7e is designed to take up space - lots and lots of space. Mondo comment line 7f is designed to take up space - lots and lots of space. Mondo comment line 80 is designed to take up space - lots and lots of space. Mondo comment line 81 is designed to take up space - lots and lots of space. Mondo comment line 82 is designed to take up space - lots and lots of space. Mondo comment line 83 is designed to take up space - lots and lots of space. Mondo comment line 84 is designed to take up space - lots and lots of space. Mondo comment line 85 is designed to take up space - lots and lots of space. Mondo comment line 86 is designed to take up space - lots and lots of space. Mondo comment line 87 is designed to take up space - lots and lots of space. Mondo comment line 88 is designed to take up space - lots and lots of space. Mondo comment line 89 is designed to take up space - lots and lots of space. Mondo comment line 8a is designed to take up space - lots and lots of space. Mondo comment line 8b is designed to take up space - lots and lots of space. Mondo comment line 8c is designed to take up space - lots and lots of space. Mondo comment line 8d is designed to take up space - lots and lots of space. Mondo comment line 8e is designed to take up space - lots and lots of space. Mondo comment line 8f is designed to take up space - lots and lots of space. Mondo comment line 90 is designed to take up space - lots and lots of space. Mondo comment line 91 is designed to take up space - lots and lots of space. Mondo comment line 92 is designed to take up space - lots and lots of space. Mondo comment line 93 is designed to take up space - lots and lots of space. Mondo comment line 94 is designed to take up space - lots and lots of space. Mondo comment line 95 is designed to take up space - lots and lots of space. Mondo comment line 96 is designed to take up space - lots and lots of space. Mondo comment line 97 is designed to take up space - lots and lots of space. Mondo comment line 98 is designed to take up space - lots and lots of space. Mondo comment line 99 is designed to take up space - lots and lots of space. Mondo comment line 9a is designed to take up space - lots and lots of space. Mondo comment line 9b is designed to take up space - lots and lots of space. Mondo comment line 9c is designed to take up space - lots and lots of space. Mondo comment line 9d is designed to take up space - lots and lots of space. Mondo comment line 9e is designed to take up space - lots and lots of space. Mondo comment line 9f is designed to take up space - lots and lots of space. Mondo comment line a0 is designed to take up space - lots and lots of space. Mondo comment line a1 is designed to take up space - lots and lots of space. Mondo comment line a2 is designed to take up space - lots and lots of space. Mondo comment line a3 is designed to take up space - lots and lots of space. Mondo comment line a4 is designed to take up space - lots and lots of space. Mondo comment line a5 is designed to take up space - lots and lots of space. Mondo comment line a6 is designed to take up space - lots and lots of space. Mondo comment line a7 is designed to take up space - lots and lots of space. Mondo comment line a8 is designed to take up space - lots and lots of space. Mondo comment line a9 is designed to take up space - lots and lots of space. Mondo comment line aa is designed to take up space - lots and lots of space. Mondo comment line ab is designed to take up space - lots and lots of space. Mondo comment line ac is designed to take up space - lots and lots of space. Mondo comment line ad is designed to take up space - lots and lots of space. Mondo comment line ae is designed to take up space - lots and lots of space. Mondo comment line af is designed to take up space - lots and lots of space. Mondo comment line b0 is designed to take up space - lots and lots of space. Mondo comment line b1 is designed to take up space - lots and lots of space. Mondo comment line b2 is designed to take up space - lots and lots of space. Mondo comment line b3 is designed to take up space - lots and lots of space. Mondo comment line b4 is designed to take up space - lots and lots of space. Mondo comment line b5 is designed to take up space - lots and lots of space. Mondo comment line b6 is designed to take up space - lots and lots of space. Mondo comment line b7 is designed to take up space - lots and lots of space. Mondo comment line b8 is designed to take up space - lots and lots of space. Mondo comment line b9 is designed to take up space - lots and lots of space. Mondo comment line ba is designed to take up space - lots and lots of space. Mondo comment line bb is designed to take up space - lots and lots of space. Mondo comment line bc is designed to take up space - lots and lots of space. Mondo comment line bd is designed to take up space - lots and lots of space. Mondo comment line be is designed to take up space - lots and lots of space. Mondo comment line bf is designed to take up space - lots and lots of space. Mondo comment line c0 is designed to take up space - lots and lots of space. Mondo comment line c1 is designed to take up space - lots and lots of space. Mondo comment line c2 is designed to take up space - lots and lots of space. Mondo comment line c3 is designed to take up space - lots and lots of space. Mondo comment line c4 is designed to take up space - lots and lots of space. Mondo comment line c5 is designed to take up space - lots and lots of space. Mondo comment line c6 is designed to take up space - lots and lots of space. Mondo comment line c7 is designed to take up space - lots and lots of space. Mondo comment line c8 is designed to take up space - lots and lots of space. Mondo comment line c9 is designed to take up space - lots and lots of space. Mondo comment line ca is designed to take up space - lots and lots of space. Mondo comment line cb is designed to take up space - lots and lots of space. Mondo comment line cc is designed to take up space - lots and lots of space. Mondo comment line cd is designed to take up space - lots and lots of space. Mondo comment line ce is designed to take up space - lots and lots of space. Mondo comment line cf is designed to take up space - lots and lots of space. Mondo comment line d0 is designed to take up space - lots and lots of space. Mondo comment line d1 is designed to take up space - lots and lots of space. Mondo comment line d2 is designed to take up space - lots and lots of space. Mondo comment line d3 is designed to take up space - lots and lots of space. Mondo comment line d4 is designed to take up space - lots and lots of space. Mondo comment line d5 is designed to take up space - lots and lots of space. Mondo comment line d6 is designed to take up space - lots and lots of space. Mondo comment line d7 is designed to take up space - lots and lots of space. Mondo comment line d8 is designed to take up space - lots and lots of space. Mondo comment line d9 is designed to take up space - lots and lots of space. Mondo comment line da is designed to take up space - lots and lots of space. Mondo comment line db is designed to take up space - lots and lots of space. Mondo comment line dc is designed to take up space - lots and lots of space. Mondo comment line dd is designed to take up space - lots and lots of space. Mondo comment line de is designed to take up space - lots and lots of space. Mondo comment line df is designed to take up space - lots and lots of space. Mondo comment line e0 is designed to take up space - lots and lots of space. Mondo comment line e1 is designed to take up space - lots and lots of space. Mondo comment line e2 is designed to take up space - lots and lots of space. Mondo comment line e3 is designed to take up space - lots and lots of space. Mondo comment line e4 is designed to take up space - lots and lots of space. Mondo comment line e5 is designed to take up space - lots and lots of space. Mondo comment line e6 is designed to take up space - lots and lots of space. Mondo comment line e7 is designed to take up space - lots and lots of space. Mondo comment line e8 is designed to take up space - lots and lots of space. Mondo comment line e9 is designed to take up space - lots and lots of space. Mondo comment line ea is designed to take up space - lots and lots of space. Mondo comment line eb is designed to take up space - lots and lots of space. Mondo comment line ec is designed to take up space - lots and lots of space. Mondo comment line ed is designed to take up space - lots and lots of space. Mondo comment line ee is designed to take up space - lots and lots of space. Mondo comment line ef is designed to take up space - lots and lots of space. Mondo comment line f0 is designed to take up space - lots and lots of space. Mondo comment line f1 is designed to take up space - lots and lots of space. Mondo comment line f2 is designed to take up space - lots and lots of space. Mondo comment line f3 is designed to take up space - lots and lots of space. Mondo comment line f4 is designed to take up space - lots and lots of space. Mondo comment line f5 is designed to take up space - lots and lots of space. Mondo comment line f6 is designed to take up space - lots and lots of space. Mondo comment line f7 is designed to take up space - lots and lots of space. Mondo comment line f8 is designed to take up space - lots and lots of space. Mondo comment line f9 is designed to take up space - lots and lots of space. Mondo comment line fa is designed to take up space - lots and lots of space. Mondo comment line fb is designed to take up space - lots and lots of space. Mondo comment line fc is designed to take up space - lots and lots of space. Mondo comment line fd is designed to take up space - lots and lots of space. Mondo comment line fe is designed to take up space - lots and lots of space. Mondo comment line ff is designed to take up space - lots and lots of space." CommentZipFile() { - file= - tail="is designed to take up space - lots and lots of space." - mv PrintVersion PrintVersion.zip - /usr/bin/zipnote PrintVersion.zip > zipout - while read ampersand line; do - if [ "$ampersand" = "@" ]; then - if [ "$line" = "(comment above this line)" ]; then - echo "File Comment Line." >> zipin - if [ "$file" = "$1" ]; then - for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do - for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do - echo "Mondo comment line $i$j $tail" >> zipin - done - done - fi - else - file=$line - fi + mkdir -p META-INF + echo "Manifest-Version: 1.0" > META-INF/MANIFEST.MF + echo "Main-Class: PrintVersion" >> META-INF/MANIFEST.MF + if [ "$1" != "" ]; then + echo "JRE-Version: $1" >> META-INF/MANIFEST.MF fi - echo "$ampersand $line" >> zipin - if [ "$ampersand" = "@" ]; then - if [ "$line" = "(zip file comment below this line)" ]; then - echo "Zip File Comment Line number 1" >> zipin - echo "Zip File Comment Line number 2" >> zipin - fi - fi - done < zipout - /usr/bin/zipnote -w PrintVersion.zip < zipin + cp $TESTCLASSES/PrintVersion.class . + + # The remaining code in CommentZipFile essentially replaces the + # following code, which added comments to the jar file. + # Unfortunately zipnote has been broken since 3.0 [ 2008 ] and + # there has been no new [ fixed ] version. zipnote has probably + # always failed, or failed for a long time without causing the + # test to fail. So no comments were added to the file. + # The comments are added using zip(1) during the creation of the + # zip file. + # + # NOTE: + # It seems the original intent of this test was to add a very long + # comment for one file. But zip allows a max of 256 characters, so + # we settle for adding 256-character comments to lots of files. + # + # $JAR $2cMf PrintVersion PrintVersion.class AfairlyLong* + # $JAR $2umf META-INF/MANIFEST.MF PrintVersion + # /usr/bin/zipnote PrintVersion.zip > zipout + # ... code to modify zipout adding comments + # /usr/bin/zipnote -w PrintVersion.zip < zipin + # mv PrintVersion.zip PrintVersion + # + + + for i in 0 1 2 3 4 5 6 7 8 9 ; do + for j in 0 1 2 3 4 5 6 7 8 9 ; do + touch AfairlyLongNameEatsUpDirectorySpaceBetter$i$j + done + done + + zip -$2c PrintVersion.zip PrintVersion.class AfairlyLong* META-INF/MANIFEST.MF << FINI +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +$MONDO +File Comment Line. +File Comment Line. +File Comment Line. +FINI + + rm -f AfairlyLong* + mv PrintVersion.zip PrintVersion - rm zipout zipin + } # @@ -261,22 +300,29 @@ # LaunchVM() { if [ "$1" != "" ]; then - mess="`$JAVA -version:\"$1\" -jar PrintVersion 2>&1`" + mess="`$JAVA \"$1\" -jar PrintVersion 2>&1`" + if [ $? -eq 0 ]; then + echo "Unexpected success of -Version:$1" + echo "$mess" + exit 1 + fi else mess="`$JAVA -jar PrintVersion 2>&1`" - fi - if [ $? -ne 0 ]; then - prefix=`echo "$mess" | cut -d ' ' -f 1-3` - if [ "$prefix" != "Unable to locate" ]; then - echo "$mess" + if [ $? -ne 0 ]; then + prefix=`echo "$mess" | cut -d ' ' -f 1-3` + if [ "$prefix" != "Unable to locate" ]; then + echo "$mess" + exit 1 + fi + echo "Unexpected error in attempting to locate $1" exit 1 fi - echo "Unexpected error in attempting to locate $1" - exit 1 + fi + echo $mess | grep "$2" > /dev/null 2>&1 if [ $? != 0 ]; then - echo "Launched $mess, expected $2" + echo "Launched $mess, expected $1" exit 1 fi } @@ -307,6 +353,7 @@ # # Main test sequence starts here # + RELEASE=`$JAVA -version 2>&1 | head -n 1 | cut -d ' ' -f 3 | \ sed -e "s/\"//g"` BASE_RELEASE=`echo $RELEASE | sed -e "s/-.*//g"` @@ -386,91 +433,31 @@ fi # -# Throw some syntactically challenged (illegal) version specifiers at -# the interface. Failure (of the launcher) is success for the test. +# Now test specification of mJRE # -TestSyntax "1.2..3" # Two adjacent separators -TestSyntax "_1.2.3" # Begins with a separator -TestSyntax "1.2.3-" # Ends with a separator -TestSyntax "1.2+.3" # Embedded modifier -TestSyntax "1.2.4+&1.2*&1++" # Long and invalid - -# On windows we see if there is another jre installed, usually -# there is, then we test using that, otherwise links are created -# to get through to SelectVersion. -if [ `IsWindows` = "false" ]; then - TestLongMainClass "mklink" -else - $JAVAEXE -version:1.0+ - if [ $? -eq 0 ]; then - TestLongMainClass "1.0+" - else - printf "Warning: TestLongMainClass skipped as there is no" - printf "viable MJRE installed.\n" - fi -fi - +# In some cases this should result in failure of the command, +# in some cases, a warning messages, with the command succeeding. # -# Because scribbling in the registry can be rather destructive, only a -# subset of the tests are run on Windows. -# -if [ `IsWindows` = "true" ]; then - exit 0; -fi -# -# Additional version specifiers containing spaces. (Sigh, unable to -# figure out the glomming on Windows) -# -TestSyntax "1.2.3_99 1.3.2+ 1.2.4+&1.2*&1++" # Long and invalid + # Commandline use of "-version:" should fail + # with a message containing "no longer supported" + LaunchVM "-version:1.10+" "Error: Specifying an alternate JDK/JRE" + LaunchVM "-version:prettymuchanything" "Error: Specifying an alternate JDK/JRE" -# -# Create a mock installation of a number of shell scripts named as though -# they were installed JREs. Then test to see if the launcher can cause -# the right shell scripts to be invoked. -# -# Note, that as a side effect, this test verifies that JAVA_VERSION_PATH -# works. -# -rm -rf jdk -JAVA_VERSION_PATH="`pwd`/jdk" -export JAVA_VERSION_PATH + # Commandline use of "-jre-restrict-search" should now fail + LaunchVM "-jre-restrict-search" "\-jre\-no\-restrict\-search are also no longer valid" + # Commandline use of "-jre-no-restrict-search" should now fail + LaunchVM "-jre-no-restrict-search" "\-jre\-no\-restrict\-search are also no longer valid" -CreateMockVM 1.10 -CreateMockVM 1.11.3 -CreateMockVM 1.11.3_03 -CreateMockVM 1.11.4 -CreateMockVM 1.12.3_03 -CreateMockVM 1.12.3_03-lastweek -CreateMockVM 1.13.3_03 -CreateMockVM 1.13.3_03-lastweek -CreateMockVM 1.13.3_03_lastweek -CreateMockVM 1.20.0 -# -# Test extracting the version information from the jar file: -# -# Requested Expected -CreateJar "1.10+" "" -LaunchVM "" "1.20.0" -CreateJar "1.11.3_03+&1.11*" "" -LaunchVM "" "1.11.4" -CreateJar "1.12.3_03+&1.12.3*" "" -LaunchVM "" "1.12.3_03" -CreateJar "1.13.3_03+&1.13.3*" "" -LaunchVM "" "1.13.3_03_lastweek" # Strange but true + # mJRE directives to use a specific version should be flagged + # with a warning, but the jar should be executed with the + # current jre + CreateFullJar "junk request" "" + LaunchVM "" "${RELEASE}" + # Going to silently ignore JRE-Version setting in jar file manifest + #LaunchVM "" "warning: The jarfile JRE-Version" + -# -# Test obtaining the version information from the command line (and that -# it overrides the manifest). -# -CreateJar "${BASERELEASE}*" "" -LaunchVM "1.10+" "1.20.0" -LaunchVM "1.11.3_03+&1.11*" "1.11.4" -LaunchVM "1.12.3_03+&1.12.3*" "1.12.3_03" -LaunchVM "1.13.3_03+&1.13.3*" "1.13.3_03_lastweek" # Strange but true - -[ -d jdk ] && rm -rf jdk -[ -d META_INF ] && rm -rf META_INF - exit 0 + --- old/src/java.base/share/native/libjli/version_comp.c Sun Dec 7 07:35:42 2014 +++ /dev/null Sun Dec 7 07:35:42 2014 @@ -1,357 +0,0 @@ -/* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#include -#include -#include -#include -#include "jni.h" -#include "jli_util.h" -#include "version_comp.h" - -/* - * A collection of useful strings. One should think of these as #define - * entries, but actual strings can be more efficient (with many compilers). - */ -static const char *separators = ".-_"; -static const char *zero_string = "0"; - -/* - * Validate a string as parsable as a "Java int". If so parsable, - * return true (non-zero) and store the numeric value at the address - * passed in as "value"; otherwise return false (zero). - * - * Note that the maximum allowable value is 2147483647 as defined by - * the "Java Language Specification" which precludes the use of native - * conversion routines which may have other limits. - * - * Also note that we don't have to worry about the alternate maximum - * allowable value of 2147483648 because it is only allowed after - * the unary negation operator and this grammar doesn't have one - * of those. - * - * Finally, note that a value which exceeds the maximum jint value will - * return false (zero). This results in the otherwise purely numeric - * string being compared as a string of characters (as per the spec.) - */ -static int -isjavaint(const char *s, jint *value) -{ - jlong sum = 0; - jint digit; - while (*s != '\0') - if (isdigit(*s)) { - digit = (jint)((int)(*s++) - (int)('0')); - sum = (sum * 10) + digit; - if (sum > 2147483647) - return (0); /* Overflows jint (but not jlong) */ - } else - return (0); - *value = (jint)sum; - return (1); -} - -/* - * Modeled after strcmp(), compare two strings (as in the grammar defined - * in Appendix A of JSR 56). If both strings can be interpreted as - * Java ints, do a numeric comparison, else it is strcmp(). - */ -static int -comp_string(const char *s1, const char *s2) -{ - jint v1, v2; - if (isjavaint(s1, &v1) && isjavaint(s2, &v2)) - return ((int)(v1 - v2)); - else - return (JLI_StrCmp(s1, s2)); -} - -/* - * Modeled after strcmp(), compare two version-ids for a Prefix - * Match as defined in JSR 56. - */ -int -JLI_PrefixVersionId(const char *id1, char *id2) -{ - char *s1 = JLI_StringDup(id1); - char *s2 = JLI_StringDup(id2); - char *m1 = s1; - char *m2 = s2; - char *end1 = NULL; - char *end2 = NULL; - int res = 0; - - do { - - if ((s1 != NULL) && ((end1 = JLI_StrPBrk(s1, ".-_")) != NULL)) - *end1 = '\0'; - if ((s2 != NULL) && ((end2 = JLI_StrPBrk(s2, ".-_")) != NULL)) - *end2 = '\0'; - - res = comp_string(s1, s2); - - if (end1 != NULL) - s1 = end1 + 1; - else - s1 = NULL; - if (end2 != NULL) - s2 = end2 + 1; - else - s2 = NULL; - - } while (res == 0 && ((s1 != NULL) && (s2 != NULL))); - - JLI_MemFree(m1); - JLI_MemFree(m2); - return (res); -} - -/* - * Modeled after strcmp(), compare two version-ids for an Exact - * Match as defined in JSR 56. - */ -int -JLI_ExactVersionId(const char *id1, char *id2) -{ - char *s1 = JLI_StringDup(id1); - char *s2 = JLI_StringDup(id2); - char *m1 = s1; - char *m2 = s2; - char *end1 = NULL; - char *end2 = NULL; - int res = 0; - - do { - - if ((s1 != NULL) && ((end1 = JLI_StrPBrk(s1, separators)) != NULL)) - *end1 = '\0'; - if ((s2 != NULL) && ((end2 = JLI_StrPBrk(s2, separators)) != NULL)) - *end2 = '\0'; - - if ((s1 != NULL) && (s2 == NULL)) - res = comp_string(s1, zero_string); - else if ((s1 == NULL) && (s2 != NULL)) - res = comp_string(zero_string, s2); - else - res = comp_string(s1, s2); - - if (end1 != NULL) - s1 = end1 + 1; - else - s1 = NULL; - if (end2 != NULL) - s2 = end2 + 1; - else - s2 = NULL; - - } while (res == 0 && ((s1 != NULL) || (s2 != NULL))); - - JLI_MemFree(m1); - JLI_MemFree(m2); - return (res); -} - -/* - * Return true if this simple-element (as defined in JSR 56) forms - * an acceptable match. - * - * JSR 56 is modified by the Java Web Start Developer Guide - * where it is stated "... Java Web Start will not consider an installed - * non-FCS (i.e., milestone) JRE as a match. ... a JRE from Sun - * Microsystems, Inc., is by convention a non-FCS (milestone) JRE - * if there is a dash (-) in the version string." - * - * An undocumented caveat to the above is that an exact match with a - * hyphen is accepted as a development extension. - * - * These modifications are addressed by the specific comparisons - * for releases with hyphens. - */ -static int -acceptable_simple_element(const char *release, char *simple_element) -{ - char *modifier; - modifier = simple_element + JLI_StrLen(simple_element) - 1; - if (*modifier == '*') { - *modifier = '\0'; - if (JLI_StrChr(release, '-')) - return ((JLI_StrCmp(release, simple_element) == 0)?1:0); - return ((JLI_PrefixVersionId(release, simple_element) == 0)?1:0); - } else if (*modifier == '+') { - *modifier = '\0'; - if (JLI_StrChr(release, '-')) - return ((JLI_StrCmp(release, simple_element) == 0)?1:0); - return ((JLI_ExactVersionId(release, simple_element) >= 0)?1:0); - } else { - return ((JLI_ExactVersionId(release, simple_element) == 0)?1:0); - } -} - -/* - * Return true if this element (as defined in JSR 56) forms - * an acceptable match. An element is the intersection (and) - * of multiple simple-elements. - */ -static int -acceptable_element(const char *release, char *element) -{ - char *end; - do { - if ((end = JLI_StrChr(element, '&')) != NULL) - *end = '\0'; - if (!acceptable_simple_element(release, element)) - return (0); - if (end != NULL) - element = end + 1; - } while (end != NULL); - return (1); -} - -/* - * Checks if release is acceptable by the specification version-string. - * Return true if this version-string (as defined in JSR 56) forms - * an acceptable match. A version-string is the union (or) of multiple - * elements. - */ -int -JLI_AcceptableRelease(const char *release, char *version_string) -{ - char *vs; - char *m1; - char *end; - m1 = vs = JLI_StringDup(version_string); - do { - if ((end = JLI_StrChr(vs, ' ')) != NULL) - *end = '\0'; - if (acceptable_element(release, vs)) { - JLI_MemFree(m1); - return (1); - } - if (end != NULL) - vs = end + 1; - } while (end != NULL); - JLI_MemFree(m1); - return (0); -} - -/* - * Return true if this is a valid simple-element (as defined in JSR 56). - * - * The official grammar for a simple-element is: - * - * simple-element ::= version-id | version-id modifier - * modifier ::= '+' | '*' - * version-id ::= string ( separator string )* - * string ::= char ( char )* - * char ::= Any ASCII character except a space, an - * ampersand, a separator or a modifier - * separator ::= '.' | '-' | '_' - * - * However, for efficiency, it is time to abandon the top down parser - * implementation. After deleting the potential trailing modifier, we - * are left with a version-id. - * - * Note that a valid version-id has three simple properties: - * - * 1) Doesn't contain a space, an ampersand or a modifier. - * - * 2) Doesn't begin or end with a separator. - * - * 3) Doesn't contain two adjacent separators. - * - * Any other line noise constitutes a valid version-id. - */ -static int -valid_simple_element(char *simple_element) -{ - char *last; - size_t len; - - if ((simple_element == NULL) || ((len = JLI_StrLen(simple_element)) == 0)) - return (0); - last = simple_element + len - 1; - if (*last == '*' || *last == '+') { - if (--len == 0) - return (0); - *last-- = '\0'; - } - if (JLI_StrPBrk(simple_element, " &+*") != NULL) /* Property #1 */ - return (0); - if ((JLI_StrChr(".-_", *simple_element) != NULL) || /* Property #2 */ - (JLI_StrChr(".-_", *last) != NULL)) - return (0); - for (; simple_element != last; simple_element++) /* Property #3 */ - if ((JLI_StrChr(".-_", *simple_element) != NULL) && - (JLI_StrChr(".-_", *(simple_element + 1)) != NULL)) - return (0); - return (1); -} - -/* - * Return true if this is a valid element (as defined in JSR 56). - * An element is the intersection (and) of multiple simple-elements. - */ -static int -valid_element(char *element) -{ - char *end; - if ((element == NULL) || (JLI_StrLen(element) == 0)) - return (0); - do { - if ((end = JLI_StrChr(element, '&')) != NULL) - *end = '\0'; - if (!valid_simple_element(element)) - return (0); - if (end != NULL) - element = end + 1; - } while (end != NULL); - return (1); -} - -/* - * Validates a version string by the extended JSR 56 grammar. - */ -int -JLI_ValidVersionString(char *version_string) -{ - char *vs; - char *m1; - char *end; - if ((version_string == NULL) || (JLI_StrLen(version_string) == 0)) - return (0); - m1 = vs = JLI_StringDup(version_string); - do { - if ((end = JLI_StrChr(vs, ' ')) != NULL) - *end = '\0'; - if (!valid_element(vs)) { - JLI_MemFree(m1); - return (0); - } - if (end != NULL) - vs = end + 1; - } while (end != NULL); - JLI_MemFree(m1); - return (1); -} --- old/src/java.base/share/native/libjli/version_comp.h Sun Dec 7 07:35:43 2014 +++ /dev/null Sun Dec 7 07:35:43 2014 @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#ifndef _VERSION_COMP_H -#define _VERSION_COMP_H - -/* - * Function prototypes. - */ -int JLI_ExactVersionId(const char *id1, char *id2); -int JLI_PrefixVersionId(const char *id1, char *id2); -int JLI_AcceptableRelease(const char *release, char *version_string); -int JLI_ValidVersionString(char *version_string); - -#endif /* _VERSION_COMP_H */