X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fcontrols.c;h=1ad762b38461622b772e0c385e593ce569b8b4e1;hb=b4243bc119b2f88318103176c7c671662c9ff371;hp=6a814b80fe053a3082e29928689ef832f8a55f79;hpb=5b856458a259f83b9dd3182eb3a924b82cac4906;p=openldap diff --git a/libraries/libldap/controls.c b/libraries/libldap/controls.c index 6a814b80fe..1ad762b384 100644 --- a/libraries/libldap/controls.c +++ b/libraries/libldap/controls.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -125,14 +125,13 @@ int ldap_int_get_controls( } *ctrls = NULL; - len = ber_pvt_ber_remaining(ber); + len = ber_pvt_ber_remaining( ber ); if( len == 0) { /* no controls */ return LDAP_SUCCESS; } - if(( tag = ber_peek_tag( ber, &len )) != LDAP_TAG_CONTROLS ) { if( tag == LBER_ERROR ) { /* decoding error */ @@ -337,8 +336,9 @@ ldap_control_dup( const LDAPControl *c ) new->ldctl_oid = NULL; } - if( c->ldctl_value.bv_len > 0 ) { - new->ldctl_value.bv_val = (char *) LDAP_MALLOC( c->ldctl_value.bv_len ); + if( c->ldctl_value.bv_val != NULL ) { + new->ldctl_value.bv_val = + (char *) LDAP_MALLOC( c->ldctl_value.bv_len + 1 ); if(new->ldctl_value.bv_val == NULL) { if(new->ldctl_oid != NULL) { @@ -348,10 +348,12 @@ ldap_control_dup( const LDAPControl *c ) return NULL; } + new->ldctl_value.bv_len = c->ldctl_value.bv_len; + AC_MEMCPY( new->ldctl_value.bv_val, c->ldctl_value.bv_val, c->ldctl_value.bv_len ); - new->ldctl_value.bv_len = c->ldctl_value.bv_len; + new->ldctl_value.bv_val[new->ldctl_value.bv_len] = '\0'; } else { new->ldctl_value.bv_len = 0; @@ -363,7 +365,7 @@ ldap_control_dup( const LDAPControl *c ) } /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* Adapted for inclusion into OpenLDAP by Kurt D. Zeilenga */ @@ -411,7 +413,7 @@ ldap_create_control( LDAPControl *ctrl; struct berval *bvalp; - if ( requestOID == NULL || ber == NULL || ctrlp == NULL ) { + if ( requestOID == NULL || ctrlp == NULL ) { return LDAP_PARAM_ERROR; } @@ -439,3 +441,34 @@ ldap_create_control( *ctrlp = ctrl; return LDAP_SUCCESS; } + +/* + * check for critical client controls and bitch if present + * if we ever support critical controls, we'll have to + * find a means for maintaining per API call control + * information. + */ +int ldap_int_client_controls( LDAP *ld, LDAPControl **ctrls ) +{ + LDAPControl *const *c; + + assert( ld != NULL ); + + if( ctrls == NULL ) { + /* use default server controls */ + ctrls = ld->ld_cctrls; + } + + if( ctrls == NULL || *ctrls == NULL ) { + return LDAP_SUCCESS; + } + + for( c = ctrls ; *c != NULL; c++ ) { + if( (*c)->ldctl_iscritical ) { + ld->ld_errno = LDAP_NOT_SUPPORTED; + return ld->ld_errno; + } + } + + return LDAP_SUCCESS; +}