From 42304b7ada72a8a19cac0e0422b26dfe27c42f51 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Thu, 22 Jul 1999 04:47:58 +0000 Subject: [PATCH] Fix control parsing and controls free routine. --- libraries/libldap/controls.c | 6 ++-- servers/slapd/controls.c | 58 +++++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/libraries/libldap/controls.c b/libraries/libldap/controls.c index c84ac88478..d2b99dd7e9 100644 --- a/libraries/libldap/controls.c +++ b/libraries/libldap/controls.c @@ -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 ); diff --git a/servers/slapd/controls.c b/servers/slapd/controls.c index 37361cb47c..09267a8bb2 100644 --- a/servers/slapd/controls.c +++ b/servers/slapd/controls.c @@ -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 +} -- 2.39.5