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;