src/os/bsd/vm/os_bsd.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.

@@ -304,13 +304,10 @@
   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.

@@ -333,14 +330,10 @@
   // 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: ...

@@ -362,52 +355,43 @@
         // 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)
+    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> (/lib on macosx) */
 #ifndef __APPLE__
                 pslash = strrchr(buf, '/');
-                if (pslash != NULL)
+        if (pslash != NULL) {
                     *pslash = '\0';   /* get rid of /lib */
+        }
 #endif
             }
         }
+    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
      *
      * Note: Due to a legacy implementation, most of the library path

@@ -427,44 +411,45 @@
          * 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);
+    ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, system_ext_size, mtInternal);
         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));
+    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);
 #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");
+    // 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);
+      ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, strlen(l) + 1 + strlen(t) + 1, mtInternal);
             sprintf(ld_library_path, "%s:%s", l, t);
-            free(t);
+      FREE_C_HEAP_ARRAY(char, t, mtInternal);
         }
 
-        char *v = getenv("DYLD_LIBRARY_PATH");
+    char *v = ::getenv("DYLD_LIBRARY_PATH");
 #else
-        char *v = getenv("LD_LIBRARY_PATH");
+    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);
+      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(t);
+      FREE_C_HEAP_ARRAY(char, t, mtInternal);
         }
 
 #ifdef __APPLE__
         // Apple's Java6 has "." at the beginning of java.library.path.
         // OpenJDK on Windows has "." at the end of java.library.path.

@@ -475,17 +460,18 @@
         // 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);
+      ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, strlen(t) + 3, mtInternal);
             sprintf(ld_library_path, "%s:%s", t, ".");
-            free(t);
+      FREE_C_HEAP_ARRAY(char, t, mtInternal);
         }
 #endif
 
         Arguments::set_library_path(ld_library_path);
+    FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal);
     }
 
     /*
      * Extensions directories.
      *

@@ -493,43 +479,34 @@
      * 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);
+    char *buf = (char *)NEW_C_HEAP_ARRAY(char, strlen(Arguments::get_java_home()) +
+                                         sizeof(EXTENSIONS_DIR) + system_ext_size, mtInternal);
         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());
+    char *buf = (char *)NEW_C_HEAP_ARRAY(char, strlen(Arguments::get_java_home()) + sizeof(EXTENSIONS_DIR) +
+                                         sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR), mtInternal);
+    sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR, Arguments::get_java_home());
 #endif
-
         Arguments::set_ext_dirs(buf);
+    FREE_C_HEAP_ARRAY(char, buf, mtInternal);
     }
 
     /* Endorsed standards default directory. */
-    {
-        char * buf;
-        buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR));
+  char buf[MAXPATHLEN + 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;
+#undef REG_DIR
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // breakpoint support