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;
}