Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
orbea -
OpenLDAP
Commits
5462fc26
Commit
5462fc26
authored
May 08, 2020
by
Howard Chu
Browse files
ITS#9227 syncrepl: don't delete non-replicated attrs
parent
78cfaa3c
Changes
1
Hide whitespace changes
Inline
Side-by-side
servers/slapd/syncrepl.c
View file @
5462fc26
...
...
@@ -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
);
}
}
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment