pad: Don't leak user_data in gst_pad_start_task
authorJan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>
Thu, 9 Feb 2023 12:53:48 +0000 (13:53 +0100)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 10 Feb 2023 01:40:35 +0000 (01:40 +0000)
When the task already exists, we forgot to free the passed `user_data`.
This wasn't an issue for most C code, which doesn't pass a
`GDestroyNotify`, but bindings such as gstreamer-rs do!

That said, allocating a trampoline in gstreamer-rs just for it to get
thrown away again is awkward. Maybe we need a `gst_pad_resume_task`?

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3925>

subprojects/gstreamer/gst/gstpad.c

index db98933..caf9b36 100644 (file)
@@ -6324,6 +6324,7 @@ gst_pad_start_task (GstPad * pad, GstTaskFunction func, gpointer user_data,
   task = GST_PAD_TASK (pad);
   if (task == NULL) {
     task = gst_task_new (func, user_data, notify);
+    notify = NULL;
     gst_task_set_lock (task, GST_PAD_GET_STREAM_LOCK (pad));
     gst_task_set_enter_callback (task, pad_enter_thread, pad, NULL);
     gst_task_set_leave_callback (task, pad_leave_thread, pad, NULL);
@@ -6345,6 +6346,10 @@ gst_pad_start_task (GstPad * pad, GstTaskFunction func, gpointer user_data,
   res = gst_task_set_state (task, GST_TASK_STARTED);
   GST_OBJECT_UNLOCK (pad);
 
+  /* free user_data if it wasn't used for gst_task_new */
+  if (notify)
+    notify (user_data);
+
   return res;
 
   /* ERRORS */