Pārlūkot izejas kodu

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.
Richard Stanway 9 gadi atpakaļ
vecāks
revīzija
bc231eda75
1 mainītis faili ar 10 papildinājumiem un 10 dzēšanām
  1. 10 10
      libobs/obs-source.c

+ 10 - 10
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))
 	if (is_audio_source(source) || is_composite_source(source))
 		allocate_audio_output_buffer(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)) {
 	if (is_audio_source(source)) {
 		pthread_mutex_lock(&obs->data.audio_sources_mutex);
 		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);
 		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_context_data_insert(&source->context,
 			&obs->data.sources_mutex,
 			&obs->data.sources_mutex,
 			&obs->data.first_source);
 			&obs->data.first_source);