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

Re: =+= bug (ITS#269)



At 12:22 AM 8/24/99 GMT, noel@burton-krahn.com wrote:
>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.

Yes, the strcpy_special() routine was apparently not updated when
we switched from BSD regexp to POSIX regex.  I committed a patch
to devel (HEAD branch) which updates the code to use REG_EXTENDED
(instead of REG_BASIC) and updated strcpy_special (renamed to
strcpy_regex()) to escape regex operators.  We'll need to do
some testing to ensure that the operator set is correct.  In
particular, I am not sure if ')', '}', and ']' should be
escaped.  Per re_format(7) (HS POSIX regex), ^.[$()|*+?{\ should
be escaped.  (I believe this is correct per POSIX semantics).
However, GNU Regex documents leads me to believe that '}'
and ']' need to be escaped when -lgnuregex (or -lc with GNU
regex) is being used.  re_format(7) also states that escaping
patterns with escaped non-operator characters match the non-operator
character.  As such, escaping ')' and '}' unnecessarily should
not cause problems.

I won't apply the patch to OPENLDAP_REL_ENG_1_2 until I get back
some positive feedback.  Here is the -devel patch.  It will likely
apply without problem to 1.2 sources.

http://www.openldap.org/devel/cvsweb.cgi/servers/slapd/filterentry.c.diff?r1=1.9&r2=1.10

>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.

This, I believe, is an GNU regex extension to include all the
functionality that's "compatible"...  However, both + and \+
should match + when using REG_BASIC.  It appears though
that one has to specify RE_SYNTAX_POSIX_MINIMAL_BASIC|RE_SYNTAX_NO_GNU_OPS
and not REG_BASIC to get POSIX Basic Regular Expressions.

Since I switched the code to POSIX extended regex, I believe we
need to use REG_EXTENDED|RE_SYNTAX_NO_GNU_OPS.

Kurt