a52dec: fix race in liba52dec lookup table initialization
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Thu, 2 Apr 2015 16:24:05 +0000 (17:24 +0100)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Fri, 3 Apr 2015 08:57:38 +0000 (09:57 +0100)
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

index f62ab4c7c3dc9d56ad671c5f9df13b52d284ba2b..b987482d37caf804610e0e7985772b350801d777 100644 (file)
@@ -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),