6961765: Double byte characters corrupted in DN for LDAP referrals
authorweijun
Wed, 07 Mar 2012 10:15:41 +0800
changeset 12048 31669c0cea56
parent 12047 320a714614e9
child 12049 de3e33eb5fa1
6961765: Double byte characters corrupted in DN for LDAP referrals Reviewed-by: vinnie
jdk/src/share/classes/com/sun/jndi/toolkit/url/UrlUtil.java
jdk/test/com/sun/jndi/ldap/LdapUnicodeURL.java
--- 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());
+        }
+    }
+}