mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-01 04:29:35 -05:00
guard against simultaneous REP_ENTRY_MUSTRELEASE and REP_ENTRY_MODIFIABLE (related to ITS#6423)
This commit is contained in:
parent
48b8970dad
commit
85621c882a
2 changed files with 25 additions and 7 deletions
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue