}
*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 */
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) {
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;
* June 2000 sfs Added control utilities
*/
/*---
- ldap_int_create_control
+ ldap_create_control
Internal function to create an LDAP control from the encoded BerElement.
---*/
int
-ldap_int_create_control(
- const char *requestOID,
+ldap_create_control(
+ LDAP_CONST char *requestOID,
BerElement *ber,
int iscritical,
LDAPControl **ctrlp )
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;
}
*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;
+}