]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/controls.c
Add missing semicolon.
[openldap] / servers / slapd / controls.c
index 37361cb47cde7e2493b63fdea4aec6e0afb12cda..b4d76d73fb1f6c13d4d262bf0607a42a8093bc96 100644 (file)
@@ -26,7 +26,7 @@ int get_ctrls(
        Operation *op,
        int sendres )
 {
-       int nctrls;
+       int nctrls = 0;
        ber_tag_t tag;
        ber_len_t len;
        char *opaque;
@@ -40,7 +40,7 @@ int get_ctrls(
        if( len == 0) {
                /* no controls */
                rc = LDAP_SUCCESS;
-               goto return_results;
+               return rc;
        }
 
        if(( tag = ber_peek_tag( ber, &len )) != LDAP_TAG_CONTROLS ) {
@@ -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";
@@ -59,7 +61,6 @@ int get_ctrls(
        }
 
        /* set through each element */
-       nctrls = 0;
        *ctrls = ch_malloc( 1 * sizeof(LDAPControl *) );
 
 #if 0
@@ -80,6 +81,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 +107,58 @@ 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;
                }
 
+               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 != 0);
                        tag = ber_peek_tag( ber, &len );
                }
 
+               Debug( LDAP_DEBUG_TRACE, "=> get_ctrls: oid=\"%s\" (%scritical)\n",
+                       tctrl->ldctl_oid, 
+                       tctrl->ldctl_iscritical ? "" : "non",
+                       0 );
+
                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 +173,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 +205,4 @@ int get_manageDSAit( Operation *op )
        }
 
        return 0;
-}
\ No newline at end of file
+}