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.
This commit is contained in:
tt2468 2021-12-18 00:03:17 -08:00 committed by Jim
parent 0072629ceb
commit d07bd7dff2

View File

@ -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);
}
}
}