X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fcontrols.c;h=d61be4e43641df908ba0f9469385a437c1a90fef;hb=afa2cd1893875266c58677cc640514c1d9eef41f;hp=76c2799236133b46dc3e2dcc760936d29b8e37cf;hpb=99f5983fb6e185fd1f135cb99776da6e581f71e1;p=openldap diff --git a/libraries/libldap/controls.c b/libraries/libldap/controls.c index 76c2799236..d61be4e436 100644 --- a/libraries/libldap/controls.c +++ b/libraries/libldap/controls.c @@ -1,8 +1,12 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ +/* + * Portions Copyright (C) The Internet Society (1997) + * ASN.1 fragments are from RFC 2251; see RFC for full legal notices. + */ /* LDAPv3 Controls (RFC2251) * @@ -38,6 +42,7 @@ ldap_int_put_controls( LDAPControl *const *c; assert( ld != NULL ); + assert( LDAP_VALID(ld) ); assert( ber != NULL ); if( ctrls == NULL ) { @@ -186,33 +191,27 @@ int ldap_int_get_controls( tag = ber_scanf( ber, "{a" /*}*/, &tctrl->ldctl_oid ); - if( tag != LBER_ERROR ) { - tag = ber_peek_tag( ber, &len ); + if( tag == LBER_ERROR ) { + *ctrls = NULL; + ldap_controls_free( tctrls ); + return LDAP_DECODING_ERROR; } + 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 ) { 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 ); - return LDAP_DECODING_ERROR; - } - *ctrls = tctrls; } @@ -284,7 +283,7 @@ ldap_controls_dup( LDAPControl *const *controls ) return NULL; } - new = (LDAPControl **) LDAP_MALLOC( i * sizeof(LDAPControl *) ); + new = (LDAPControl **) LDAP_MALLOC( (i+1) * sizeof(LDAPControl *) ); if( new == NULL ) { /* memory allocation failure */ @@ -365,7 +364,7 @@ ldap_control_dup( const LDAPControl *c ) } /* - * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* Adapted for inclusion into OpenLDAP by Kurt D. Zeilenga */ @@ -387,6 +386,10 @@ ldap_control_dup( const LDAPControl *c ) * Modification to OpenLDAP source by Novell, Inc. * June 2000 sfs Added control utilities */ +/* Note: A verbatim copy of version 2.0.1 of the OpenLDAP Public License + * can be found in the file "build/LICENSE-2.0.1" in this distribution + * of OpenLDAP Software. + */ /*--- ldap_create_control @@ -411,9 +414,9 @@ ldap_create_control( LDAPControl **ctrlp ) { LDAPControl *ctrl; - struct berval *bvalp; assert( requestOID != NULL ); + assert( ber != NULL ); assert( ctrlp != NULL ); ctrl = (LDAPControl *) LDAP_MALLOC( sizeof(LDAPControl) ); @@ -421,14 +424,11 @@ ldap_create_control( return LDAP_NO_MEMORY; } - if ( ber_flatten( ber, &bvalp ) == -1 ) { + if ( ber_flatten2( ber, &ctrl->ldctl_value, 1 ) == -1 ) { LDAP_FREE( ctrl ); return LDAP_NO_MEMORY; } - ctrl->ldctl_value = *bvalp; - ber_memfree( bvalp ); - ctrl->ldctl_oid = LDAP_STRDUP( requestOID ); ctrl->ldctl_iscritical = iscritical; @@ -452,6 +452,7 @@ int ldap_int_client_controls( LDAP *ld, LDAPControl **ctrls ) LDAPControl *const *c; assert( ld != NULL ); + assert( LDAP_VALID(ld) ); if( ctrls == NULL ) { /* use default server controls */