]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/filter.c
Fix attribute description checks
[openldap] / libraries / libldap / filter.c
index a945cd71e49b8c7bd8d5f6215c1f1c75b4f5d2eb..1cf825822862b9baef8360db0f7c7eb378d1f0aa 100644 (file)
@@ -117,7 +117,7 @@ static int ldap_is_desc ( const char *str )
        return 0;
 
 options:
-       if( !LDAP_LDH( str[i] )) {
+       if( !LDAP_LDH( str[0] )) {
                return 0;
        }
        for( i=1; str[i]; i++ ) {
@@ -183,11 +183,11 @@ ldap_pvt_find_wildcard( const char *s )
 
                case '\\':
                        if( s[1] == '\0' ) return NULL;
+
                        if( LDAP_HEX( s[1] ) && LDAP_HEX( s[2] ) ) {
                                s+=2;
-                       }
 
-                       switch( s[1] ) {
+                       } else switch( s[1] ) {
                        default:
                                return NULL;
 
@@ -201,7 +201,7 @@ ldap_pvt_find_wildcard( const char *s )
                }
        }
 
-       return NULL;
+       return (char *) s;
 }
 
 /* unescape filter value */
@@ -222,7 +222,6 @@ ldap_pvt_filter_value_unescape( char *fval )
                        if ( fval[v] == '\0' ) {
                                /* escape at end of string */
                                return -1;
-
                        }
 
                        if (( v1 = hex2value( fval[v] )) >= 0 ) {
@@ -333,7 +332,7 @@ ldap_int_put_filter( BerElement *ber, char *str )
         * Note: tags in a choice are always explicit
         */
 
-       Debug( LDAP_DEBUG_TRACE, "put_filter \"%s\"\n", str, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "put_filter: \"%s\"\n", str, 0, 0 );
 
        parens = 0;
        while ( *str ) {
@@ -350,9 +349,9 @@ ldap_int_put_filter( BerElement *ber, char *str )
                                Debug( LDAP_DEBUG_TRACE, "put_filter: AND\n",
                                    0, 0, 0 );
 
-                               if ( (str = put_complex_filter( ber, str,
-                                   LDAP_FILTER_AND, 0 )) == NULL )
-                                       return( -1 );
+                               str = put_complex_filter( ber, str,
+                                   LDAP_FILTER_AND, 0 );
+                               if( str == NULL ) return( -1 );
 
                                parens--;
                                break;
@@ -361,9 +360,9 @@ ldap_int_put_filter( BerElement *ber, char *str )
                                Debug( LDAP_DEBUG_TRACE, "put_filter: OR\n",
                                    0, 0, 0 );
 
-                               if ( (str = put_complex_filter( ber, str,
-                                   LDAP_FILTER_OR, 0 )) == NULL )
-                                       return( -1 );
+                               str = put_complex_filter( ber, str,
+                                   LDAP_FILTER_OR, 0 );
+                               if( str == NULL ) return( -1 );
 
                                parens--;
                                break;
@@ -372,9 +371,9 @@ ldap_int_put_filter( BerElement *ber, char *str )
                                Debug( LDAP_DEBUG_TRACE, "put_filter: NOT\n",
                                    0, 0, 0 );
 
-                               if ( (str = put_complex_filter( ber, str,
-                                   LDAP_FILTER_NOT, 1 )) == NULL )
-                                       return( -1 );
+                               str = put_complex_filter( ber, str,
+                                   LDAP_FILTER_NOT, 0 );
+                               if( str == NULL ) return( -1 );
 
                                parens--;
                                break;
@@ -492,7 +491,7 @@ put_simple_filter(
        ber_tag_t       ftype;
        int             rc = -1;
 
-       Debug( LDAP_DEBUG_TRACE, "put_simple_filter \"%s\"\n",
+       Debug( LDAP_DEBUG_TRACE, "put_simple_filter: \"%s\"\n",
                str, 0, 0 );
 
        str = LDAP_STRDUP( str );
@@ -509,19 +508,16 @@ put_simple_filter(
        case '<':
                ftype = LDAP_FILTER_LE;
                *s = '\0';
-               if(! ldap_is_desc( str ) ) goto done;
                break;
 
        case '>':
                ftype = LDAP_FILTER_GE;
                *s = '\0';
-               if(! ldap_is_desc( str ) ) goto done;
                break;
 
        case '~':
                ftype = LDAP_FILTER_APPROX;
                *s = '\0';
-               if(! ldap_is_desc( str ) ) goto done;
                break;
 
        case ':':
@@ -536,11 +532,7 @@ put_simple_filter(
                        char *dn = strchr( str, ':' );
                        char *rule = NULL;
 
-                       if( dn == NULL ) {
-                               if(! ldap_is_desc( str ) ) goto done;
-
-                       } else {
-
+                       if( dn != NULL ) {
                                *dn++ = '\0';
                                rule = strchr( dn, ':' );
 
@@ -592,18 +584,23 @@ put_simple_filter(
                        if( rc != -1 && *str != '\0' ) {
                                rc = ber_printf( ber, "ts", LDAP_FILTER_EXT_TYPE, str );
                        }
-
                        if( rc != -1 ) {
                                ber_slen_t len = ldap_pvt_filter_value_unescape( value );
 
                                if( len >= 0 ) {
-                                       rc = ber_printf( ber, "totbN}",
-                                               LDAP_FILTER_EXT_VALUE, value, len,
-                                               LDAP_FILTER_EXT_DNATTRS, dn != NULL);
+                                       rc = ber_printf( ber, "to",
+                                               LDAP_FILTER_EXT_VALUE, value, len );
                                } else {
                                        rc = -1;
                                }
                        }
+                       if( rc != -1 && dn ) {
+                               rc = ber_printf( ber, "tb",
+                                       LDAP_FILTER_EXT_DNATTRS, (ber_int_t) 1 );
+                       }
+                       if( rc != -1 ) { 
+                               rc = ber_printf( ber, /*"{"*/ "N}" );
+                       }
                }
                goto done;
 
@@ -611,7 +608,6 @@ put_simple_filter(
                {
                        char *nextstar = ldap_pvt_find_wildcard( value );
                        if ( nextstar == NULL ) {
-                               rc = -1;
                                goto done;
                        } else if ( *nextstar == '\0' ) {
                                ftype = LDAP_FILTER_EQUALITY;
@@ -624,6 +620,8 @@ put_simple_filter(
                } break;
        }
 
+       if( !ldap_is_desc( str ) ) goto done;
+
        if ( ftype == LDAP_FILTER_PRESENT ) {
                rc = ber_printf( ber, "ts", ftype, str );
 
@@ -636,9 +634,8 @@ put_simple_filter(
                }
        }
 
-       if( rc != -1 ) rc = 0;
-
 done:
+       if( rc != -1 ) rc = 0;
        LDAP_FREE( str );
        return rc;
 }
@@ -673,7 +670,7 @@ put_substring_filter( BerElement *ber, char *type, char *val )
 
                *nextstar++ = '\0';
 
-               if ( *val != '\0' ) {
+               if ( *val != '\0' || ftype == LDAP_SUBSTRING_ANY ) {
                        ber_slen_t len = ldap_pvt_filter_value_unescape( val );
 
                        if ( len < 0  ) {
@@ -687,7 +684,7 @@ put_substring_filter( BerElement *ber, char *type, char *val )
        }
 
        if ( ber_printf( ber, /*"{{"*/ "N}N}" ) == -1 )
-               return( -1 );
+               return -1;
 
        return 0;
-}
\ No newline at end of file
+}