src/windows/classes/java/lang/ProcessEnvironment.java

Print this page

        

@@ -142,10 +142,11 @@
                 }
                 public void remove() { i.remove();}
             };
         }
         private static Map.Entry<String,String> checkedEntry (Object o) {
+            @SuppressWarnings("unchecked")
             Map.Entry<String,String> e = (Map.Entry<String,String>) o;
             nonNullString(e.getKey());
             nonNullString(e.getValue());
             return e;
         }

@@ -293,11 +294,30 @@
     private static native String environmentBlock();
 
     // Only for use by ProcessImpl.start()
     String toEnvironmentBlock() {
         // Sort Unicode-case-insensitively by name
-        List<Map.Entry<String,String>> list = new ArrayList<>(entrySet());
+        Set<Map.Entry<String,String>> entries = entrySet();
+        List<Map.Entry<String,String>> list = new ArrayList<>(entries);
+        
+        // check for "SystemRoot". Needed by MSVCRT.DLL
+        // Environment variable names are case-insensitive.
+        // So, must do an iterative search.
+        boolean found = false;
+        for (Map.Entry<String,String> entry : entries) {
+            String key = entry.getKey();
+            if (key.equalsIgnoreCase("SystemRoot")) {
+                found = true;
+                break;
+            }
+        }
+        if (!found) {
+            list.add(new AbstractMap.SimpleEntry<String,String>(
+                "SystemRoot", getenv("SystemRoot"))
+            );
+        }
+            
         Collections.sort(list, entryComparator);
 
         StringBuilder sb = new StringBuilder(size()*30);
         for (Map.Entry<String,String> e : list)
             sb.append(e.getKey())