From f499f4cfd2e98ee67d8267aea76a71bf8f47af68 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 31 Dec 2014 03:12:57 +0100 Subject: [PATCH] don't take temporary copy of MIDI sequence fixes potential boost shared_ptr double free. --- libs/backends/alsa/alsa_audiobackend.cc | 8 ++++---- libs/backends/alsa/alsa_audiobackend.h | 2 +- libs/backends/dummy/dummy_audiobackend.cc | 8 ++++---- libs/backends/dummy/dummy_audiobackend.h | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc index 3ccc97ec94..8bf8efe61d 100644 --- a/libs/backends/alsa/alsa_audiobackend.cc +++ b/libs/backends/alsa/alsa_audiobackend.cc @@ -1467,10 +1467,10 @@ AlsaAudioBackend::main_process_thread () i = 0; for (std::vector::const_iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it, ++i) { assert (_rmidi_out.size() > i); - const AlsaMidiBuffer src = static_cast(*it)->const_buffer(); + const AlsaMidiBuffer * src = static_cast(*it)->const_buffer(); AlsaMidiOut *rm = _rmidi_out.at(i); rm->sync_time (clock1); - for (AlsaMidiBuffer::const_iterator mit = src.begin (); mit != src.end (); ++mit) { + for (AlsaMidiBuffer::const_iterator mit = src->begin (); mit != src->end (); ++mit) { rm->send_event ((*mit)->timestamp(), (*mit)->data(), (*mit)->size()); } } @@ -1826,8 +1826,8 @@ void* AlsaMidiPort::get_buffer (pframes_t /* nframes */) for (std::vector::const_iterator i = get_connections ().begin (); i != get_connections ().end (); ++i) { - const AlsaMidiBuffer src = static_cast(*i)->const_buffer (); - for (AlsaMidiBuffer::const_iterator it = src.begin (); it != src.end (); ++it) { + const AlsaMidiBuffer * src = static_cast(*i)->const_buffer (); + for (AlsaMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) { (_buffer[_bufperiod]).push_back (boost::shared_ptr(new AlsaMidiEvent (**it))); } } diff --git a/libs/backends/alsa/alsa_audiobackend.h b/libs/backends/alsa/alsa_audiobackend.h index f9123875e6..3daae85b21 100644 --- a/libs/backends/alsa/alsa_audiobackend.h +++ b/libs/backends/alsa/alsa_audiobackend.h @@ -142,7 +142,7 @@ class AlsaMidiPort : public AlsaPort { DataType type () const { return DataType::MIDI; }; void* get_buffer (pframes_t nframes); - const AlsaMidiBuffer const_buffer () const { return _buffer[_bufperiod]; } + const AlsaMidiBuffer * const_buffer () const { return & _buffer[_bufperiod]; } void next_period() { if (_n_periods > 1) { get_buffer(0); _bufperiod = (_bufperiod + 1) % _n_periods; } } void set_n_periods(int n) { if (n > 0 && n < 3) { _n_periods = n; } } diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc index bd46a59cd0..087d652b9c 100644 --- a/libs/backends/dummy/dummy_audiobackend.cc +++ b/libs/backends/dummy/dummy_audiobackend.cc @@ -1769,10 +1769,10 @@ struct MidiEventSorter { } }; -void DummyMidiPort::set_loopback (const DummyMidiBuffer src) +void DummyMidiPort::set_loopback (DummyMidiBuffer const * const src) { _loopback.clear (); - for (DummyMidiBuffer::const_iterator it = src.begin (); it != src.end (); ++it) { + for (DummyMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) { _loopback.push_back (boost::shared_ptr(new DummyMidiEvent (**it))); } } @@ -1838,8 +1838,8 @@ void* DummyMidiPort::get_buffer (pframes_t n_samples) if (source->is_physical() && source->is_terminal()) { source->get_buffer(n_samples); // generate signal. } - const DummyMidiBuffer src = static_cast(*i)->const_buffer (); - for (DummyMidiBuffer::const_iterator it = src.begin (); it != src.end (); ++it) { + const DummyMidiBuffer *src = source->const_buffer (); + for (DummyMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) { _buffer.push_back (boost::shared_ptr(new DummyMidiEvent (**it))); } } diff --git a/libs/backends/dummy/dummy_audiobackend.h b/libs/backends/dummy/dummy_audiobackend.h index c7faf16896..56929d939c 100644 --- a/libs/backends/dummy/dummy_audiobackend.h +++ b/libs/backends/dummy/dummy_audiobackend.h @@ -193,10 +193,10 @@ class DummyMidiPort : public DummyPort { DataType type () const { return DataType::MIDI; }; void* get_buffer (pframes_t nframes); - const DummyMidiBuffer const_buffer () const { return _buffer; } + const DummyMidiBuffer * const_buffer () const { return &_buffer; } void setup_generator (int, float const); - void set_loopback (const DummyMidiBuffer src); + void set_loopback (DummyMidiBuffer const * const src); private: DummyMidiBuffer _buffer;