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;