X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fcontrols.c;h=9925357b0c2065a50d6764155424bd0f5b47eea2;hb=b0b8546f054f31b1a080defede171f833d20b124;hp=72857fb3bbafb404fa1ed2e7318650abf25c7f9d;hpb=49f414738569096eae2c94a4f05f0f3f2636b8b7;p=openldap diff --git a/libraries/libldap/controls.c b/libraries/libldap/controls.c index 72857fb3bb..9925357b0c 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; } - SAFEMEMCPY( new->ldctl_value.bv_val, c->ldctl_value.bv_val, + 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 */ @@ -386,7 +388,7 @@ ldap_control_dup( const LDAPControl *c ) * June 2000 sfs Added control utilities */ /*--- - ldap_int_create_control + ldap_create_control Internal function to create an LDAP control from the encoded BerElement. @@ -402,8 +404,8 @@ ldap_control_dup( const LDAPControl *c ) ---*/ int -ldap_int_create_control( - const char *requestOID, +ldap_create_control( + LDAP_CONST char *requestOID, BerElement *ber, int iscritical, LDAPControl **ctrlp ) @@ -411,31 +413,62 @@ ldap_int_create_control( LDAPControl *ctrl; struct berval *bvalp; - if ( requestOID == NULL || ber == NULL || ctrlp == NULL ) { + if ( requestOID == NULL || ctrlp == NULL ) { return LDAP_PARAM_ERROR; } - if ( ber_flatten( ber, &bvalp ) == LBER_ERROR ) { + ctrl = (LDAPControl *) LDAP_MALLOC( sizeof(LDAPControl) ); + if ( ctrl == NULL ) { return LDAP_NO_MEMORY; } - ctrl = (LDAPControl *) LBER_MALLOC( sizeof(LDAPControl) ); - if ( ctrl == NULL ) { - ber_bvfree( bvalp ); + if ( ber_flatten( ber, &bvalp ) == -1 ) { + LDAP_FREE( ctrl ); return LDAP_NO_MEMORY; } ctrl->ldctl_value = *bvalp; - LDAP_FREE( bvalp ); + ber_memfree( bvalp ); ctrl->ldctl_oid = LDAP_STRDUP( requestOID ); ctrl->ldctl_iscritical = iscritical; - if ( ctrl->ldctl_oid == NULL ) { - LBER_FREE( ctrl ); + if ( requestOID != NULL && ctrl->ldctl_oid == NULL ) { + ldap_control_free( ctrl ); return LDAP_NO_MEMORY; } *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; +}