Commit 5462fc26 authored by Howard Chu's avatar Howard Chu
Browse files

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

parent 78cfaa3c
Pipeline #322 failed with stage
in 8 minutes and 11 seconds
......@@ -3546,6 +3546,7 @@ static int syncrepl_dsee_schema()
* 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;
......@@ -3767,6 +3768,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;
dni.syncstate = syncstate;
......@@ -5122,6 +5124,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,
......@@ -5263,9 +5296,11 @@ dn_callback(
} else
#endif
{
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 );
}
}
}
......
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