From: Hallvard Furuseth Date: Wed, 1 Dec 2010 10:48:43 +0000 (+0000) Subject: ITS#6663: Fix refint_nothing. X-Git-Tag: MIGRATION_CVS2GIT~392 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=9a9302a2f577397a04b5e944817b129945d1561e;p=openldap ITS#6663: Fix refint_nothing. Also move callback trace output out of inner loop in callback. --- diff --git a/servers/slapd/overlays/refint.c b/servers/slapd/overlays/refint.c index 7828e04e73..c1a8252765 100644 --- a/servers/slapd/overlays/refint.c +++ b/servers/slapd/overlays/refint.c @@ -55,6 +55,7 @@ typedef struct refint_attrs_s { BerVarray new_vals; BerVarray new_nvals; int ra_numvals; + int dont_empty; } refint_attrs; typedef struct dependents_s { @@ -415,8 +416,7 @@ refint_search_cb( ** if this attr exists in the search result, ** and it has a value matching the target: ** allocate an attr; - ** if this is a delete and there's only one value: - ** allocate the same attr again; + ** handle olcRefintNothing; ** */ @@ -433,8 +433,6 @@ refint_search_cb( na = NULL; for(i = 0, b = a->a_nvals; b[i].bv_val; i++) { - count++; - if(dnIsSuffix(&b[i], &rq->oldndn)) { /* first match? create structure */ if ( na == NULL ) { @@ -512,23 +510,14 @@ refint_search_cb( deleted++; } } + } - /* If this is a delete and no value would be left, and - * we have a nothing DN configured, allocate the attr again. - */ - if ( count == deleted && !BER_BVISNULL(&dd->nothing) ) - { - na = op->o_tmpcalloc( 1, - sizeof( refint_attrs ), - op->o_tmpmemctx ); - na->next = ip->attrs; - ip->attrs = na; - na->attr = ia->attr; - } + /* Deleting/replacing all values and a nothing DN is configured? */ + if ( deleted == i && na && !BER_BVISNULL(&dd->nothing) ) + na->dont_empty = 1; - Debug( LDAP_DEBUG_TRACE, "refint_search_cb: %s: %s (#%d)\n", - a->a_desc->ad_cname.bv_val, rq->olddn.bv_val, count ); - } + Debug( LDAP_DEBUG_TRACE, "refint_search_cb: %s: %s (#%d)\n", + a->a_desc->ad_cname.bv_val, rq->olddn.bv_val, i ); } } @@ -621,9 +610,9 @@ refint_repair( m->sml_values[0] = id->refint_dn; m->sml_nvalues[0] = id->refint_ndn; } - if ( !BER_BVISEMPTY( &rq->newdn ) || ( ra->next && - ra->attr == ra->next->attr ) ) - { + + /* Add values */ + if ( ra->dont_empty || !BER_BVISEMPTY( &rq->newdn ) ) { len = sizeof(Modifications); if ( ra->new_vals == NULL ) { @@ -657,11 +646,11 @@ refint_repair( } } + /* Delete values */ len = sizeof(Modifications); if ( ra->old_vals == NULL ) { len += 4*sizeof(BerValue); } - m = op2.o_tmpalloc( len, op2.o_tmpmemctx ); m->sml_next = op2.orm_modlist; op2.orm_modlist = m;