From: Vincent Penquerc'h Date: Thu, 2 Apr 2015 16:24:05 +0000 (+0100) Subject: a52dec: fix race in liba52dec lookup table initialization X-Git-Tag: 1.6.0~65 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f529481b3da32d9414219784bcee4f042e1dc86c;p=platform%2Fupstream%2Fgst-plugins-ugly.git 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 --- diff --git a/ext/a52dec/gsta52dec.c b/ext/a52dec/gsta52dec.c index f62ab4c7..b987482d 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),