mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-20 05:43:01 -05:00
ITS#9227 syncrepl: don't delete non-replicated attrs
This commit is contained in:
parent
78cfaa3c9f
commit
5462fc26b5
1 changed files with 36 additions and 1 deletions
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue