Commit 85621c88 authored by Pierangelo Masarati's avatar Pierangelo Masarati
Browse files

guard against simultaneous REP_ENTRY_MUSTRELEASE and REP_ENTRY_MODIFIABLE (related to ITS#6423)

parent 48b8970d
......@@ -386,10 +386,18 @@ collect_response( Operation *op, SlapReply *rs )
* don't modify it directly. Make a copy and
* work with that instead.
*/
if ( !( rs->sr_flags & REP_ENTRY_MODIFIABLE )) {
rs->sr_entry = entry_dup( rs->sr_entry );
rs->sr_flags |= REP_ENTRY_MODIFIABLE |
REP_ENTRY_MUSTBEFREED;
if ( !( rs->sr_flags & REP_ENTRY_MODIFIABLE ) ) {
Entry *e;
e = entry_dup( rs->sr_entry );
if ( rs->sr_flags & REP_ENTRY_MUSTRELEASE ) {
overlay_entry_release_ov( op, rs->sr_entry, 0, on );
rs->sr_flags &= ~REP_ENTRY_MUSTRELEASE;
} else if ( rs->sr_flags & REP_ENTRY_MUSTBEFREED ) {
entry_free( rs->sr_entry );
}
rs->sr_entry = e;
rs->sr_flags |= REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED;
}
/* Loop for each attribute in this collectinfo */
......
......@@ -297,9 +297,19 @@ valsort_response( Operation *op, SlapReply *rs )
a = attr_find( rs->sr_entry->e_attrs, vi->vi_ad );
if ( !a ) continue;
if (( rs->sr_flags & ( REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED )) !=
( REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED )) {
rs->sr_entry = entry_dup( rs->sr_entry );
if (( rs->sr_flags & ( REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED ) ) !=
( REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED ) )
{
Entry *e;
e = entry_dup( rs->sr_entry );
if ( rs->sr_flags & REP_ENTRY_MUSTRELEASE ) {
overlay_entry_release_ov( op, rs->sr_entry, 0, on );
rs->sr_flags &= ~REP_ENTRY_MUSTRELEASE;
} else if ( rs->sr_flags & REP_ENTRY_MUSTBEFREED ) {
entry_free( rs->sr_entry );
}
rs->sr_entry = e;
rs->sr_flags |= REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED;
a = attr_find( rs->sr_entry->e_attrs, vi->vi_ad );
}
......
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