On 21:42 Tue 16 Sep     , Mario Torre wrote:
> Hi all!
> 
> I just submitted this patch that fixes a problem in our System.getenv()
> method.
> 
> It's possible to have variable in the form of:
> 
> key=value=value=value
> 
> like (from my env list):
> 
> XDM_MANAGED=method=classic
> 
> cheers,
> Mario
> 
> 2008-09-16  Mario Torre  <[EMAIL PROTECTED]>
> 
>     * java/lang/System.java (getenv): Fix env entries of the form
>     key=value=value=value not parsed correctly. 
> 
> -- 
> Mario Torre, Software Developer, http://www.jroller.com/neugens/
> aicas Allerton Interworks Computer Automated Systems GmbH
> Haid-und-Neu-Straße 18 * D-76131 Karlsruhe * Germany
> http://www.aicas.com   * Tel: +49-721-663 968-53
> pgp key: http://subkeys.pgp.net/ PGP Key ID: 80F240CF
> Fingerprint: BA39 9666 94EC 8B73 27FA  FC7C 4086 63E3 80F2 40CF
> 
> USt-Id: DE216375633, Handelsregister HRB 109481, AG Mannheim
> Geschäftsführer: Dr. James J. Hunt
> 
> Please, support open standards:
> http://opendocumentfellowship.org/petition/
> http://www.nosoftwarepatents.com/

> ### Eclipse Workspace Patch 1.0
> #P classpath
> Index: java/lang/System.java
> ===================================================================
> RCS file: /sources/classpath/classpath/java/lang/System.java,v
> retrieving revision 1.62
> diff -u -r1.62 System.java
> --- java/lang/System.java     7 Jan 2008 21:11:24 -0000       1.62
> +++ java/lang/System.java     16 Sep 2008 19:26:17 -0000
> @@ -546,20 +546,28 @@
>      SecurityManager sm = SecurityManager.current; // Be thread-safe.
>      if (sm != null)
>        sm.checkPermission(new RuntimePermission("getenv.*"));
> +
>      if (environmentMap == null)
>        {
> -     List<String> environ = (List<String>)VMSystem.environ();
> -     Map<String,String> variables = new EnvironmentMap();
> -     for (String pair : environ)
> -       {
> -         String[] parts = pair.split("=");
> -         if (parts.length == 2)
> -           variables.put(parts[0], parts[1]);
> -         else
> -           variables.put(parts[0], "");
> -       }
> -     environmentMap = Collections.unmodifiableMap(variables);
> +        Map<String, String> _map = new HashMap();
> +        List<String> environ = (List<String>)VMSystem.environ();
> +        for (String envEntry : environ)
> +          {
> +            // avoid broken and null entries
> +            if (envEntry != null && !envEntry.endsWith("="))
> +              {
> +                // it's perfectly legal that some entries may be in the form
> +                // key=value=value=value
> +                int equalSignIndex = envEntry.indexOf('=');            
> +                String key = envEntry.substring(0, equalSignIndex);
> +                String value = envEntry.substring(equalSignIndex + 1);
> +                _map.put(key, value);
> +              }
> +          }
> +        
> +        environmentMap = Collections.unmodifiableMap(_map);
>        }
> +    
>      return environmentMap;
>    }
>  

Please be more careful when applying such fixes.  This patch
alters code which is nothing to do with the bug:

> -     List<String> environ = (List<String>)VMSystem.environ();
> -     Map<String,String> variables = new EnvironmentMap();
> +        Map<String, String> _map = new HashMap();
> +        List<String> environ = (List<String>)VMSystem.environ();

and thus breaks the implementation by replacing the EnvironmentMap
(necessary to ensure the contract of the returned collection)
with a raw HashMap.

Fixed in CVS with this patch:

2008-09-16  Andrew John Hughes  <[EMAIL PROTECTED]>

        * java/lang/System.java (getenv): Reinstate
        use of EnvironmentMap as opposed to raw
        HashMap.

-- 
Andrew :)

Support Free Java!
Contribute to GNU Classpath and the OpenJDK
http://www.gnu.org/software/classpath
http://openjdk.java.net
PGP Key: 94EFD9D8 (http://subkeys.pgp.net)
Fingerprint = F8EF F1EA 401E 2E60 15FA  7927 142C 2591 94EF D9D8
Index: java/lang/System.java
===================================================================
RCS file: /sources/classpath/classpath/java/lang/System.java,v
retrieving revision 1.63
diff -u -u -r1.63 System.java
--- java/lang/System.java       16 Sep 2008 19:41:44 -0000      1.63
+++ java/lang/System.java       16 Sep 2008 20:52:01 -0000
@@ -549,7 +549,7 @@
 
     if (environmentMap == null)
       {
-        Map<String, String> _map = new HashMap();
+       Map<String,String> variables = new EnvironmentMap();
         List<String> environ = (List<String>)VMSystem.environ();
         for (String envEntry : environ)
           {
@@ -561,11 +561,11 @@
                 int equalSignIndex = envEntry.indexOf('=');            
                 String key = envEntry.substring(0, equalSignIndex);
                 String value = envEntry.substring(equalSignIndex + 1);
-                _map.put(key, value);
+                variables.put(key, value);
               }
           }
         
-        environmentMap = Collections.unmodifiableMap(_map);
+        environmentMap = Collections.unmodifiableMap(variables);
       }
     
     return environmentMap;

Reply via email to