mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-31 03:59:34 -05:00
fix permissive; cleanup
This commit is contained in:
parent
bfb6465533
commit
7760b20f7f
1 changed files with 44 additions and 34 deletions
|
|
@ -31,18 +31,19 @@
|
|||
|
||||
int
|
||||
modify_add_values(
|
||||
Entry *e,
|
||||
Entry *e,
|
||||
Modification *mod,
|
||||
int permissive,
|
||||
int permissive,
|
||||
const char **text,
|
||||
char *textbuf, size_t textlen )
|
||||
char *textbuf,
|
||||
size_t textlen )
|
||||
{
|
||||
int rc;
|
||||
const char *op;
|
||||
Attribute *a;
|
||||
Modification pmod = *mod;
|
||||
int rc;
|
||||
const char *op;
|
||||
Attribute *a;
|
||||
Modification pmod = *mod;
|
||||
|
||||
switch( mod->sm_op ) {
|
||||
switch ( mod->sm_op ) {
|
||||
case LDAP_MOD_ADD:
|
||||
op = "add";
|
||||
break;
|
||||
|
|
@ -54,10 +55,11 @@ modify_add_values(
|
|||
assert( 0 );
|
||||
}
|
||||
|
||||
/* check if values to add exist in attribute */
|
||||
a = attr_find( e->e_attrs, mod->sm_desc );
|
||||
if( a != NULL ) { /* check if values to add exist in attribute */
|
||||
int rc, i, j, p;
|
||||
MatchingRule *mr;
|
||||
if ( a != NULL ) {
|
||||
int rc, i, j, p;
|
||||
MatchingRule *mr;
|
||||
|
||||
mr = mod->sm_desc->ad_type->sat_equality;
|
||||
if( mr == NULL || !mr->smr_match ) {
|
||||
|
|
@ -70,12 +72,12 @@ modify_add_values(
|
|||
return LDAP_INAPPROPRIATE_MATCHING;
|
||||
}
|
||||
|
||||
if( permissive ) {
|
||||
for ( i=0; mod->sm_values[i].bv_val; i++ ) /* count 'em */;
|
||||
pmod.sm_values = (BerVarray) ch_malloc( i*sizeof( struct berval ));
|
||||
if( pmod.sm_nvalues != NULL ) {
|
||||
pmod.sm_nvalues = (BerVarray) ch_malloc(
|
||||
i*sizeof( struct berval ));
|
||||
if ( permissive ) {
|
||||
for ( i = 0; !BER_BVISNULL( &mod->sm_values[i] ); i++ ) /* count 'em */;
|
||||
pmod.sm_values = (BerVarray)ch_malloc( (i + 1)*sizeof( struct berval ) );
|
||||
if ( pmod.sm_nvalues != NULL ) {
|
||||
pmod.sm_nvalues = (BerVarray)ch_malloc(
|
||||
(i + 1)*sizeof( struct berval ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -85,11 +87,12 @@ modify_add_values(
|
|||
* server (whether from LDAP or from the underlying
|
||||
* database).
|
||||
*/
|
||||
for ( p=i=0; mod->sm_values[i].bv_val; i++ ) {
|
||||
int match;
|
||||
for ( p = i = 0; !BER_BVISNULL( &mod->sm_values[i] ); i++ ) {
|
||||
int match;
|
||||
|
||||
assert( a->a_vals[0].bv_val );
|
||||
for ( j=0; a->a_vals[j].bv_val; j++ ) {
|
||||
if( mod->sm_nvalues ) {
|
||||
for ( j = 0; !BER_BVISNULL( &a->a_vals[j] ); j++ ) {
|
||||
if ( mod->sm_nvalues ) {
|
||||
rc = value_match( &match, mod->sm_desc, mr,
|
||||
SLAP_MR_EQUALITY | SLAP_MR_VALUE_OF_ASSERTION_SYNTAX
|
||||
| SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH
|
||||
|
|
@ -101,10 +104,10 @@ modify_add_values(
|
|||
&a->a_vals[j], &mod->sm_values[i], text );
|
||||
}
|
||||
|
||||
if( rc == LDAP_SUCCESS && match == 0 ) {
|
||||
if( permissive ) break;
|
||||
|
||||
if ( rc == LDAP_SUCCESS && match == 0 ) {
|
||||
/* value already exists */
|
||||
if ( permissive ) break;
|
||||
|
||||
*text = textbuf;
|
||||
snprintf( textbuf, textlen,
|
||||
"modify/%s: %s: value #%d already exists",
|
||||
|
|
@ -116,31 +119,38 @@ modify_add_values(
|
|||
}
|
||||
}
|
||||
|
||||
if( permissive && !match ) {
|
||||
if( pmod.sm_nvalues ) {
|
||||
if ( permissive && match != 0 ) {
|
||||
if ( pmod.sm_nvalues ) {
|
||||
pmod.sm_nvalues[p] = mod->sm_nvalues[i];
|
||||
}
|
||||
pmod.sm_values[p++] = mod->sm_values[i];
|
||||
}
|
||||
}
|
||||
|
||||
if( permissive && p == 0 ) {
|
||||
/* all new values match exist */
|
||||
ch_free( pmod.sm_values );
|
||||
if( pmod.sm_nvalues ) ch_free( pmod.sm_nvalues );
|
||||
return LDAP_SUCCESS;
|
||||
if ( permissive ) {
|
||||
if ( p == 0 ) {
|
||||
/* all new values match exist */
|
||||
ch_free( pmod.sm_values );
|
||||
if ( pmod.sm_nvalues ) ch_free( pmod.sm_nvalues );
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
BER_BVZERO( &pmod.sm_values[p] );
|
||||
if ( pmod.sm_nvalues ) {
|
||||
BER_BVZERO( &pmod.sm_nvalues[p] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* no - add them */
|
||||
rc = attr_merge( e, mod->sm_desc, pmod.sm_values, pmod.sm_nvalues );
|
||||
|
||||
if( a != NULL && permissive ) {
|
||||
if ( a != NULL && permissive ) {
|
||||
ch_free( pmod.sm_values );
|
||||
if( pmod.sm_nvalues ) ch_free( pmod.sm_nvalues );
|
||||
if ( pmod.sm_nvalues ) ch_free( pmod.sm_nvalues );
|
||||
}
|
||||
|
||||
if( rc != 0 ) {
|
||||
if ( rc != 0 ) {
|
||||
/* this should return result of attr_merge */
|
||||
*text = textbuf;
|
||||
snprintf( textbuf, textlen,
|
||||
|
|
|
|||
Loading…
Reference in a new issue