audio: Add NULL check to SDL_UnbindAudioStreams
Build (All) / Create test plan (push) Waiting to run
Build (All) / level1 (push) Blocked by required conditions
Build (All) / level2 (push) Blocked by required conditions

This commit is contained in:
Carl Åstholm
2024-12-28 00:18:16 +01:00
committed by Ryan C. Gordon
parent 1b99467c71
commit 49153ebfc4
2 changed files with 6 additions and 2 deletions
+2 -2
View File
@@ -990,7 +990,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BindAudioStream(SDL_AudioDeviceID devid, SD
* *
* Unbinding a stream that isn't bound to a device is a legal no-op. * Unbinding a stream that isn't bound to a device is a legal no-op.
* *
* \param streams an array of audio streams to unbind. * \param streams an array of audio streams to unbind. Can be NULL or contain NULL.
* \param num_streams number streams listed in the `streams` array. * \param num_streams number streams listed in the `streams` array.
* *
* \threadsafety It is safe to call this function from any thread. * \threadsafety It is safe to call this function from any thread.
@@ -1007,7 +1007,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream * const
* This is a convenience function, equivalent to calling * This is a convenience function, equivalent to calling
* `SDL_UnbindAudioStreams(&stream, 1)`. * `SDL_UnbindAudioStreams(&stream, 1)`.
* *
* \param stream an audio stream to unbind from a device. * \param stream an audio stream to unbind from a device. Can be NULL.
* *
* \threadsafety It is safe to call this function from any thread. * \threadsafety It is safe to call this function from any thread.
* *
+4
View File
@@ -1949,6 +1949,10 @@ bool SDL_BindAudioStream(SDL_AudioDeviceID devid, SDL_AudioStream *stream)
// !!! FIXME: this and BindAudioStreams are mutex nightmares. :/ // !!! FIXME: this and BindAudioStreams are mutex nightmares. :/
void SDL_UnbindAudioStreams(SDL_AudioStream * const *streams, int num_streams) void SDL_UnbindAudioStreams(SDL_AudioStream * const *streams, int num_streams)
{ {
if (num_streams <= 0 || !streams) {
return; // nothing to do
}
/* to prevent deadlock when holding both locks, we _must_ lock the device first, and the stream second, as that is the order the audio thread will do it. /* to prevent deadlock when holding both locks, we _must_ lock the device first, and the stream second, as that is the order the audio thread will do it.
But this means we have an unlikely, pathological case where a stream could change its binding between when we lookup its bound device and when we lock everything, But this means we have an unlikely, pathological case where a stream could change its binding between when we lookup its bound device and when we lock everything,
so we double-check here. */ so we double-check here. */