src/os/solaris/vm/os_solaris.cpp
Print this page
rev 6139 : 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.
@@ -669,59 +669,45 @@
// 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)
+ 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);
+ }
+ 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)
+ if (pslash != NULL) {
*pslash = '\0'; /* get rid of /lib */
}
}
+ }
+ Arguments::set_java_home(buf);
- 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('/', ':'))
+ if (!set_boot_path('/', ':')) {
return;
}
+ }
/*
* Where to look for native libraries
*/
{
@@ -739,11 +725,11 @@
//
// 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_serinfo info_sz, *info = &info_sz;
Dl_serpath *path;
char* library_path;
char *common_path;
int i;
@@ -751,21 +737,17 @@
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;
+ 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(info);
+ FREE_C_HEAP_ARRAY(char, info, mtInternal);
vm_exit_during_initialization("dlinfo SERINFO request", dlerror());
}
path = &info->dls_serpath[0];
@@ -782,39 +764,29 @@
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)
+ if (strcmp(cpu_arch, "sparc") == 0) {
strcat(cpu_arch, "v9");
- else if (strcmp(cpu_arch, "i386") == 0)
+ } 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");
- }
+ common_path = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
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 = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
library_path[0] = '\0';
// Construct the desired Java library path from the linker's library
// search path.
//
@@ -845,46 +817,34 @@
// 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);
+ FREE_C_HEAP_ARRAY(char, common_path, mtInternal);
+ FREE_C_HEAP_ARRAY(char, library_path, mtInternal);
+ FREE_C_HEAP_ARRAY(char, info, mtInternal);
}
/*
- * Extensions directories.
- *
+ * 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 = (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());
+ char buf[MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(COMMON_DIR) + sizeof(EXTENSIONS_DIR) + sizeof(ENDORSED_DIR)];
+
+ /* Extensions directories */
+ 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;
}