Index: modules/jndi/src/test/java/org/apache/harmony/jndi/tests/javax/naming/ldap/RdnTest.java =================================================================== --- modules/jndi/src/test/java/org/apache/harmony/jndi/tests/javax/naming/ldap/RdnTest.java (revision 548595) +++ modules/jndi/src/test/java/org/apache/harmony/jndi/tests/javax/naming/ldap/RdnTest.java (working copy) @@ -2104,6 +2104,34 @@ } catch (IllegalArgumentException e) {} } + /** + *

+ * Test method for 'javax.naming.ldap.Rdn.unescapeValue(String)' + *

+ *

+ * Here we are testing if a given attribute value string formated, returns + * the unformated value. In this case we are testing the special character + * "#" in the form "#GOFJMOII". + *

+ *

+ * The expected result is an exception. + *

+ */ + public void testUnescapeValue011() { + try { + assertEquals("te st ", Rdn.unescapeValue("te st \\ ")); + assertEquals("te\\st", Rdn.unescapeValue("te\\\\st")); + assertEquals("test", Rdn.unescapeValue("\"test\"")); + assertEquals("\"test", Rdn.unescapeValue("\"test")); + assertEquals("\"te\"st", Rdn.unescapeValue("\"te\"st")); + assertEquals("te\"st", Rdn.unescapeValue("\"te\"st\"")); + assertEquals("test", Rdn.unescapeValue(" \"test\" ")); + assertEquals("\"test\" ", Rdn.unescapeValue(" \"test\" \\ ")); + assertEquals("te1st\\", Rdn.unescapeValue(" \"te\\31st\\\" ")); + } catch (IllegalArgumentException e) { + } + } + public void testSerializationCompatibility() throws Exception{ Rdn object = new Rdn("t=\\20\\ te\\ s\\20t\\20\\20 + t2 = test1\\20\\ "); SerializationTest.verifyGolden(this, object); Index: modules/jndi/src/main/java/org/apache/harmony/jndi/internal/parser/LdapRdnParser.java =================================================================== --- modules/jndi/src/main/java/org/apache/harmony/jndi/internal/parser/LdapRdnParser.java (revision 548595) +++ modules/jndi/src/main/java/org/apache/harmony/jndi/internal/parser/LdapRdnParser.java (working copy) @@ -156,7 +156,27 @@ } else if (val.startsWith("#")) { return getByteFromHexString(val); } else { - char[] chars = new String(val.trim()).toCharArray(); + String tmpVal = val.trim(); + if (tmpVal.length() > 0 && tmpVal.charAt(0) == '\"' + && tmpVal.charAt(tmpVal.length() - 1) == '\"') { + if (tmpVal.length() == 1) { + val = ""; + } else { + val = tmpVal.substring(1, tmpVal.length() - 1); + } + } + char[] chars; + int pos = val.length() - 1; + boolean trailingSpace = false; + while (pos >= 0 && val.charAt(pos) == ' ') { + trailingSpace = true; + pos--; + } + if (pos >= 0 && val.charAt(pos) == '\\' && trailingSpace) { + chars = (new String(val.trim()) + " ").toCharArray(); + } else { + chars = new String(val.trim()).toCharArray(); + } return getUnEscapedValues(chars); } @@ -188,6 +208,11 @@ if (chars[i + 1] == ' ') { continue; } + if (chars[i + 1] == '\\') { + sb.append('\\'); + i = i + 1; + continue; + } if (!isSpecialChar(chars, i + 1) && !isSpecialChar(chars, i + 2)) { try { @@ -203,6 +228,7 @@ } } } catch (ArrayIndexOutOfBoundsException e) { + sb.append(chars[i]); } } }