Fixed slapo-dynlist behavior with simple filters (ITS#6421)
Fixed slapd-ldif access outside database directory (ITS#6414)
Fixed slapd-null extraneous assert (ITS#6403)
+ Fixed slapo-collect REP_ENTRY flag handling (ITS#5340,ITS#6423)
+ Fixed slapo-dynlist REP_ENTRY flag handling (ITS#5340,ITS#6423)
+ Fixed slapo-rwm REP_ENTRY flag handling (ITS#5340,ITS#6423)
Fixed slapo-translucent with back-null (ITS#6403)
Fixed slapo-unique criteria checking (ITS#6270)
+ Fixed slapo-valsort REP_ENTRY flag handling (ITS#5340,ITS#6423)
Build Environment
Deleted broken LBER_INVALID macro (ITS#6402)
Fixed test058 kill usage (ITS#6420)
* 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 */
if ( !( rs->sr_flags & REP_ENTRY_MODIFIABLE ) ) {
e = entry_dup( rs->sr_entry );
e_flags |= ( REP_ENTRY_MODIFIABLE | REP_ENTRY_MUSTBEFREED );
+ e_flags &= ~REP_ENTRY_MUSTRELEASE;
} else {
e = rs->sr_entry;
}
(void)rwm_attrs( op, rs, &e->e_attrs, 1 );
if ( rs->sr_flags & REP_ENTRY_MUSTRELEASE ) {
+ /* ITS#6423: REP_ENTRY_MUSTRELEASE incompatible
+ * with REP_ENTRY_MODIFIABLE */
+ if ( rs->sr_entry == e ) {
+ rc = 1;
+ goto fail;
+ }
+
overlay_entry_release_ov( op, rs->sr_entry, 0, on );
}
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 );
}