]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/controls.c
Sync with 2.x
[openldap] / libraries / libldap / controls.c
index 34f49f534326f6324d972416e779d653189e33b3..58ca93e81a39720707543ae07a6c757f65449c98 100644 (file)
@@ -94,14 +94,14 @@ ldap_int_put_controls(
                }
 
 
-               if( ber_printf( ber, /*{*/"}" ) == -1 ) {
+               if( ber_printf( ber, /*{*/"N}" ) == -1 ) {
                        ld->ld_errno = LDAP_ENCODING_ERROR;
                        return ld->ld_errno;
                }
        }
 
 
-       if( ber_printf( ber, /*{*/"}" ) == -1 ) {
+       if( ber_printf( ber, /*{*/ "}" ) == -1 ) {
                ld->ld_errno = LDAP_ENCODING_ERROR;
                return ld->ld_errno;
        }
@@ -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;
@@ -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.
 
@@ -401,9 +403,9 @@ ldap_control_dup( const LDAPControl *c )
                                        SHOULD be freed by calling ldap_control_free() when done.
 ---*/
 
-LIBLDAP_F( int )
-ldap_int_create_control(
-       const char *requestOID,
+int
+ldap_create_control(
+       LDAP_CONST char *requestOID,
        BerElement *ber,
        int iscritical,
        LDAPControl **ctrlp )
@@ -411,28 +413,28 @@ 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 ) == LBER_ERROR ) {
+               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;
        }