Audio/MidiJack: Fix invalid read: (3) of #5408

This atomically unsets the MidiJack reference in AudioJack right before
MidiJack is destroyed. This avoids AudioJack using a destroyed MidiJack
object.
This commit is contained in:
Johannes Lorenz
2020-04-18 10:04:21 +02:00
committed by Johannes Lorenz
parent 9e9c5acc17
commit e3cae80580
3 changed files with 7 additions and 3 deletions

View File

@@ -58,6 +58,7 @@ public:
// the jack callback is handled here, we call the midi client so that it can read
// it's midi data during the callback
AudioJack * addMidiClient(MidiJack *midiClient);
void removeMidiClient(void) { m_midiClient = nullptr; }
jack_client_t * jackClient() {return m_client;};
inline static QString name()
@@ -109,7 +110,7 @@ private:
bool m_active;
std::atomic<bool> m_stopped;
MidiJack *m_midiClient;
std::atomic<MidiJack *> m_midiClient;
QVector<jack_port_t *> m_outputPorts;
jack_default_audio_sample_t * * m_tempOutBufs;
surroundSampleFrame * m_outBuf;

View File

@@ -346,8 +346,8 @@ int AudioJack::processCallback( jack_nframes_t _nframes, void * _udata )
// add to the following sound processing
if( m_midiClient && _nframes > 0 )
{
m_midiClient->JackMidiRead(_nframes);
m_midiClient->JackMidiWrite(_nframes);
m_midiClient.load()->JackMidiRead(_nframes);
m_midiClient.load()->JackMidiWrite(_nframes);
}
for( int c = 0; c < channels(); ++c )

View File

@@ -116,6 +116,9 @@ MidiJack::~MidiJack()
{
if(jackClient())
{
// remove ourselves first (atomically), so we will not get called again
m_jackAudio->removeMidiClient();
if( jack_port_unregister( jackClient(), m_input_port) != 0){
printf("Failed to unregister jack midi input\n");
}