src/os/solaris/vm/os_solaris.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.

*** 640,652 **** return privileges; } 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. --- 640,649 ----
*** 669,731 **** // 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 free(p) FREE_C_HEAP_ARRAY(char, p, mtInternal) ! #define getenv(n) ::getenv(n) ! #define EXTENSIONS_DIR "/lib/ext" #define ENDORSED_DIR "/lib/endorsed" - #define COMMON_DIR "/usr/jdk/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 ! */ { // Use dlinfo() to determine the correct java.library.path. // // If we're launched by the Java launcher, and the user // does not set java.library.path explicitly on the commandline, --- 666,723 ---- // Otherwise exit. // // Important note: if the location of libjvm.so changes this // code needs to be changed accordingly. ! // Base path of extensions installed on the system. ! #define SYS_EXT_DIR "/usr/jdk/packages" #define EXTENSIONS_DIR "/lib/ext" #define ENDORSED_DIR "/lib/endorsed" + char cpu_arch[12]; + // 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 = + MAX4((size_t)MAXPATHLEN, // For dll_dir & friends. + sizeof(SYS_EXT_DIR) + sizeof("/lib/") + strlen(cpu_arch), // invariant ld_library_path + (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); ! if (!set_boot_path('/', ':')) { return; } + } ! // Where to look for native libraries. { // Use dlinfo() to determine the correct java.library.path. // // If we're launched by the Java launcher, and the user // does not set java.library.path explicitly on the commandline,
*** 739,771 **** // // If we're not launched by the Java launcher, we may // get here with any/all of the LD_LIBRARY_PATH[_32|64] // settings. Again, dlinfo does exactly what we want. ! Dl_serinfo _info, *info = &_info; Dl_serpath *path; ! char* library_path; ! char *common_path; ! int i; ! // determine search path count and required buffer size if (dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info) == -1) { vm_exit_during_initialization("dlinfo SERINFOSIZE request", dlerror()); } ! // allocate new buffer and initialize ! info = (Dl_serinfo*)malloc(_info.dls_size); ! if (info == NULL) { ! vm_exit_out_of_memory(_info.dls_size, OOM_MALLOC_ERROR, ! "init_system_properties_values info"); ! } ! info->dls_size = _info.dls_size; ! info->dls_cnt = _info.dls_cnt; ! // obtain search path information if (dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info) == -1) { ! free(info); vm_exit_during_initialization("dlinfo SERINFO request", dlerror()); } path = &info->dls_serpath[0]; --- 731,759 ---- // // If we're not launched by the Java launcher, we may // get here with any/all of the LD_LIBRARY_PATH[_32|64] // settings. Again, dlinfo does exactly what we want. ! Dl_serinfo info_sz, *info = &info_sz; Dl_serpath *path; ! char *library_path; ! char *common_path = buf; ! // Determine search path count and required buffer size. if (dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info) == -1) { vm_exit_during_initialization("dlinfo SERINFOSIZE request", dlerror()); } ! // Allocate new buffer and initialize. ! info = (Dl_serinfo*)NEW_C_HEAP_ARRAY(char, info_sz.dls_size, mtInternal); ! info->dls_size = info_sz.dls_size; ! info->dls_cnt = info_sz.dls_cnt; ! // Obtain search path information. if (dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info) == -1) { ! FREE_C_HEAP_ARRAY(char, buf, mtInternal); ! FREE_C_HEAP_ARRAY(char, info, mtInternal); vm_exit_during_initialization("dlinfo SERINFO request", dlerror()); } path = &info->dls_serpath[0];
*** 776,890 **** // // However, to prevent the proliferation of improperly built native // libraries, the new path component /usr/jdk/packages is added here. // Determine the actual CPU architecture. - char cpu_arch[12]; sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch)); #ifdef _LP64 // If we are a 64-bit vm, perform the following translations: // sparc -> sparcv9 // i386 -> amd64 ! if (strcmp(cpu_arch, "sparc") == 0) strcat(cpu_arch, "v9"); ! else if (strcmp(cpu_arch, "i386") == 0) strcpy(cpu_arch, "amd64"); #endif ! // 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. ! size_t bufsize = sizeof(COMMON_DIR) + sizeof("/lib/") + strlen(cpu_arch); ! common_path = malloc(bufsize); ! if (common_path == NULL) { ! free(info); ! vm_exit_out_of_memory(bufsize, OOM_MALLOC_ERROR, ! "init_system_properties_values common_path"); ! } ! sprintf(common_path, COMMON_DIR "/lib/%s", cpu_arch); ! // struct size is more than sufficient for the path components obtained // through the dlinfo() call, so only add additional space for the path // components explicitly added here. ! bufsize = info->dls_size + strlen(common_path); ! library_path = malloc(bufsize); ! if (library_path == NULL) { ! free(info); ! free(common_path); ! vm_exit_out_of_memory(bufsize, OOM_MALLOC_ERROR, ! "init_system_properties_values library_path"); ! } library_path[0] = '\0'; // Construct the desired Java library path from the linker's library // search path. // // For compatibility, it is optimal that we insert the additional path // components specific to the Java VM after those components specified // in LD_LIBRARY_PATH (if any) but before those added by the ld.so // infrastructure. ! if (info->dls_cnt == 0) { // Not sure this can happen, but allow for it strcpy(library_path, common_path); } else { int inserted = 0; for (i = 0; i < info->dls_cnt; i++, path++) { uint_t flags = path->dls_flags & LA_SER_MASK; if (((flags & LA_SER_LIBPATH) == 0) && !inserted) { strcat(library_path, common_path); strcat(library_path, os::path_separator()); inserted = 1; } strcat(library_path, path->dls_name); strcat(library_path, os::path_separator()); } ! // eliminate trailing path separator library_path[strlen(library_path)-1] = '\0'; } // happens before argument parsing - can't use a trace flag // tty->print_raw("init_system_properties_values: native lib path: "); // tty->print_raw_cr(library_path); ! // callee copies into its own buffer Arguments::set_library_path(library_path); ! free(common_path); ! free(library_path); ! free(info); } ! /* ! * 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 = (char *) malloc(strlen(Arguments::get_java_home()) + ! sizeof(EXTENSIONS_DIR) + sizeof(COMMON_DIR) + ! sizeof(EXTENSIONS_DIR)); ! sprintf(buf, "%s" EXTENSIONS_DIR ":" COMMON_DIR EXTENSIONS_DIR, ! Arguments::get_java_home()); Arguments::set_ext_dirs(buf); - } ! /* Endorsed standards default directory. */ ! { ! char * 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 free ! #undef getenv #undef EXTENSIONS_DIR #undef ENDORSED_DIR - #undef COMMON_DIR - } void os::breakpoint() { BREAKPOINT; } --- 764,845 ---- // // However, to prevent the proliferation of improperly built native // libraries, the new path component /usr/jdk/packages is added here. // Determine the actual CPU architecture. sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch)); #ifdef _LP64 // If we are a 64-bit vm, perform the following translations: // sparc -> sparcv9 // i386 -> amd64 ! if (strcmp(cpu_arch, "sparc") == 0) { strcat(cpu_arch, "v9"); ! } else if (strcmp(cpu_arch, "i386") == 0) { strcpy(cpu_arch, "amd64"); + } #endif ! // Construct the invariant part of ld_library_path. ! sprintf(common_path, SYS_EXT_DIR "/lib/%s", cpu_arch); ! // Struct size is more than sufficient for the path components obtained // through the dlinfo() call, so only add additional space for the path // components explicitly added here. ! size_t library_path_size = info->dls_size + strlen(common_path); ! library_path = (char *)NEW_C_HEAP_ARRAY(char, library_path_size, mtInternal); library_path[0] = '\0'; // Construct the desired Java library path from the linker's library // search path. // // For compatibility, it is optimal that we insert the additional path // components specific to the Java VM after those components specified // in LD_LIBRARY_PATH (if any) but before those added by the ld.so // infrastructure. ! if (info->dls_cnt == 0) { // Not sure this can happen, but allow for it. strcpy(library_path, common_path); } else { int inserted = 0; + int i; for (i = 0; i < info->dls_cnt; i++, path++) { uint_t flags = path->dls_flags & LA_SER_MASK; if (((flags & LA_SER_LIBPATH) == 0) && !inserted) { strcat(library_path, common_path); strcat(library_path, os::path_separator()); inserted = 1; } strcat(library_path, path->dls_name); strcat(library_path, os::path_separator()); } ! // Eliminate trailing path separator. library_path[strlen(library_path)-1] = '\0'; } // happens before argument parsing - can't use a trace flag // tty->print_raw("init_system_properties_values: native lib path: "); // tty->print_raw_cr(library_path); ! // Callee copies into its own buffer. Arguments::set_library_path(library_path); ! FREE_C_HEAP_ARRAY(char, library_path, mtInternal); ! FREE_C_HEAP_ARRAY(char, info, 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); ! ! #undef SYS_EXT_DIR #undef EXTENSIONS_DIR #undef ENDORSED_DIR } void os::breakpoint() { BREAKPOINT; }