Fix crash when deleting MIDI trigger
The Model must be destroyed after the iterator, otherwise the iterator's d'tor will cause memory corruption trying to lock the model: ``` Invalid read of size 4 at pthread_rwlock_unlock (pthread_rwlock_unlock.c:39) by Glib::Threads::RWLock::ReaderLock::~ReaderLock() (threads.h:828) by void boost::checked_delete<Glib::Threads::RWLock::ReaderLock>(Glib::Threads::RWLock::ReaderLock*) (checked_delete.hpp:36) by boost::detail::sp_counted_impl_p<Glib::Threads::RWLock::ReaderLock>::dispose() (sp_counted_impl.hpp:89) by boost::detail::sp_counted_base::release() (sp_counted_base_gcc_atomic.hpp:120) by boost::detail::shared_count::~shared_count() (shared_count.hpp:432) by boost::shared_ptr<Glib::Threads::RWLock::ReaderLock>::~shared_ptr() (shared_ptr.hpp:335) by Evoral::Sequence<Temporal::Beats>::const_iterator::~const_iterator() (Sequence.h:224) by ARDOUR::MIDITrigger::~MIDITrigger() (triggerbox.cc:2037) by ARDOUR::MIDITrigger::~MIDITrigger() (triggerbox.cc:2039) by ARDOUR::TriggerBoxThread::delete_trigger(ARDOUR::Trigger*) (triggerbox.cc:4386) by ARDOUR::TriggerBoxThread::thread_work() (triggerbox.cc:4314) by ARDOUR::TriggerBoxThread::_thread_work(void*) (triggerbox.cc:4285) by fake_thread_start(void*) (pthread_utils.cc:101) by start_thread (pthread_create.c:477) by clone (clone.S:95) Address 0x28229798 is 24 bytes inside a block of size 56 free'd at free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) by Glib::Threads::RWLock::~RWLock() (in /usr/lib/x86_64-linux-gnu/libglibmm-2.4.so.1.3.0) by Evoral::Sequence<Temporal::Beats>::~Sequence() (Sequence.h:68) by ARDOUR::AutomatableSequence<Temporal::Beats>::~AutomatableSequence() (automatable_sequence.h:31) by ARDOUR::MidiModel::~MidiModel() (midi_model.h:58) by ARDOUR::MidiModel::~MidiModel() (midi_model.h:58) by void boost::checked_delete<ARDOUR::MidiModel>(ARDOUR::MidiModel*) (checked_delete.hpp:36) by boost::detail::sp_counted_impl_p<ARDOUR::MidiModel>::dispose() (sp_counted_impl.hpp:89) by boost::detail::sp_counted_base::release() (sp_counted_base_gcc_atomic.hpp:120) by boost::detail::shared_count::~shared_count() (shared_count.hpp:432) by boost::shared_ptr<ARDOUR::MidiModel>::~shared_ptr() (shared_ptr.hpp:335) by ARDOUR::MIDITrigger::~MIDITrigger() (triggerbox.cc:2037) by ARDOUR::MIDITrigger::~MIDITrigger() (triggerbox.cc:2039) by ARDOUR::TriggerBoxThread::delete_trigger(ARDOUR::Trigger*) (triggerbox.cc:4386) by ARDOUR::TriggerBoxThread::thread_work() (triggerbox.cc:4314) by ARDOUR::TriggerBoxThread::_thread_work(void*) (triggerbox.cc:4285) by fake_thread_start(void*) (pthread_utils.cc:101) by start_thread (pthread_create.c:477) by clone (clone.S:95) ```
This commit is contained in:
@@ -614,8 +614,8 @@ class LIBARDOUR_API MIDITrigger : public Trigger {
|
||||
Temporal::BBT_Offset _start_offset;
|
||||
Temporal::BBT_Offset _legato_offset;
|
||||
|
||||
MidiModel::const_iterator iter;
|
||||
boost::shared_ptr<MidiModel> model;
|
||||
MidiModel::const_iterator iter;
|
||||
|
||||
Evoral::PatchChange<MidiBuffer::TimeType> _patch_change[16];
|
||||
std::vector<int> _channel_map;
|
||||
|
||||
Reference in New Issue
Block a user