]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/controls.c
Add ftest (filter test) to the mix, needs work.
[openldap] / libraries / libldap / controls.c
index 6a814b80fe053a3082e29928689ef832f8a55f79..6dcf7364ecbc63d34f64d9e463107875f4a7e150 100644 (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;
@@ -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;
+}