Commit 19f8f2d3 authored by Quanah Gibson-Mount's avatar Quanah Gibson-Mount
Browse files

ITS#5750

parent d50035af
......@@ -3,8 +3,10 @@ OpenLDAP 2.4 Change Log
OpenLDAP 2.4.13 Engineering
Fixed liblutil hex conversion (ITS#5699)
Added slapd GSSAPI refactoring (ITS#5369)
Fixed slapd nameUIDPretty bitstring parsing (ITS#5750)
Fixed slapd overlay/database open with real structure (ITS#5724)
Fixed slapd parsing of read entry control (ITS#5741)
Added slapd PMI schema (ITS#5695)
Added slapd private databases in global overlays (ITS#5735,ITS#5736)
Added slapd support for certificateListExactMatch (ITS#5700)
Fixed slapd-bdb/hdb invalid db crash (ITS#5698)
......
......@@ -1105,12 +1105,7 @@ bitStringValidate(
...
*
* Note: normalization strips any leading "0"s, unless the
* bit string is exactly "'0'B", so the normalized example,
* in slapd, would result in
*
* 1.3.6.1.4.1.1466.0=#04024869,o=test,c=gb#'101'B
*
* Note:
* RFC 4514 clarifies that SHARP, i.e. "#", doesn't have to
* be escaped except when at the beginning of a value, the
* definition of Name and Optional UID appears to be flawed,
......@@ -1134,11 +1129,11 @@ bitStringValidate(
*
* in fact "com#'1'B" is a valid IA5 string.
*
* As a consequence, current slapd code assumes that the
* presence of portions of a BitString at the end of the string
* representation of a NameAndOptionalUID means a BitString
* is expected, and cause an error otherwise. This is quite
* arbitrary, and might change in the future.
* As a consequence, current slapd code takes the presence of
* #<valid BitString> at the end of the string representation
* of a NameAndOptionalUID to mean this is indeed a BitString.
* This is quite arbitrary - it has changed the past and might
* change in the future.
*/
......@@ -1209,7 +1204,8 @@ nameUIDPretty(
if ( rc == LDAP_SUCCESS ) {
ber_dupbv_x( &dnval, val, ctx );
dnval.bv_len -= uidval.bv_len + 1;
uidval.bv_val--;
dnval.bv_len -= ++uidval.bv_len;
dnval.bv_val[dnval.bv_len] = '\0';
} else {
......@@ -1226,36 +1222,18 @@ nameUIDPretty(
}
if( !BER_BVISNULL( &uidval ) ) {
int i, c, got1;
char *tmp;
tmp = slap_sl_realloc( out->bv_val, out->bv_len
+ STRLENOF( "#" ) + uidval.bv_len + 1,
+ uidval.bv_len + 1,
ctx );
if( tmp == NULL ) {
ber_memfree_x( out->bv_val, ctx );
return LDAP_OTHER;
}
out->bv_val = tmp;
out->bv_val[out->bv_len++] = '#';
out->bv_val[out->bv_len++] = '\'';
got1 = uidval.bv_len < sizeof("'0'B");
for( i = 1; i < uidval.bv_len - 2; i++ ) {
c = uidval.bv_val[i];
switch(c) {
case '0':
if( got1 ) out->bv_val[out->bv_len++] = c;
break;
case '1':
got1 = 1;
out->bv_val[out->bv_len++] = c;
break;
}
}
out->bv_val[out->bv_len++] = '\'';
out->bv_val[out->bv_len++] = 'B';
memcpy( out->bv_val + out->bv_len, uidval.bv_val, uidval.bv_len );
out->bv_len += uidval.bv_len;
out->bv_val[out->bv_len] = '\0';
}
}
......
......@@ -78,15 +78,15 @@ objectClass: groupOfUniqueNames
cn: Name and Optional UID
uniqueMember: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com
uniqueMember: #'1'B
uniqueMember: #'10'B
uniqueMember: #'0010'B
uniqueMember: dc=example,dc=com#'1000'B
uniqueMember: dc=example,dc=com#'0'B
uniqueMember: dc=example,dc=com#''B
description: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com //
only DN portion
description: #'1'B // empty "" DN
description: #'0010'B // empty "" DN with leading '0's
description: dc=example,dc=com#'1000'B // with DN portion
description: dc=example,dc=com#'0'B // with DN portion and just one '0'
description: dc=example,dc=com#''B // with DN portion + bitstring with no bits
dn: ou=Related Syntaxes,dc=example,dc=com
objectClass: organizationalUnit
......@@ -183,20 +183,21 @@ description: testUUID=597ae2f6-16a6-1027-98f4-abcdefABCDEF,DC=Example
# Searching database for nameAndOptionalUID="dc=example,dc=com"...
# Searching database for nameAndOptionalUID="dc=example,dc=com#'001000'B"...
# Searching database for nameAndOptionalUID="dc=example,dc=com#'1000'B"...
dn: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com
objectClass: groupOfUniqueNames
cn: Name and Optional UID
uniqueMember: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com
uniqueMember: #'1'B
uniqueMember: #'10'B
uniqueMember: #'0010'B
uniqueMember: dc=example,dc=com#'1000'B
uniqueMember: dc=example,dc=com#'0'B
uniqueMember: dc=example,dc=com#''B
description: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com //
only DN portion
description: #'1'B // empty "" DN
description: #'0010'B // empty "" DN with leading '0's
description: dc=example,dc=com#'1000'B // with DN portion
description: dc=example,dc=com#'0'B // with DN portion and just one '0'
description: dc=example,dc=com#''B // with DN portion + bitstring with no bits
# Searching database for uniqueMember~="dc=example,dc=com" (approx)...
dn: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com
......@@ -204,29 +205,29 @@ objectClass: groupOfUniqueNames
cn: Name and Optional UID
uniqueMember: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com
uniqueMember: #'1'B
uniqueMember: #'10'B
uniqueMember: #'0010'B
uniqueMember: dc=example,dc=com#'1000'B
uniqueMember: dc=example,dc=com#'0'B
uniqueMember: dc=example,dc=com#''B
description: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com //
only DN portion
description: #'1'B // empty "" DN
description: #'0010'B // empty "" DN with leading '0's
description: dc=example,dc=com#'1000'B // with DN portion
description: dc=example,dc=com#'0'B // with DN portion and just one '0'
description: dc=example,dc=com#''B // with DN portion + bitstring with no bits
# Searching database for uniqueMember~="dc=example,dc=com#'001000'B" (approx)...
# Searching database for uniqueMember~="dc=example,dc=com#'1000'B" (approx)...
dn: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com
objectClass: groupOfUniqueNames
cn: Name and Optional UID
uniqueMember: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com
uniqueMember: #'1'B
uniqueMember: #'10'B
uniqueMember: #'0010'B
uniqueMember: dc=example,dc=com#'1000'B
uniqueMember: dc=example,dc=com#'0'B
uniqueMember: dc=example,dc=com#''B
description: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com //
only DN portion
description: #'1'B // empty "" DN
description: #'0010'B // empty "" DN with leading '0's
description: dc=example,dc=com#'1000'B // with DN portion
description: dc=example,dc=com#'0'B // with DN portion and just one '0'
description: dc=example,dc=com#''B // with DN portion + bitstring with no bits
......@@ -226,12 +226,12 @@ uniqueMember: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com
uniqueMember: #'1'B
uniqueMember: #'0010'B
uniqueMember: dc=example,dc=com#'1000'B
uniqueMember: dc=example,dc=com#'0'B
uniqueMember: dc=example,dc=com#''B
description: cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com // only DN portion
description: #'1'B // empty "" DN
description: #'0010'B // empty "" DN with leading '0's
description: dc=example,dc=com#'1000'B // with DN portion
description: dc=example,dc=com#'0'B // with DN portion and just one '0'
description: dc=example,dc=com#''B // with DN portion + bitstring with no bits
dn: cn=Should Fail 1,cn=Name and Optional UID,ou=Related Syntaxes,dc=example,dc=com
objectClass: groupOfUniqueNames
......
......@@ -117,6 +117,19 @@ if test $RC != 0 ; then
exit $RC
fi
DN="dc=example,dc=com#'1000'B"
echo "Searching database for nameAndOptionalUID=\"$DN\"..."
echo "# Searching database for nameAndOptionalUID=\"$DN\"..." >> $SEARCHOUT
$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
"(uniqueMember=$DN)" >> $SEARCHOUT 2>&1
RC=$?
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
DN="dc=example,dc=com"
echo "Searching database for uniqueMember~=\"$DN\" (approx)..."
echo "# Searching database for uniqueMember~=\"$DN\" (approx)..." >> $SEARCHOUT
......@@ -130,7 +143,7 @@ if test $RC != 0 ; then
exit $RC
fi
DN="dc=example,dc=com#'001000'B"
DN="dc=example,dc=com#'1000'B"
echo "Searching database for uniqueMember~=\"$DN\" (approx)..."
echo "# Searching database for uniqueMember~=\"$DN\" (approx)..." >> $SEARCHOUT
$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment