src/os/linux/vm/os_linux.cpp

Print this page
rev 6136 : 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.

*** 315,327 **** _physical_memory = (julong)sysconf(_SC_PHYS_PAGES) * (julong)sysconf(_SC_PAGESIZE); assert(processor_count() > 0, "linux error"); } 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. --- 315,324 ----
*** 344,487 **** // 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. ! */ #if defined(AMD64) || defined(_LP64) && (defined(SPARC) || defined(PPC) || defined(S390)) #define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib" #else #define DEFAULT_LIBPATH "/lib:/usr/lib" #endif #define EXTENSIONS_DIR "/lib/ext" #define ENDORSED_DIR "/lib/endorsed" #define REG_DIR "/usr/java/packages" { - /* 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> */ pslash = strrchr(buf, '/'); ! if (pslash != NULL) ! *pslash = '\0'; /* get rid of /lib */ } } ! 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 Linux 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). ! */ ! 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); ! /* ! * Get the user setting of LD_LIBRARY_PATH, and prepended it. It ! * should always exist (until the legacy problem cited above is ! * addressed). ! */ ! char *v = getenv("LD_LIBRARY_PATH"); 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); } 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). ! */ ! { ! 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()); 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); - } - } ! #undef malloc ! #undef getenv #undef EXTENSIONS_DIR #undef ENDORSED_DIR ! ! // Done ! return; } //////////////////////////////////////////////////////////////////////////////// // breakpoint support --- 341,452 ---- // 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. #if defined(AMD64) || defined(_LP64) && (defined(SPARC) || defined(PPC) || defined(S390)) #define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib" #else #define DEFAULT_LIBPATH "/lib:/usr/lib" #endif #define EXTENSIONS_DIR "/lib/ext" #define ENDORSED_DIR "/lib/endorsed" #define REG_DIR "/usr/java/packages" + // sysclasspath, java_home, dll_dir { 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}. ! } ! 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); ! 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 Linux 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). ! ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, sizeof(REG_DIR) + sizeof("/lib/") + ! strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH), mtInternal); sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch); ! // Get the user setting of LD_LIBRARY_PATH, and prepended it. It ! // should always exist (until the legacy problem cited above is ! // addressed). ! char *v = ::getenv("LD_LIBRARY_PATH"); if (v != NULL) { char *t = ld_library_path; ! // That's +1 for the colon and +1 for the trailing '\0'. ! ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, strlen(v) + 1 + strlen(t) + 1, mtInternal); sprintf(ld_library_path, "%s:%s", v, t); + FREE_C_HEAP_ARRAY(char, t, mtInternal); } Arguments::set_library_path(ld_library_path); + FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal); } ! // Buffer that fits both sprintfs. ! // 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). ! char buf[MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR) + sizeof(ENDORSED_DIR)]; ! ! // Extensions directories. ! sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_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); ! #undef DEFAULT_LIBPATH #undef EXTENSIONS_DIR #undef ENDORSED_DIR ! #undef REG_DIR } //////////////////////////////////////////////////////////////////////////////// // breakpoint support