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=*)");
* operational attributes from the entry, and do a regular ModDN.
*/
typedef struct dninfo {
syncinfo_t *si;
Entry *new_entry;
struct berval dn;
struct berval ndn;
......@@ -3010,6 +3011,7 @@ syncrepl_entry(
op->o_callback = &cb;
cb.sc_response = dn_callback;
cb.sc_private = &dni;
dni.si = si;
dni.new_entry = entry;
dni.modlist = modlist;
......@@ -4292,6 +4294,37 @@ void syncrepl_diff_entry( Operation *op, Attribute *old, Attribute *new,
*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
dn_callback(
Operation* op,
......@@ -4414,9 +4447,13 @@ dn_callback(
*/
}
syncrepl_diff_entry( op, rs->sr_entry->e_attrs,
{
Attribute *old = attrs_exdup( op, dni, rs->sr_entry->e_attrs );
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 ) {
......
Supports Markdown
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