[Date Prev][Date Next] [Chronological] [Thread] [Top]

=+= bug (ITS#273)



Hi Guys,

I think I know where the problem is coming from.

When doing a pattern search, slapd escapes the search string and
passes it to the regex library.  The function
servers/slapd/filterentry.c:strcpy_special() is supposed to escape
chars which the regex library would otherwise construe as special,
such as [],*,., etc.

Here's the bug: filterentry.c:test_substring_filter() calls
regcomp(re,pat,0).  The '0' selects POSIX Basic Regular Expression
syntax.  In my regex library, that means that '+' is an oridinary
char, while '\+' is a meta for match-one-or-more-times.
strcpy_special() translates '+' into '\+', converting it from an
oridinary char to a regex meta.

So, *=+= matches ===, ====, etc, but _not_ =+=

A bug in openldap, or a bug in glibc?  Who knows?  I have a new script
(hopefully it will work on your system) to demonstrate this.

--Noel


----------------------------------------------------------------------
bug-openldap-search-=+=
----------------------------------------------------------------------
#! /bin/sh
# bug-openldap-search-=+=
# Noel Burton-Krahn <noel@burton-krahn.com>
# Aug 23, 1999
# 
# This script reproduces a bug in openldap.  It seems that sometimes
# vals which contain the sting '=+=' cannot be found with wildcards.
# 
echo "testing ldap server at $LDAP_HOST:$LDAP_PORT"
echo -n "date: "
date

ldapadd -c -v -p "$LDAP_PORT" -D "$LDAP_BIND" -w "$LDAP_PASS" <<EOF
dn: cn=noel-bug-not-found,$LDAP_BASE
cn: not-found
sn: noel-bug
badsearch: =+=
description: This will not be found by '*=+='

dn: cn=noel-bug-found-wrong,$LDAP_BASE
cn: found-wrong
sn: noel-bug
badsearch: ===
description: This will be found by '*=+='

EOF

search='badsearch==+='
echo "search: $search should work"
ldapsearch -p "$LDAP_PORT" -b "$LDAP_BASE" $search
echo

search='description=*=+=*'
echo "search: $search should work"
ldapsearch -p "$LDAP_PORT" -b "$LDAP_BASE" $search
echo

for search in "*=+=" "*=+=*" "=+=*"; do
    search="badsearch=$search"
    echo "search: $search should work (BUG: it doesn't)"
    ldapsearch -p "$LDAP_PORT" -b "$LDAP_BASE" $search
    echo
done

ldapsearch -p "$LDAP_PORT" -L sn=noel-bug dn | 
sed -n -e 's/^dn: //p' |
xargs -i ldapdelete -v -p "$LDAP_PORT" -D "$LDAP_BIND" -w "$LDAP_PASS" {}