* 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 */
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 );
}