ext/lame/gstlame.*: Fix leak (by calling lame_init_params() before lame_close())...
authorRoland Kay <roland.kay@ox.compsoc.net>
Thu, 14 Dec 2006 10:15:24 +0000 (10:15 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Thu, 14 Dec 2006 10:15:24 +0000 (10:15 +0000)
Original commit message from CVS:
Based on patch by: Roland Kay  <roland.kay at ox compsoc net>
* ext/lame/gstlame.c: (gst_lame_init), (gst_lame_chain),
(gst_lame_setup):
* ext/lame/gstlame.h:
Fix leak (by calling lame_init_params() before lame_close()); handle
NULL return from lame_init() more gracefully. Fixes #385311.

ext/lame/gstlame.c
ext/lame/gstlame.h

index dfbebab..7e7d27f 100644 (file)
@@ -572,6 +572,11 @@ gst_lame_init (GstLame * lame)
 
   /* create an encoder state so we can ask about defaults */
   lame->lgf = lame_init ();
+  if (lame->lgf == NULL)
+    goto init_error;
+
+  if (lame_init_params (lame->lgf) < 0)
+    goto init_error;
 
   lame->samplerate = 44100;
   lame->num_channels = 2;
@@ -623,6 +628,19 @@ gst_lame_init (GstLame * lame)
   lame->lgf = NULL;
 
   GST_DEBUG_OBJECT (lame, "done initializing");
+  lame->init_error = FALSE;
+  return;
+
+/* ERRORS */
+init_error:
+  {
+    GST_ERROR_OBJECT (lame, "error initializing");
+    lame->init_error = TRUE;
+    if (lame->lgf) {
+      lame_close (lame->lgf);
+      lame->lgf = NULL;
+    }
+  }
 }
 
 #define CHECK_AND_FIXUP_BITRATE(obj,pspec,rate) \
@@ -974,6 +992,9 @@ gst_lame_chain (GstPad * pad, GstBuffer * buf)
 
   GST_LOG_OBJECT (lame, "entered chain");
 
+  if (lame->init_error)
+    goto init_error;
+
   if (!lame->setup)
     goto not_setup;
 
@@ -1062,6 +1083,12 @@ not_setup:
         ("encoder not initialized (input is not audio?)"));
     return GST_FLOW_ERROR;
   }
+init_error:
+  {
+    gst_buffer_unref (buf);
+    GST_ELEMENT_ERROR (lame, LIBRARY, INIT, (NULL), (NULL));
+    return GST_FLOW_ERROR;
+  }
 }
 
 /* set up the encoder state */
@@ -1088,6 +1115,9 @@ gst_lame_setup (GstLame * lame)
 
   lame->lgf = lame_init ();
 
+  if (lame->lgf == NULL)
+    return FALSE;
+
   /* let lame choose a default samplerate */
   lame_set_out_samplerate (lame->lgf, 0);
 
index ebbc7e4..71bfacc 100644 (file)
@@ -53,6 +53,8 @@ struct _GstLame {
   /*< private >*/
   GstPad *srcpad, *sinkpad;
 
+  gboolean init_error; /* an error occured in the instance init function */
+
   gint samplerate;
   gint num_channels;
   gboolean setup;