From bc231eda75ae706593263ad7628e764c1bacb6f3 Mon Sep 17 00:00:00 2001 From: Richard Stanway Date: Wed, 13 Apr 2016 18:39:24 +0200 Subject: [PATCH] libobs: Fix a race condition when initializing audio sources The source shouldn't be inserted into obs->data.first_audio_source until it's fully initialized, or other threads will access source->control and dereference an uninitialized pointer. --- libobs/obs-source.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 064d9ece1..693390027 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -166,6 +166,16 @@ bool obs_source_init(struct obs_source *source) if (is_audio_source(source) || is_composite_source(source)) allocate_audio_output_buffer(source); + if (source->info.type == OBS_SOURCE_TYPE_TRANSITION) { + if (!obs_transition_init(source)) + return false; + } + + source->control = bzalloc(sizeof(obs_weak_source_t)); + source->deinterlace_top_first = true; + source->control->source = source; + source->audio_mixers = 0xF; + if (is_audio_source(source)) { pthread_mutex_lock(&obs->data.audio_sources_mutex); @@ -180,16 +190,6 @@ bool obs_source_init(struct obs_source *source) pthread_mutex_unlock(&obs->data.audio_sources_mutex); } - if (source->info.type == OBS_SOURCE_TYPE_TRANSITION) { - if (!obs_transition_init(source)) - return false; - } - - source->control = bzalloc(sizeof(obs_weak_source_t)); - source->deinterlace_top_first = true; - source->control->source = source; - source->audio_mixers = 0xF; - obs_context_data_insert(&source->context, &obs->data.sources_mutex, &obs->data.first_source);