]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/search.c
Fix off by one bug
[openldap] / libraries / libldap / search.c
index ceeb779ab2ef8261a98ac15f61d7bda1c79bc563..2d2071030261cf7545a8e2f6dfd624717a169639 100644 (file)
@@ -96,6 +96,9 @@ ldap_search_ext(
 
        Debug( LDAP_DEBUG_TRACE, "ldap_search_ext\n", 0, 0, 0 );
 
+       assert( ld != NULL );
+       assert( LDAP_VALID( ld ) );
+
        /*
         * if timeout is provided, both tv_sec and tv_usec must
         * be non-zero
@@ -207,6 +210,9 @@ ldap_search(
 
        Debug( LDAP_DEBUG_TRACE, "ldap_search\n", 0, 0, 0 );
 
+       assert( ld != NULL );
+       assert( LDAP_VALID( ld ) );
+
        ber = ldap_build_search_req( ld, base, scope, filter, attrs,
            attrsonly, NULL, NULL, -1, -1 ); 
 
@@ -753,38 +759,39 @@ put_simple_filter(
 
                        if( dn == NULL ) {
                                if(! ldap_is_attr_desc( str ) ) goto done;
-                               break;
-                       }
+                       } else {
 
-                       *dn++ = '\0';
-                       rule = strchr( dn, ':' );
+                               *dn++ = '\0';
+                               rule = strchr( dn, ':' );
 
-                       if( rule == NULL ) {
-                               /* one colon */
-                               if ( strcmp(dn, "dn") == 0 ) {
-                                       /* must have attribute */
-                                       if( !ldap_is_attr_desc( str ) ) {
-                                               goto done;
-                                       }
+                               if( rule == NULL ) {
+                                       /* one colon */
+                                       if ( strcmp(dn, "dn") == 0 ) {
+                                               /* must have attribute */
+                                               if( !ldap_is_attr_desc( str ) ) {
+                                                       goto done;
+                                               }
 
-                                       rule = "";
+                                               rule = "";
 
-                               } else {
-                                       rule = dn;
-                                       dn = NULL;
-                               }
+                                       } else {
+                                         rule = dn;
+                                         dn = NULL;
+                                       }
                                
-                       } else {
-                               /* two colons */
-                               *rule++ = '\0';
+                               } else {
+                                       /* two colons */
+                                       *rule++ = '\0';
 
-                               if ( strcmp(dn, "dn") != 0 ) {
-                                       /* must have "dn" */
-                                       goto done;
+                                       if ( strcmp(dn, "dn") != 0 ) {
+                                               /* must have "dn" */
+                                               goto done;
+                                       }
                                }
+
                        }
 
-                       if ( *str == '\0' && *rule == '\0' ) {
+                       if ( *str == '\0' && ( !rule || *rule == '\0' ) ) {
                                /* must have either type or rule */
                                goto done;
                        }
@@ -793,13 +800,13 @@ put_simple_filter(
                                goto done;
                        }
 
-                       if ( *rule != '\0' && !ldap_is_attr_oid( rule ) ) {
+                       if ( rule && *rule != '\0' && !ldap_is_attr_oid( rule ) ) {
                                goto done;
                        }
 
                        rc = ber_printf( ber, "t{" /*}*/, ftype );
 
-                       if( rc != -1 && *rule != '\0' ) {
+                       if( rc != -1 && rule && *rule != '\0' ) {
                                rc = ber_printf( ber, "ts", LDAP_FILTER_EXT_OID, rule );
                        }
                        if( rc != -1 && *str != '\0' ) {
@@ -818,7 +825,7 @@ put_simple_filter(
                                }
                        }
                }
-               break;
+               goto done;
 
        default:
                if ( ldap_pvt_find_wildcard( value ) == NULL ) {