From f7faf5e8e57cebd2ed58d54c4a325d824932d599 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 29 Aug 2024 12:10:23 -0400 Subject: [PATCH] osxaudio: Avoid dangling pointer on shutdown When tearing down the elements we were still referring to the ringbuffer unique_id as our property while it was already freed, leading to potential segfaults when accessing the property. Part-of: --- .../gst-plugins-good/sys/osxaudio/gstosxaudiosink.c | 7 +++++++ .../gst-plugins-good/sys/osxaudio/gstosxaudiosrc.c | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/subprojects/gst-plugins-good/sys/osxaudio/gstosxaudiosink.c b/subprojects/gst-plugins-good/sys/osxaudio/gstosxaudiosink.c index 4b48e0dd59..ac9183521c 100644 --- a/subprojects/gst-plugins-good/sys/osxaudio/gstosxaudiosink.c +++ b/subprojects/gst-plugins-good/sys/osxaudio/gstosxaudiosink.c @@ -239,6 +239,11 @@ gst_osx_audio_sink_change_state (GstElement * element, GstStateChangeReturn ret; switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + GST_OBJECT_LOCK (osxsink); + osxsink->device_id = kAudioDeviceUnknown; + GST_OBJECT_UNLOCK (osxsink); + break; default: break; } @@ -256,7 +261,9 @@ gst_osx_audio_sink_change_state (GstElement * element, ringbuffer = GST_OSX_AUDIO_RING_BUFFER (GST_AUDIO_BASE_SINK (osxsink)->ringbuffer); if (ringbuffer->core_audio->device_id != osxsink->device_id) { + GST_OBJECT_LOCK (osxsink); osxsink->device_id = ringbuffer->core_audio->device_id; + GST_OBJECT_UNLOCK (osxsink); g_object_notify (G_OBJECT (osxsink), "device"); } break; diff --git a/subprojects/gst-plugins-good/sys/osxaudio/gstosxaudiosrc.c b/subprojects/gst-plugins-good/sys/osxaudio/gstosxaudiosrc.c index 75793bb692..e519744dc1 100644 --- a/subprojects/gst-plugins-good/sys/osxaudio/gstosxaudiosrc.c +++ b/subprojects/gst-plugins-good/sys/osxaudio/gstosxaudiosrc.c @@ -210,6 +210,12 @@ gst_osx_audio_src_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL:{ + GST_OBJECT_LOCK (osxsrc); + osxsrc->device_id = kAudioDeviceUnknown; + GST_OBJECT_UNLOCK (osxsrc); + break; + } default: break; } @@ -224,7 +230,10 @@ gst_osx_audio_src_change_state (GstElement * element, GstStateChange transition) ringbuffer = GST_OSX_AUDIO_RING_BUFFER (GST_AUDIO_BASE_SRC (osxsrc)->ringbuffer); if (ringbuffer->core_audio->device_id != osxsrc->device_id) { + GST_OBJECT_LOCK (osxsrc); osxsrc->device_id = ringbuffer->core_audio->device_id; + GST_OBJECT_UNLOCK (osxsrc); + g_object_notify (G_OBJECT (osxsrc), "device"); } break;