src/os/bsd/vm/os_bsd.cpp

Print this page
rev 6140 : 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
Summary: Add missing freeing of memory or use local variable. Also add a 'const' to avoid gcc write-string warnings on ppc.

*** 304,316 **** return home_dir; } #endif void os::init_system_properties_values() { - // char arch[12]; - // sysinfo(SI_ARCHITECTURE, arch, sizeof(arch)); - // The next steps are taken in the product version: // // Obtain the JAVA_HOME value from the location of libjvm.so. // This library should be located at: // <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so. --- 304,313 ----
*** 333,535 **** // Otherwise exit. // // Important note: if the location of libjvm.so changes this // code needs to be changed accordingly. ! // The next few definitions allow the code to be verbatim: ! #define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal) ! #define getenv(n) ::getenv(n) ! ! /* ! * See ld(1): ! * The linker uses the following search paths to locate required ! * shared libraries: ! * 1: ... ! * ... ! * 7: The default directories, normally /lib and /usr/lib. ! */ #ifndef DEFAULT_LIBPATH #define DEFAULT_LIBPATH "/lib:/usr/lib" #endif #define EXTENSIONS_DIR "/lib/ext" #define ENDORSED_DIR "/lib/endorsed" - #define REG_DIR "/usr/java/packages" ! #ifdef __APPLE__ ! #define SYS_EXTENSIONS_DIR "/Library/Java/Extensions" ! #define SYS_EXTENSIONS_DIRS SYS_EXTENSIONS_DIR ":/Network" SYS_EXTENSIONS_DIR ":/System" SYS_EXTENSIONS_DIR ":/usr/lib/java" ! const char *user_home_dir = get_home(); ! // the null in SYS_EXTENSIONS_DIRS counts for the size of the colon after user_home_dir ! int system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) + ! sizeof(SYS_EXTENSIONS_DIRS); ! #endif { - /* sysclasspath, java_home, dll_dir */ - { - char *home_path; - char *dll_path; char *pslash; ! char buf[MAXPATHLEN]; ! os::jvm_path(buf, sizeof(buf)); // Found the full path to libjvm.so. // Now cut the path to <java_home>/jre if we can. ! *(strrchr(buf, '/')) = '\0'; /* get rid of /libjvm.so */ pslash = strrchr(buf, '/'); ! if (pslash != NULL) ! *pslash = '\0'; /* get rid of /{client|server|hotspot} */ ! dll_path = malloc(strlen(buf) + 1); ! if (dll_path == NULL) ! return; ! strcpy(dll_path, buf); ! Arguments::set_dll_dir(dll_path); if (pslash != NULL) { pslash = strrchr(buf, '/'); if (pslash != NULL) { ! *pslash = '\0'; /* get rid of /<arch> (/lib on macosx) */ ! #ifndef __APPLE__ pslash = strrchr(buf, '/'); ! if (pslash != NULL) ! *pslash = '\0'; /* get rid of /lib */ ! #endif } } ! ! home_path = malloc(strlen(buf) + 1); ! if (home_path == NULL) ! return; ! strcpy(home_path, buf); ! Arguments::set_java_home(home_path); ! ! if (!set_boot_path('/', ':')) ! return; } ! /* ! * Where to look for native libraries ! * ! * Note: Due to a legacy implementation, most of the library path ! * is set in the launcher. This was to accomodate linking restrictions ! * on legacy Bsd implementations (which are no longer supported). ! * Eventually, all the library path setting will be done here. ! * ! * However, to prevent the proliferation of improperly built native ! * libraries, the new path component /usr/java/packages is added here. ! * Eventually, all the library path setting will be done here. ! */ { ! char *ld_library_path; ! /* ! * Construct the invariant part of ld_library_path. Note that the ! * space for the colon and the trailing null are provided by the ! * nulls included by the sizeof operator (so actually we allocate ! * a byte more than necessary). ! */ ! #ifdef __APPLE__ ! ld_library_path = (char *) malloc(system_ext_size); ! sprintf(ld_library_path, "%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS, user_home_dir); ! #else ! ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") + ! strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH)); ! sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch); ! #endif ! /* ! * Get the user setting of LD_LIBRARY_PATH, and prepended it. It ! * should always exist (until the legacy problem cited above is ! * addressed). ! */ ! #ifdef __APPLE__ ! // Prepend the default path with the JAVA_LIBRARY_PATH so that the app launcher code can specify a directory inside an app wrapper ! char *l = getenv("JAVA_LIBRARY_PATH"); ! if (l != NULL) { ! char *t = ld_library_path; ! /* That's +1 for the colon and +1 for the trailing '\0' */ ! ld_library_path = (char *) malloc(strlen(l) + 1 + strlen(t) + 1); ! sprintf(ld_library_path, "%s:%s", l, t); ! free(t); } ! char *v = getenv("DYLD_LIBRARY_PATH"); ! #else ! char *v = getenv("LD_LIBRARY_PATH"); ! #endif ! if (v != NULL) { ! char *t = ld_library_path; ! /* That's +1 for the colon and +1 for the trailing '\0' */ ! ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1); ! sprintf(ld_library_path, "%s:%s", v, t); ! free(t); } ! #ifdef __APPLE__ // Apple's Java6 has "." at the beginning of java.library.path. // OpenJDK on Windows has "." at the end of java.library.path. // OpenJDK on Linux and Solaris don't have "." in java.library.path // at all. To ease the transition from Apple's Java6 to OpenJDK7, // "." is appended to the end of java.library.path. Yes, this // could cause a change in behavior, but Apple's Java6 behavior // can be achieved by putting "." at the beginning of the // JAVA_LIBRARY_PATH environment variable. ! { ! char *t = ld_library_path; ! // that's +3 for appending ":." and the trailing '\0' ! ld_library_path = (char *) malloc(strlen(t) + 3); ! sprintf(ld_library_path, "%s:%s", t, "."); ! free(t); ! } ! #endif ! Arguments::set_library_path(ld_library_path); } ! /* ! * Extensions directories. ! * ! * Note that the space for the colon and the trailing null are provided ! * by the nulls included by the sizeof operator (so actually one byte more ! * than necessary is allocated). ! */ ! { ! #ifdef __APPLE__ ! char *buf = malloc(strlen(Arguments::get_java_home()) + ! sizeof(EXTENSIONS_DIR) + system_ext_size); ! sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":" ! SYS_EXTENSIONS_DIRS, user_home_dir, Arguments::get_java_home()); ! #else ! char *buf = malloc(strlen(Arguments::get_java_home()) + ! sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR)); ! sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR, ! Arguments::get_java_home()); ! #endif ! Arguments::set_ext_dirs(buf); - } ! /* Endorsed standards default directory. */ ! { ! char * buf; ! buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR)); sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); Arguments::set_endorsed_dirs(buf); - } - } ! #ifdef __APPLE__ #undef SYS_EXTENSIONS_DIR ! #endif ! #undef malloc ! #undef getenv #undef EXTENSIONS_DIR #undef ENDORSED_DIR - - // Done - return; } //////////////////////////////////////////////////////////////////////////////// // breakpoint support --- 330,538 ---- // Otherwise exit. // // Important note: if the location of libjvm.so changes this // code needs to be changed accordingly. ! // See ld(1): ! // The linker uses the following search paths to locate required ! // shared libraries: ! // 1: ... ! // ... ! // 7: The default directories, normally /lib and /usr/lib. #ifndef DEFAULT_LIBPATH #define DEFAULT_LIBPATH "/lib:/usr/lib" #endif + // Base path of extensions installed on the system. + #define SYS_EXT_DIR "/usr/java/packages" #define EXTENSIONS_DIR "/lib/ext" #define ENDORSED_DIR "/lib/endorsed" ! #ifndef __APPLE__ + // Buffer that fits several sprintfs. + // Note that the space for the colon and the trailing null are provided + // by the nulls included by the sizeof operator. + const size_t bufsize = + MAX3((size_t)MAXPATHLEN, // For dll_dir & friends. + (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR), // extensions dir + (size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir + char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); + + // sysclasspath, java_home, dll_dir { char *pslash; ! os::jvm_path(buf, bufsize); // Found the full path to libjvm.so. // Now cut the path to <java_home>/jre if we can. ! *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so. pslash = strrchr(buf, '/'); ! if (pslash != NULL) { ! *pslash = '\0'; // Get rid of /{client|server|hotspot}. ! } ! Arguments::set_dll_dir(buf); if (pslash != NULL) { pslash = strrchr(buf, '/'); if (pslash != NULL) { ! *pslash = '\0'; // Get rid of /<arch>. pslash = strrchr(buf, '/'); ! if (pslash != NULL) { ! *pslash = '\0'; // Get rid of /lib. } } ! } ! Arguments::set_java_home(buf); ! set_boot_path('/', ':'); } ! // Where to look for native libraries. ! // ! // Note: Due to a legacy implementation, most of the library path ! // is set in the launcher. This was to accomodate linking restrictions ! // on legacy Bsd implementations (which are no longer supported). ! // Eventually, all the library path setting will be done here. ! // ! // However, to prevent the proliferation of improperly built native ! // libraries, the new path component /usr/java/packages is added here. ! // Eventually, all the library path setting will be done here. { ! // Get the user setting of LD_LIBRARY_PATH, and prepended it. It ! // should always exist (until the legacy problem cited above is ! // addressed). ! const char *v = ::getenv("LD_LIBRARY_PATH"); ! const char *v_colon = ":"; ! if (v == NULL) { v = ""; v_colon = ""; } ! // That's +1 for the colon and +1 for the trailing '\0'. ! char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, ! strlen(v) + 1 + ! sizeof(SYS_EXT_DIR) + sizeof("/lib/") + strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH) + 1, ! mtInternal); ! sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib/%s:" DEFAULT_LIBPATH, v, v_colon, cpu_arch); ! Arguments::set_library_path(ld_library_path); ! FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal); ! } ! // Extensions directories. ! sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home()); ! Arguments::set_ext_dirs(buf); ! // Endorsed standards default directory. ! sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); ! Arguments::set_endorsed_dirs(buf); ! ! FREE_C_HEAP_ARRAY(char, buf, mtInternal); ! ! #else // __APPLE__ ! ! #define SYS_EXTENSIONS_DIR "/Library/Java/Extensions" ! #define SYS_EXTENSIONS_DIRS SYS_EXTENSIONS_DIR ":/Network" SYS_EXTENSIONS_DIR ":/System" SYS_EXTENSIONS_DIR ":/usr/lib/java" ! ! const char *user_home_dir = get_home(); ! // The null in SYS_EXTENSIONS_DIRS counts for the size of the colon after user_home_dir. ! size_t system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) + ! sizeof(SYS_EXTENSIONS_DIRS); ! ! // Buffer that fits several sprintfs. ! // Note that the space for the colon and the trailing null are provided ! // by the nulls included by the sizeof operator. ! const size_t bufsize = ! MAX3((size_t)MAXPATHLEN, // for dll_dir & friends. ! (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + system_ext_size, // extensions dir ! (size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir ! char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); ! ! // sysclasspath, java_home, dll_dir ! { ! char *pslash; ! os::jvm_path(buf, bufsize); ! ! // Found the full path to libjvm.so. ! // Now cut the path to <java_home>/jre if we can. ! *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so. ! pslash = strrchr(buf, '/'); ! if (pslash != NULL) { ! *pslash = '\0'; // Get rid of /{client|server|hotspot}. } + Arguments::set_dll_dir(buf); ! if (pslash != NULL) { ! pslash = strrchr(buf, '/'); ! if (pslash != NULL) { ! *pslash = '\0'; // Get rid of /lib. ! } ! } ! Arguments::set_java_home(buf); ! set_boot_path('/', ':'); } ! // Where to look for native libraries. ! // ! // Note: Due to a legacy implementation, most of the library path ! // is set in the launcher. This was to accomodate linking restrictions ! // on legacy Bsd implementations (which are no longer supported). ! // Eventually, all the library path setting will be done here. ! // ! // However, to prevent the proliferation of improperly built native ! // libraries, the new path component /usr/java/packages is added here. ! // Eventually, all the library path setting will be done here. ! { ! // Get the user setting of LD_LIBRARY_PATH, and prepended it. It ! // should always exist (until the legacy problem cited above is ! // addressed). ! // Prepend the default path with the JAVA_LIBRARY_PATH so that the app launcher code ! // can specify a directory inside an app wrapper ! const char *l = ::getenv("JAVA_LIBRARY_PATH"); ! const char *l_colon = ":"; ! if (l == NULL) { l = ""; l_colon = ""; } ! ! const char *v = ::getenv("DYLD_LIBRARY_PATH"); ! const char *v_colon = ":"; ! if (v == NULL) { v = ""; v_colon = ""; } ! // Apple's Java6 has "." at the beginning of java.library.path. // OpenJDK on Windows has "." at the end of java.library.path. // OpenJDK on Linux and Solaris don't have "." in java.library.path // at all. To ease the transition from Apple's Java6 to OpenJDK7, // "." is appended to the end of java.library.path. Yes, this // could cause a change in behavior, but Apple's Java6 behavior // can be achieved by putting "." at the beginning of the // JAVA_LIBRARY_PATH environment variable. ! char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, ! strlen(v) + 1 + strlen(l) + 1 + ! system_ext_size + 3, ! mtInternal); ! sprintf(ld_library_path, "%s%s%s%s%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS ":.", ! v, v_colon, l, l_colon, user_home_dir); Arguments::set_library_path(ld_library_path); + FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal); } ! // Extensions directories. ! // ! // Note that the space for the colon and the trailing null are provided ! // by the nulls included by the sizeof operator (so actually one byte more ! // than necessary is allocated). ! sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS, ! user_home_dir, Arguments::get_java_home()); Arguments::set_ext_dirs(buf); ! // Endorsed standards default directory. sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); Arguments::set_endorsed_dirs(buf); ! FREE_C_HEAP_ARRAY(char, buf, mtInternal); ! #undef SYS_EXTENSIONS_DIR ! #undef SYS_EXTENSIONS_DIRS ! ! #endif // __APPLE__ ! ! #undef SYS_EXT_DIR #undef EXTENSIONS_DIR #undef ENDORSED_DIR } //////////////////////////////////////////////////////////////////////////////// // breakpoint support
*** 3089,3099 **** sigAct.sa_flags = SA_SIGINFO|SA_RESTART; } else { sigAct.sa_sigaction = signalHandler; sigAct.sa_flags = SA_SIGINFO|SA_RESTART; } ! #if __APPLE__ // Needed for main thread as XNU (Mac OS X kernel) will only deliver SIGSEGV // (which starts as SIGBUS) on main thread with faulting address inside "stack+guard pages" // if the signal handler declares it will handle it on alternate stack. // Notice we only declare we will handle it on alt stack, but we are not // actually going to use real alt stack - this is just a workaround. --- 3092,3102 ---- sigAct.sa_flags = SA_SIGINFO|SA_RESTART; } else { sigAct.sa_sigaction = signalHandler; sigAct.sa_flags = SA_SIGINFO|SA_RESTART; } ! #ifdef __APPLE__ // Needed for main thread as XNU (Mac OS X kernel) will only deliver SIGSEGV // (which starts as SIGBUS) on main thread with faulting address inside "stack+guard pages" // if the signal handler declares it will handle it on alternate stack. // Notice we only declare we will handle it on alt stack, but we are not // actually going to use real alt stack - this is just a workaround.