Heap corruption in ALSA open error handling.

This commit is contained in:
Robin Davies
2024-09-15 06:29:04 -04:00
parent 8df23db41c
commit f762d8b396
+39 -14
View File
@@ -202,8 +202,16 @@ namespace pipedal
{ {
Close(); Close();
#ifdef ALSADRIVER_CONFIG_DBG #ifdef ALSADRIVER_CONFIG_DBG
snd_output_close(snd_output); if (snd_output)
snd_pcm_status_free(snd_status); {
snd_output_close(snd_output);
snd_output = nullptr;
}
if (snd_status)
{
snd_pcm_status_free(snd_status);
snd_status = nullptr;
}
#endif #endif
} }
@@ -1606,8 +1614,8 @@ namespace pipedal
int dataLength = 0; int dataLength = 0;
int dataIndex = 0; int dataIndex = 0;
size_t statusBytesRemaining = 0; size_t statusBytesRemaining = 0;
size_t data0; size_t data0 =0;
size_t data1; size_t data1 = 0;
size_t eventCount = 0; size_t eventCount = 0;
MidiEvent events[MAX_MIDI_EVENT]; MidiEvent events[MAX_MIDI_EVENT];
@@ -1655,16 +1663,16 @@ namespace pipedal
} }
void Close() void Close()
{ {
if (hIn)
{
snd_rawmidi_close(hIn);
hIn = nullptr;
}
if (hInParams) if (hInParams)
{ {
snd_rawmidi_params_free(hInParams); snd_rawmidi_params_free(hInParams);
hInParams = 0; hInParams = 0;
} }
if (hIn)
{
snd_rawmidi_close(hIn);
hIn = nullptr;
}
} }
int GetDataLength(uint8_t cc) int GetDataLength(uint8_t cc)
@@ -1875,14 +1883,21 @@ namespace pipedal
{ {
const auto &devices = channelSelection.GetInputMidiDevices(); const auto &devices = channelSelection.GetInputMidiDevices();
midiStates.resize(devices.size()); midiStates.reserve(devices.size());
for (size_t i = 0; i < devices.size(); ++i) for (size_t i = 0; i < devices.size(); ++i)
{ {
const auto &device = devices[i]; const auto &device = devices[i];
MidiState *state = new MidiState(); MidiState *midiState = nullptr;
midiStates[i] = state; try {
state->Open(device); midiState = new MidiState();
midiState->Open(device);
midiStates.push_back(midiState);
} catch (const std::exception &e)
{
// logged already.
delete midiState;
}
} }
} }
@@ -2098,16 +2113,26 @@ namespace pipedal
throw; throw;
} }
if (playbackHwParams) if (playbackHwParams)
{
snd_pcm_hw_params_free(playbackHwParams); snd_pcm_hw_params_free(playbackHwParams);
if (captureHwParams) playbackHwParams = nullptr;
}
if (captureHwParams) {
snd_pcm_hw_params_free(captureHwParams); snd_pcm_hw_params_free(captureHwParams);
captureHwParams = nullptr;
}
if (playbackHandle) if (playbackHandle)
{ {
snd_pcm_close(playbackHandle); snd_pcm_close(playbackHandle);
playbackHandle = nullptr;
} }
if (captureHandle) if (captureHandle)
{
snd_pcm_close(captureHandle); snd_pcm_close(captureHandle);
captureHandle = nullptr;
}
return result; return result;
} }