]> git.sur5r.net Git - openldap/commitdiff
Fix control parsing and controls free routine.
authorKurt Zeilenga <kurt@openldap.org>
Thu, 22 Jul 1999 04:47:58 +0000 (04:47 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Thu, 22 Jul 1999 04:47:58 +0000 (04:47 +0000)
libraries/libldap/controls.c
servers/slapd/controls.c

index c84ac8847801e46dcf3510ff007b806aec5befe2..d2b99dd7e9d86eb6b3b052c78697c4cdaf4cc596 100644 (file)
@@ -249,10 +249,10 @@ ldap_controls_free( LDAPControl **controls )
        assert( controls != NULL );
 
        if ( controls != NULL ) {
-               LDAPControl *c;
+               int i;
 
-               for(c = *controls; c != NULL; c++) {
-                       ldap_control_free( c );
+               for( i=0; controls[i] != NULL; i++) {
+                       ldap_control_free( controls[i] );
                }
 
                LDAP_FREE( controls );
index 37361cb47cde7e2493b63fdea4aec6e0afb12cda..09267a8bb2fa43c3bb63a23c48c1017fa00ee9e4 100644 (file)
@@ -52,6 +52,8 @@ int get_ctrls(
                goto return_results;
        }
 
+       Debug( LDAP_DEBUG_TRACE, "=> get_ctrls\n", 0, 0, 0 );
+
        if( op->o_protocol < LDAP_VERSION3 ) {
                rc = -1;
                errmsg = "controls require LDAPv3";
@@ -80,6 +82,8 @@ int get_ctrls(
                LDAPControl **tctrls;
 
                tctrl = ch_calloc( 1, sizeof(LDAPControl) );
+               tctrl->ldctl_oid = NULL;
+               tctrl->ldctl_value.bv_val = NULL;
 
                /* allocate pointer space for current controls (nctrls)
                 * + this control + extra NULL
@@ -104,39 +108,56 @@ int get_ctrls(
                }
 #endif
 
-
                tctrls[nctrls++] = tctrl;
                tctrls[nctrls] = NULL;
 
                tag = ber_scanf( ber, "{a" /*}*/, &tctrl->ldctl_oid );
 
-               if( tag != LBER_ERROR ) {
-                       tag = ber_peek_tag( ber, &len );
+               if( tag == LBER_ERROR ) {
+                       Debug( LDAP_DEBUG_TRACE, "=> get_ctrls: get oid failed.\n",
+                               0, 0, 0 );
+                       *ctrls = NULL;
+                       ldap_controls_free( tctrls );
+                       rc = -1;
+                       errmsg = "decoding controls error";
+                       goto return_results;
                }
 
+               Debug( LDAP_DEBUG_TRACE, "=> get_ctrls: %s\n",
+                       tctrl->ldctl_oid, 0, 0 );
+
+               tag = ber_peek_tag( ber, &len );
+
                if( tag == LBER_BOOLEAN ) {
                        ber_int_t crit;
                        tag = ber_scanf( ber, "b", &crit );
-                       tctrl->ldctl_iscritical = crit ? (char) 0 : (char) ~0;
-               }
 
-               if( tag != LBER_ERROR ) {
+                       if( tag == LBER_ERROR ) {
+                               Debug( LDAP_DEBUG_TRACE, "=> get_ctrls: get crit failed.\n",
+                                       0, 0, 0 );
+                               *ctrls = NULL;
+                               ldap_controls_free( tctrls );
+                               rc = -1;
+                               errmsg = "decoding controls error";
+                               goto return_results;
+                       }
+
+                       tctrl->ldctl_iscritical = crit ? (char) 0 : (char) ~0;
                        tag = ber_peek_tag( ber, &len );
                }
 
                if( tag == LBER_OCTETSTRING ) {
                        tag = ber_scanf( ber, "o", &tctrl->ldctl_value );
 
-               } else {
-                       tctrl->ldctl_value.bv_val = NULL;
-               }
-
-               if( tag == LBER_ERROR ) {
-                       *ctrls = NULL;
-                       ldap_controls_free( tctrls );
-                       rc = -1;
-                       errmsg = "decoding controls error";
-                       goto return_results;
+                       if( tag == LBER_ERROR ) {
+                               Debug( LDAP_DEBUG_TRACE, "=> get_ctrls: get value failed.\n",
+                                       0, 0, 0 );
+                               *ctrls = NULL;
+                               ldap_controls_free( tctrls );
+                               rc = -1;
+                               errmsg = "decoding controls error";
+                               goto return_results;
+                       }
                }
 
                if( tctrl->ldctl_iscritical &&
@@ -151,6 +172,9 @@ int get_ctrls(
        }
 
 return_results:
+       Debug( LDAP_DEBUG_TRACE, "<= get_ctrls: %d %d %s\n",
+               nctrls, rc, errmsg ? errmsg : "");
+
        if( sendres && rc != LDAP_SUCCESS ) {
                if( rc == -1 ) {
                        send_ldap_disconnect( conn, op, rc, errmsg );
@@ -180,4 +204,4 @@ int get_manageDSAit( Operation *op )
        }
 
        return 0;
-}
\ No newline at end of file
+}