Undo: clear list of trips to be recreated in UndoDeleteDive::undo()

UndoDeleteDive::tripList kept track of the trips to be recreated on
undo. But the list wasn't cleared on undo, thus on subsequent redo
the same trip was readded to the list, leading to double-free.

This could trivially be reproduced by repeated CTRL-Z, CTRL-SHIFT-Z
pairs.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2018-07-18 18:42:01 +02:00 committed by Lubomir I. Ivanov
parent 6c95714b9f
commit b51e616b6a

View file

@ -33,6 +33,7 @@ void UndoDeleteDive::undo()
record_dive(diveList.at(i));
}
mark_divelist_changed(true);
tripList.clear();
MainWindow::instance()->refreshDisplay();
}
@ -56,9 +57,10 @@ void UndoDeleteDive::redo()
undo_trip->dives = NULL;
// update all the dives who were in this trip to point to the copy of the
// trip that we are about to delete implicitly when deleting its last dive below
Q_FOREACH(struct dive *inner_dive, newList)
Q_FOREACH(struct dive *inner_dive, newList) {
if (inner_dive->divetrip == d->divetrip)
inner_dive->divetrip = undo_trip;
}
d->divetrip = undo_trip;
tripList.append(undo_trip);
}