Fix control parsing and controls free routine.

This commit is contained in:
Kurt Zeilenga 1999-07-22 04:47:58 +00:00
parent 0ed1a76d27
commit 42304b7ada
2 changed files with 44 additions and 20 deletions

View 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 );

View 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;
}
}