Commit cc79c9e8 authored by Howard Chu's avatar Howard Chu Committed by Quanah Gibson-Mount
Browse files

ITS#9227 syncrepl: don't delete non-replicated attrs

parent 2f938166
...@@ -2788,6 +2788,7 @@ static struct berval generic_filterstr = BER_BVC("(objectclass=*)"); ...@@ -2788,6 +2788,7 @@ static struct berval generic_filterstr = BER_BVC("(objectclass=*)");
* operational attributes from the entry, and do a regular ModDN. * operational attributes from the entry, and do a regular ModDN.
*/ */
typedef struct dninfo { typedef struct dninfo {
syncinfo_t *si;
Entry *new_entry; Entry *new_entry;
struct berval dn; struct berval dn;
struct berval ndn; struct berval ndn;
...@@ -3010,6 +3011,7 @@ syncrepl_entry( ...@@ -3010,6 +3011,7 @@ syncrepl_entry(
op->o_callback = &cb; op->o_callback = &cb;
cb.sc_response = dn_callback; cb.sc_response = dn_callback;
cb.sc_private = &dni; cb.sc_private = &dni;
dni.si = si;
dni.new_entry = entry; dni.new_entry = entry;
dni.modlist = modlist; dni.modlist = modlist;
...@@ -4292,6 +4294,37 @@ void syncrepl_diff_entry( Operation *op, Attribute *old, Attribute *new, ...@@ -4292,6 +4294,37 @@ void syncrepl_diff_entry( Operation *op, Attribute *old, Attribute *new,
*ml = NULL; *ml = NULL;
} }
/* shallow copy attrs, excluding non-replicated attrs */
static Attribute *
attrs_exdup( Operation *op, dninfo *dni, Attribute *attrs )
{
int i;
Attribute *tmp, *anew;
if ( attrs == NULL ) return NULL;
/* count attrs */
for ( tmp = attrs,i=0; tmp; tmp=tmp->a_next ) i++;
anew = op->o_tmpalloc( i * sizeof(Attribute), op->o_tmpmemctx );
for ( tmp = anew; attrs; attrs=attrs->a_next ) {
if ( dni->si->si_anlist && !ad_inlist( attrs->a_desc, dni->si->si_anlist ))
continue;
if ( dni->si->si_exanlist && ad_inlist( attrs->a_desc, dni->si->si_exanlist ))
continue;
*tmp = *attrs;
tmp->a_next = tmp+1;
tmp++;
}
if ( tmp == anew ) {
/* excluded everything */
op->o_tmpfree( anew, op->o_tmpmemctx );
return NULL;
}
tmp[-1].a_next = NULL;
return anew;
}
static int static int
dn_callback( dn_callback(
Operation* op, Operation* op,
...@@ -4414,9 +4447,13 @@ dn_callback( ...@@ -4414,9 +4447,13 @@ dn_callback(
*/ */
} }
syncrepl_diff_entry( op, rs->sr_entry->e_attrs, {
dni->new_entry->e_attrs, &dni->mods, dni->modlist, Attribute *old = attrs_exdup( op, dni, rs->sr_entry->e_attrs );
is_ctx ); syncrepl_diff_entry( op, old,
dni->new_entry->e_attrs, &dni->mods, dni->modlist,
is_ctx );
op->o_tmpfree( old, op->o_tmpmemctx );
}
} }
} }
} else if ( rs->sr_type == REP_RESULT ) { } else if ( rs->sr_type == REP_RESULT ) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment