X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fcontrols.c;h=7511f94f5dd33cd30e1113639f6afbfe75289dcb;hb=b8e48e95fb2c7aae6b3d50e42fb52f252faeb5fd;hp=067e4eaa5eccba9f85d797bcf08d3e01615394b1;hpb=4587e053e7ac2f4e80ac6ca66607190de0f1fc69;p=openldap diff --git a/libraries/libldap/controls.c b/libraries/libldap/controls.c index 067e4eaa5e..7511f94f5d 100644 --- a/libraries/libldap/controls.c +++ b/libraries/libldap/controls.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2006 The OpenLDAP Foundation. + * Copyright 1998-2012 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -51,6 +51,36 @@ * } */ +int +ldap_pvt_put_control( + const LDAPControl *c, + BerElement *ber ) +{ + if ( ber_printf( ber, "{s" /*}*/, c->ldctl_oid ) == -1 ) { + return LDAP_ENCODING_ERROR; + } + + if ( c->ldctl_iscritical /* only if true */ + && ( ber_printf( ber, "b", + (ber_int_t) c->ldctl_iscritical ) == -1 ) ) + { + return LDAP_ENCODING_ERROR; + } + + if ( !BER_BVISNULL( &c->ldctl_value ) /* only if we have a value */ + && ( ber_printf( ber, "O", &c->ldctl_value ) == -1 ) ) + { + return LDAP_ENCODING_ERROR; + } + + if ( ber_printf( ber, /*{*/"N}" ) == -1 ) { + return LDAP_ENCODING_ERROR; + } + + return LDAP_SUCCESS; +} + + /* * ldap_int_put_controls */ @@ -97,32 +127,8 @@ ldap_int_put_controls( } for( c = ctrls ; *c != NULL; c++ ) { - if ( ber_printf( ber, "{s" /*}*/, - (*c)->ldctl_oid ) == -1 ) - { - ld->ld_errno = LDAP_ENCODING_ERROR; - return ld->ld_errno; - } - - if( (*c)->ldctl_iscritical /* only if true */ - && ( ber_printf( ber, "b", - (ber_int_t) (*c)->ldctl_iscritical ) == -1 ) ) - { - ld->ld_errno = LDAP_ENCODING_ERROR; - return ld->ld_errno; - } - - if( (*c)->ldctl_value.bv_val != NULL /* only if we have a value */ - && ( ber_printf( ber, "O", - &((*c)->ldctl_value) ) == -1 ) ) - { - ld->ld_errno = LDAP_ENCODING_ERROR; - return ld->ld_errno; - } - - - if( ber_printf( ber, /*{*/"N}" ) == -1 ) { - ld->ld_errno = LDAP_ENCODING_ERROR; + ld->ld_errno = ldap_pvt_put_control( *c, ber ); + if ( ld->ld_errno != LDAP_SUCCESS ) { return ld->ld_errno; } } @@ -231,7 +237,7 @@ int ldap_pvt_get_controls( if( tag == LBER_OCTETSTRING ) { tag = ber_scanf( ber, "o", &tctrl->ldctl_value ); } else { - tctrl->ldctl_value.bv_val = NULL; + BER_BVZERO( &tctrl->ldctl_value ); } *ctrls = tctrls; @@ -246,9 +252,7 @@ int ldap_pvt_get_controls( void ldap_control_free( LDAPControl *c ) { -#ifdef LDAP_MEMORY_DEBUG - assert( c != NULL ); -#endif + LDAP_MEMORY_DEBUG_ASSERT( c != NULL ); if ( c != NULL ) { if( c->ldctl_oid != NULL) { @@ -269,9 +273,7 @@ ldap_control_free( LDAPControl *c ) void ldap_controls_free( LDAPControl **controls ) { -#ifdef LDAP_MEMORY_DEBUG - assert( controls != NULL ); -#endif + LDAP_MEMORY_DEBUG_ASSERT( controls != NULL ); if ( controls != NULL ) { int i; @@ -335,7 +337,7 @@ ldap_control_dup( const LDAPControl *c ) { LDAPControl *new; - if ( c == NULL ) { + if ( c == NULL || c->ldctl_oid == NULL ) { return NULL; } @@ -345,16 +347,11 @@ ldap_control_dup( const LDAPControl *c ) return NULL; } - if( c->ldctl_oid != NULL ) { - new->ldctl_oid = LDAP_STRDUP( c->ldctl_oid ); - - if(new->ldctl_oid == NULL) { - LDAP_FREE( new ); - return NULL; - } + new->ldctl_oid = LDAP_STRDUP( c->ldctl_oid ); - } else { - new->ldctl_oid = NULL; + if(new->ldctl_oid == NULL) { + LDAP_FREE( new ); + return NULL; } if( c->ldctl_value.bv_val != NULL ) { @@ -385,7 +382,9 @@ ldap_control_dup( const LDAPControl *c ) return new; } - +/* + * Find a LDAPControl - deprecated + */ LDAPControl * ldap_find_control( LDAP_CONST char *oid, @@ -405,21 +404,38 @@ ldap_find_control( } /* - ldap_create_control - - Internal function to create an LDAP control from the encoded BerElement. - - requestOID (IN) The OID to use in creating the control. - - ber (IN) The encoded BerElement to use in creating the control. - - iscritical (IN) 0 - Indicates the control is not critical to the operation. - non-zero - The control is critical to the operation. - - ctrlp (OUT) Returns a pointer to the LDAPControl created. This control - SHOULD be freed by calling ldap_control_free() when done. ----*/ + * Find a LDAPControl + */ +LDAPControl * +ldap_control_find( + LDAP_CONST char *oid, + LDAPControl **ctrls, + LDAPControl ***nextctrlp ) +{ + if ( oid == NULL || ctrls == NULL || *ctrls == NULL ) { + return NULL; + } + + for( ; *ctrls != NULL; ctrls++ ) { + if( strcmp( (*ctrls)->ldctl_oid, oid ) == 0 ) { + if ( nextctrlp != NULL ) { + *nextctrlp = ctrls + 1; + } + return *ctrls; + } + } + + if ( nextctrlp != NULL ) { + *nextctrlp = NULL; + } + + return NULL; +} + +/* + * Create a LDAPControl, optionally from ber - deprecated + */ int ldap_create_control( LDAP_CONST char *requestOID, @@ -430,7 +446,6 @@ ldap_create_control( LDAPControl *ctrl; assert( requestOID != NULL ); - assert( ber != NULL ); assert( ctrlp != NULL ); ctrl = (LDAPControl *) LDAP_MALLOC( sizeof(LDAPControl) ); @@ -438,7 +453,8 @@ ldap_create_control( return LDAP_NO_MEMORY; } - if ( ber_flatten2( ber, &ctrl->ldctl_value, 1 ) == -1 ) { + BER_BVZERO(&ctrl->ldctl_value); + if ( ber && ( ber_flatten2( ber, &ctrl->ldctl_value, 1 ) == -1 )) { LDAP_FREE( ctrl ); return LDAP_NO_MEMORY; } @@ -455,6 +471,54 @@ ldap_create_control( return LDAP_SUCCESS; } +/* + * Create a LDAPControl, optionally from value + */ +int +ldap_control_create( + LDAP_CONST char *requestOID, + int iscritical, + struct berval *value, + int dupval, + LDAPControl **ctrlp ) +{ + LDAPControl *ctrl; + + assert( requestOID != NULL ); + assert( ctrlp != NULL ); + + ctrl = (LDAPControl *) LDAP_CALLOC( sizeof(LDAPControl), 1 ); + if ( ctrl == NULL ) { + return LDAP_NO_MEMORY; + } + + ctrl->ldctl_iscritical = iscritical; + if ( requestOID != NULL ) { + ctrl->ldctl_oid = LDAP_STRDUP( requestOID ); + if ( ctrl->ldctl_oid == NULL ) { + ldap_control_free( ctrl ); + return LDAP_NO_MEMORY; + } + } + + if ( value && !BER_BVISNULL( value ) ) { + if ( dupval ) { + ber_dupbv( &ctrl->ldctl_value, value ); + if ( BER_BVISNULL( &ctrl->ldctl_value ) ) { + ldap_control_free( ctrl ); + return LDAP_NO_MEMORY; + } + + } else { + ctrl->ldctl_value = *value; + } + } + + *ctrlp = ctrl; + + return LDAP_SUCCESS; +} + /* * check for critical client controls and bitch if present * if we ever support critical controls, we'll have to @@ -469,7 +533,7 @@ int ldap_int_client_controls( LDAP *ld, LDAPControl **ctrls ) assert( LDAP_VALID( ld ) ); if( ctrls == NULL ) { - /* use default server controls */ + /* use default client controls */ ctrls = ld->ld_cctrls; }