frei0rfilter: fix memory corruption on sink caps changes.
authorMathieu Duponchelle <mduponchelle1@gmail.com>
Mon, 10 Mar 2014 21:48:04 +0000 (22:48 +0100)
committerMathieu Duponchelle <mduponchelle1@gmail.com>
Tue, 11 Mar 2014 15:49:11 +0000 (16:49 +0100)
When the input size changed, the frei0r filters didn't take
it into account and ended up corrupting memory.

Fixes #726069

gst/frei0r/gstfrei0rfilter.c

index 85a8bec..0cb15c6 100644 (file)
@@ -40,15 +40,25 @@ gst_frei0r_filter_set_caps (GstBaseTransform * trans, GstCaps * incaps,
     GstCaps * outcaps)
 {
   GstFrei0rFilter *self = GST_FREI0R_FILTER (trans);
     GstCaps * outcaps)
 {
   GstFrei0rFilter *self = GST_FREI0R_FILTER (trans);
+  GstFrei0rFilterClass *klass = GST_FREI0R_FILTER_GET_CLASS (trans);
   GstVideoInfo info;
   GstVideoInfo info;
+  gboolean destroy_f0r_instance = FALSE;
 
   gst_video_info_init (&info);
   if (!gst_video_info_from_caps (&info, incaps))
     return FALSE;
 
 
   gst_video_info_init (&info);
   if (!gst_video_info_from_caps (&info, incaps))
     return FALSE;
 
+  if (self->width != info.width || self->height != info.height)
+    destroy_f0r_instance = TRUE;
+
   self->width = info.width;
   self->height = info.height;
 
   self->width = info.width;
   self->height = info.height;
 
+  if (self->f0r_instance && destroy_f0r_instance) {
+    klass->ftable->destruct (self->f0r_instance);
+    self->f0r_instance = NULL;
+  }
+
   return TRUE;
 }
 
   return TRUE;
 }