From d07bd7dff271499d334b87463267fb838c3ecab9 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Sat, 18 Dec 2021 00:03:17 -0800 Subject: [PATCH] libobs: Hold source ref during `source_remove` signal Holds an active reference to a source during signaling of the `source_remove` signal, to prevent receivers from being given an already-destroyed source. - Call obs_source_remove(source) - Receiver 1 gets signal, calls `obs_source_release(source)` - Receiver 2 gets signal, calls `obs_source_release(source)`, refs == -1, source destroyed - Receiver 3 gets signal, source already destroyed, is forced to ignore signal due to invalid source This is a theoretical situation which is currently possible in obs-websocket. --- libobs/obs-source.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 0fabe0694..346e63a95 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -793,8 +793,12 @@ void obs_source_remove(obs_source_t *source) return; if (!source->removed) { - source->removed = true; - obs_source_dosignal(source, "source_remove", "remove"); + obs_source_t *s = obs_source_get_ref(source); + if (s) { + s->removed = true; + obs_source_dosignal(s, "source_remove", "remove"); + obs_source_release(s); + } } }