6961765: Double byte characters corrupted in DN for LDAP referrals
Reviewed-by: vinnie
--- a/jdk/src/share/classes/com/sun/jndi/toolkit/url/UrlUtil.java Tue Mar 06 20:34:38 2012 +0000
+++ b/jdk/src/share/classes/com/sun/jndi/toolkit/url/UrlUtil.java Wed Mar 07 10:15:41 2012 +0800
@@ -27,6 +27,7 @@
import java.net.MalformedURLException;
import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
/**
* Utilities for dealing with URLs.
@@ -61,29 +62,14 @@
* The string is subsequently converted using the specified encoding
*/
public static final String decode(String s, String enc)
- throws MalformedURLException, UnsupportedEncodingException {
-
- int length = s.length();
- byte[] bytes = new byte[length];
- int j = 0;
-
- for (int i = 0; i < length; i++) {
- if (s.charAt(i) == '%') {
- i++; // skip %
- try {
- bytes[j++] = (byte)
- Integer.parseInt(s.substring(i, i + 2), 16);
-
- } catch (Exception e) {
- throw new MalformedURLException("Invalid URI encoding: " + s);
- }
- i++; // skip first hex char; for loop will skip second one
- } else {
- bytes[j++] = (byte) s.charAt(i);
- }
+ throws MalformedURLException, UnsupportedEncodingException {
+ try {
+ return URLDecoder.decode(s, enc);
+ } catch (IllegalArgumentException iae) {
+ MalformedURLException mue = new MalformedURLException("Invalid URI encoding: " + s);
+ mue.initCause(iae);
+ throw mue;
}
-
- return new String(bytes, 0, j, enc);
}
/**
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/jndi/ldap/LdapUnicodeURL.java Wed Mar 07 10:15:41 2012 +0800
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 6961765
+ * @summary Double byte characters corrupted in DN for LDAP referrals
+ */
+
+import com.sun.jndi.ldap.LdapURL;
+
+public class LdapUnicodeURL {
+ public static void main(String[] args) throws Exception {
+ // First 3 characters of the CJK Unified Ideographs
+ String uid = "uid=\u4e00\u4e01\u4e02";
+ LdapURL ldURL = new LdapURL("ldap://www.example.com/" + uid);
+ if (!ldURL.getDN().equals(uid)) {
+ throw new Exception("uid changed to " + ldURL.getDN());
+ }
+ }
+}