libobs: Fix race conditions

Uses obs_source_get_ref on the sources enumerated in the tick_sources
function in obs-video.c to ensure a reference has been incremented
before calling that source's video_tick, and replaces an
obs_source_addref with obs_source_get_ref in the push_audio_tree
function in obs-audio.c to ensure that it cannot increment a source that
has already decremented its reference to 0.
This commit is contained in:
jp9000 committed 2019-02-12 19:23:24 -08:00
1 parent 131fb7b460
commit 573197af5b
2 files changed
+8 -3

No files matched your search

+2 -2
View File
@@ -31,8 +31,8 @@ static void push_audio_tree(obs_source_t *parent, obs_source_t *source, void *p)
struct obs_core_audio *audio = p;
if (da_find(audio->render_order, &source, 0) == DARRAY_INVALID) {
obs_source_addref(source);
da_push_back(audio->render_order, &source);
obs_source_t *s = obs_source_get_ref(source);
if (s) da_push_back(audio->render_order, &s);
}
UNUSED_PARAMETER(parent);
+6 -1
View File
@@ -58,8 +58,13 @@ static uint64_t tick_sources(uint64_t cur_time, uint64_t last_time)
source = data->first_source;
while (source) {
obs_source_video_tick(source, seconds);
struct obs_source *cur_source = obs_source_get_ref(source);
source = (struct obs_source*)source->context.next;
if (cur_source) {
obs_source_video_tick(cur_source, seconds);
obs_source_release(cur_source);
}
}
pthread_mutex_unlock(&data->sources_mutex);