From f529481b3da32d9414219784bcee4f042e1dc86c Mon Sep 17 00:00:00 2001 From: Vincent Penquerc'h Date: Thu, 2 Apr 2015 17:24:05 +0100 Subject: [PATCH] a52dec: fix race in liba52dec lookup table initialization a52_init initializes the IMDCT global state as well as creating a new state. When two A52 decoders are created (eg, when two AC3 tracks are contained in a video), calls to a52_init may happen at the same time, and the IMDCT initialization is not reentrant. https://bugzilla.gnome.org/show_bug.cgi?id=746781 --- ext/a52dec/gsta52dec.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/a52dec/gsta52dec.c b/ext/a52dec/gsta52dec.c index f62ab4c7c3..b987482d37 100644 --- a/ext/a52dec/gsta52dec.c +++ b/ext/a52dec/gsta52dec.c @@ -242,10 +242,12 @@ gst_a52dec_start (GstAudioDecoder * dec) { GstA52Dec *a52dec = GST_A52DEC (dec); GstA52DecClass *klass; + static GMutex init_mutex; GST_DEBUG_OBJECT (dec, "start"); klass = GST_A52DEC_CLASS (G_OBJECT_GET_CLASS (a52dec)); + g_mutex_lock (&init_mutex); #if defined(A52_ACCEL_DETECT) a52dec->state = a52_init (); /* This line is just to avoid being accused of not using klass */ @@ -253,6 +255,7 @@ gst_a52dec_start (GstAudioDecoder * dec) #else a52dec->state = a52_init (klass->a52_cpuflags); #endif + g_mutex_unlock (&init_mutex); if (!a52dec->state) { GST_ELEMENT_ERROR (GST_ELEMENT (a52dec), LIBRARY, INIT, (NULL),