[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
(ITS#3538) Substring filter normalization
Full_Name: Chris Weber
Version: 2.2.23
OS: Solaris 9
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (134.82.42.1)
I feel that the way in which OpenLDAP 2.2.23 normalizes substring filters is
probably incorrect. At present, substring filters are normalized like:
(cn=* ab) => (cn=*ab)
(cn=ab *) => (cn=ab*)
(cn=* ab *) => (cn=*ab*)
(cn=* ab * cd *) => (cn=*ab*cd*)
This treatment is due to each of a substring filter's "initial", "any", and
"final" strings being individually normalized out of context, as though they
were each an entire string rather than internal substrings of a larger string.
I've applied the following patch locally to restore the expected behavior.
The changes are to:
schema_init.c:UTF8StringNormalize
and cause substring filter parts to be normalized in their proper contexts.
Perhaps there's a better place or more general way to accomplish this within
OpenLDAP's source tree, but this is straightforward and seems to have no other
consequences.
--- openldap-2.2.23/servers/slapd/schema_init.c 2005-01-20 12:01:09.000000000
-0500
+++ openldap-2.2.23BU/servers/slapd/schema_init.c 2005-02-12 09:33:19.568860000
-0500
@@ -1361,7 +1361,10 @@
nvalue.bv_len = 0;
nvalue.bv_val = tmp.bv_val;
- wasspace=1; /* trim leading spaces */
+ wasspace = ( ( ( use & SLAP_MR_SUBSTR_ANY ) == SLAP_MR_SUBSTR_ANY )
+ || ( ( use & SLAP_MR_SUBSTR_FINAL ) == SLAP_MR_SUBSTR_FINAL ) )
+ ? 0 : 1; /* trim leading spaces? */
+
for( i=0; i<tmp.bv_len; i++) {
if ( ASCII_SPACE( tmp.bv_val[i] )) {
if( wasspace++ == 0 ) {
@@ -1375,7 +1378,9 @@
}
if( nvalue.bv_len ) {
- if( wasspace ) {
+ if( wasspace
+ && ( ( use & SLAP_MR_SUBSTR_INITIAL ) != SLAP_MR_SUBSTR_INITIAL )
+ && ( ( use & SLAP_MR_SUBSTR_ANY ) != SLAP_MR_SUBSTR_ANY ) ) {
/* last character was a space, trim it */
--nvalue.bv_len;
}