don't take temporary copy of MIDI sequence
authorRobin Gareus <robin@gareus.org>
Wed, 31 Dec 2014 02:12:57 +0000 (03:12 +0100)
committerRobin Gareus <robin@gareus.org>
Wed, 31 Dec 2014 02:19:00 +0000 (03:19 +0100)
fixes potential boost shared_ptr double free.

libs/backends/alsa/alsa_audiobackend.cc
libs/backends/alsa/alsa_audiobackend.h
libs/backends/dummy/dummy_audiobackend.cc
libs/backends/dummy/dummy_audiobackend.h

index 3ccc97ec946e427b82586011ce15b1172b274a4e..8bf8efe61db1e479662d5b56f7b305b4cf6b40ce 100644 (file)
@@ -1467,10 +1467,10 @@ AlsaAudioBackend::main_process_thread ()
                                i = 0;
                                for (std::vector<AlsaPort*>::const_iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it, ++i) {
                                        assert (_rmidi_out.size() > i);
-                                       const AlsaMidiBuffer src = static_cast<const AlsaMidiPort*>(*it)->const_buffer();
+                                       const AlsaMidiBuffer src = static_cast<const AlsaMidiPort*>(*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<AlsaPort*>::const_iterator i = get_connections ().begin ();
                                i != get_connections ().end ();
                                ++i) {
-                       const AlsaMidiBuffer src = static_cast<const AlsaMidiPort*>(*i)->const_buffer ();
-                       for (AlsaMidiBuffer::const_iterator it = src.begin (); it != src.end (); ++it) {
+                       const AlsaMidiBuffer src = static_cast<const AlsaMidiPort*>(*i)->const_buffer ();
+                       for (AlsaMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) {
                                (_buffer[_bufperiod]).push_back (boost::shared_ptr<AlsaMidiEvent>(new AlsaMidiEvent (**it)));
                        }
                }
index f9123875e6a371bb7994b5627114a9efacf65b53..3daae85b21157484d2b0bbfe2345e59a039af0a4 100644 (file)
@@ -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; } }
index bd46a59cd060381fe3fcf1aa2b7463de126a8625..087d652b9ccdc759d499f75fc878eaacff8aff7f 100644 (file)
@@ -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<DummyMidiEvent>(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<const DummyMidiPort*>(*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<DummyMidiEvent>(new DummyMidiEvent (**it)));
                        }
                }
index c7faf16896d9408562eb17fabd7c6c76cabd13dc..56929d939c3de4e1be9b3f69e6493a63475ce36e 100644 (file)
@@ -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;