validate: Various minor cleanups for lost memory or use after free

Includes several missing unref(), clear() or free() calls.
Reset current_seek since we just cleared all the seeks.
Reset all_configs to NULL to prevent double clearing.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9042>
This commit is contained in:
Doug Nazar 2025-05-21 09:36:22 -04:00 committed by GStreamer Marge Bot
parent d273b790e1
commit 09cf44aa13
10 changed files with 30 additions and 6 deletions

View File

@ -168,6 +168,7 @@ gst_mockdecryptor_transform_caps (GstBaseTransform * base,
gst_caps_intersect_full (transformed_caps, filter, gst_caps_intersect_full (transformed_caps, filter,
GST_CAPS_INTERSECT_FIRST); GST_CAPS_INTERSECT_FIRST);
gst_caps_replace (&transformed_caps, intersection); gst_caps_replace (&transformed_caps, intersection);
gst_caps_unref (intersection);
} }
GST_DEBUG_OBJECT (base, "returning %" GST_PTR_FORMAT, transformed_caps); GST_DEBUG_OBJECT (base, "returning %" GST_PTR_FORMAT, transformed_caps);

View File

@ -488,6 +488,7 @@ _append_accept_caps_failure_details (GstValidatePadMonitor * monitor,
} }
} }
gst_caps_unref (refused_caps);
gst_caps_unref (possible_caps); gst_caps_unref (possible_caps);
gst_object_unref (pad); gst_object_unref (pad);

View File

@ -90,6 +90,7 @@ gst_validate_reporter_get_priv (GstValidateReporter * reporter)
g_direct_equal, NULL, (GDestroyNotify) gst_validate_report_unref); g_direct_equal, NULL, (GDestroyNotify) gst_validate_report_unref);
g_mutex_init (&priv->reports_lock); g_mutex_init (&priv->reports_lock);
g_weak_ref_init (&priv->runner, NULL);
g_object_set_data_full (G_OBJECT (reporter), REPORTER_PRIVATE, priv, g_object_set_data_full (G_OBJECT (reporter), REPORTER_PRIVATE, priv,
(GDestroyNotify) _free_priv); (GDestroyNotify) _free_priv);
} }

View File

@ -2207,6 +2207,7 @@ select_stream_data_free (SelectStreamData * d)
{ {
gst_validate_action_unref (d->action); gst_validate_action_unref (d->action);
g_list_free_full (d->wanted_streams, g_free); g_list_free_full (d->wanted_streams, g_free);
g_rec_mutex_clear (&d->m);
} }
static void static void
@ -4387,6 +4388,7 @@ _execute_appsrc_push (GstValidateScenario * scenario,
g_signal_emit_by_name (appsink, "pull-sample", &sample, NULL); g_signal_emit_by_name (appsink, "pull-sample", &sample, NULL);
g_strfreev (pipeline_elements);
goto push_sample; goto push_sample;
} }
@ -5290,6 +5292,7 @@ handle_bus_message (MessageData * d)
g_list_free_full (priv->seeks, g_list_free_full (priv->seeks,
(GDestroyNotify) gst_validate_seek_information_free); (GDestroyNotify) gst_validate_seek_information_free);
priv->seeks = NULL; priv->seeks = NULL;
priv->current_seek = NULL;
SCENARIO_UNLOCK (scenario); SCENARIO_UNLOCK (scenario);
GST_DEBUG_OBJECT (scenario, "Got EOS; generate 'stop' action"); GST_DEBUG_OBJECT (scenario, "Got EOS; generate 'stop' action");
@ -5958,6 +5961,7 @@ gst_validate_scenario_dispose (GObject * object)
} }
gst_object_replace ((GstObject **) & priv->clock, NULL); gst_object_replace ((GstObject **) & priv->clock, NULL);
gst_object_unref (runner);
G_OBJECT_CLASS (gst_validate_scenario_parent_class)->dispose (object); G_OBJECT_CLASS (gst_validate_scenario_parent_class)->dispose (object);
} }
@ -7598,6 +7602,7 @@ _execute_start_http_server (GstValidateScenario * scenario,
err->message); err->message);
REPORT_UNLESS (sscanf (line, "PORT: %d", &port) == 1, done, REPORT_UNLESS (sscanf (line, "PORT: %d", &port) == 1, done,
"Failed to parse port number from server output: %s", line); "Failed to parse port number from server output: %s", line);
g_free (line);
server.port = port; server.port = port;
server.subprocess = subprocess; server.subprocess = subprocess;

View File

@ -518,7 +518,8 @@ gst_validate_deinit (void)
g_list_free (core_config); g_list_free (core_config);
core_config = NULL; core_config = NULL;
g_list_free_full (all_configs, (GDestroyNotify) gst_structure_free); g_list_free_full (g_steal_pointer (&all_configs),
(GDestroyNotify) gst_structure_free);
gst_validate_deinit_runner (); gst_validate_deinit_runner ();
gst_validate_scenario_deinit (); gst_validate_scenario_deinit ();

View File

@ -481,6 +481,7 @@ _set_videoconvert (ValidateSsimOverride * o,
caps = gst_pad_get_current_caps (pad); caps = gst_pad_get_current_caps (pad);
gst_object_unref (pad); gst_object_unref (pad);
gst_caps_replace (&priv->last_caps, caps); gst_caps_replace (&priv->last_caps, caps);
gst_caps_unref (caps);
gst_video_info_init (&priv->in_info); gst_video_info_init (&priv->in_info);
gst_video_info_init (&priv->out_info); gst_video_info_init (&priv->out_info);

View File

@ -86,6 +86,8 @@ GST_START_TEST (monitors_cleanup)
g_object_get_data ((GObject *) sink->sinkpads->data, "validate-monitor"); g_object_get_data ((GObject *) sink->sinkpads->data, "validate-monitor");
gst_check_objects_destroyed_on_unref (monitor, pmonitor1, pmonitor2, NULL); gst_check_objects_destroyed_on_unref (monitor, pmonitor1, pmonitor2, NULL);
gst_check_objects_destroyed_on_unref (pipeline, src, sink, NULL); gst_check_objects_destroyed_on_unref (pipeline, src, sink, NULL);
gst_object_unref (runner);
} }
GST_END_TEST; GST_END_TEST;

View File

@ -154,6 +154,7 @@ GST_START_TEST (buffer_before_segment)
_check_reports_refcount (srcpad, 2); _check_reports_refcount (srcpad, 2);
gst_object_unref (srcpad); gst_object_unref (srcpad);
gst_check_object_destroyed_on_unref (sink); gst_check_object_destroyed_on_unref (sink);
gst_object_unref (monitor);
ASSERT_OBJECT_REFCOUNT (runner, "runner", 2); ASSERT_OBJECT_REFCOUNT (runner, "runner", 2);
gst_object_unref (runner); gst_object_unref (runner);
} }
@ -221,11 +222,15 @@ GST_START_TEST (buffer_outside_segment)
buffer = gst_discont_buffer_new (); buffer = gst_discont_buffer_new ();
GST_BUFFER_PTS (buffer) = 10 * GST_SECOND; GST_BUFFER_PTS (buffer) = 10 * GST_SECOND;
GST_BUFFER_DURATION (buffer) = GST_SECOND; GST_BUFFER_DURATION (buffer) = GST_SECOND;
fail_if (GST_PAD_IS_FLUSHING (gst_element_get_static_pad (identity, pad = gst_element_get_static_pad (identity, "sink");
"sink"))); fail_if (GST_PAD_IS_FLUSHING (pad));
fail_if (GST_PAD_IS_FLUSHING (gst_element_get_static_pad (identity, gst_clear_object (&pad);
"src"))); pad = gst_element_get_static_pad (identity, "src");
fail_if (GST_PAD_IS_FLUSHING (gst_element_get_static_pad (sink, "sink"))); fail_if (GST_PAD_IS_FLUSHING (pad));
gst_clear_object (&pad);
pad = gst_element_get_static_pad (sink, "sink");
fail_if (GST_PAD_IS_FLUSHING (pad));
gst_clear_object (&pad);
fail_unless_equals_int (gst_pad_push (srcpad, buffer), GST_FLOW_OK); fail_unless_equals_int (gst_pad_push (srcpad, buffer), GST_FLOW_OK);
reports = gst_validate_runner_get_reports (runner); reports = gst_validate_runner_get_reports (runner);

View File

@ -206,6 +206,10 @@ _create_issues (GstValidateRunner * runner)
gst_object_unref (sinkpad); gst_object_unref (sinkpad);
gst_object_unref (funnel_sink1); gst_object_unref (funnel_sink1);
gst_object_unref (funnel_sink2); gst_object_unref (funnel_sink2);
free_element_monitor (fakemixer);
free_element_monitor (sink);
free_element_monitor (src2);
free_element_monitor (src1);
gst_check_objects_destroyed_on_unref (fakemixer, funnel_sink1, funnel_sink2, gst_check_objects_destroyed_on_unref (fakemixer, funnel_sink1, funnel_sink2,
NULL); NULL);
gst_check_objects_destroyed_on_unref (src1, srcpad1, NULL); gst_check_objects_destroyed_on_unref (src1, srcpad1, NULL);

View File

@ -37,6 +37,9 @@ GST_START_TEST (test_expression_parser)
fail_unless_equals_uint64 (start, 50 * GST_SECOND); fail_unless_equals_uint64 (start, 50 * GST_SECOND);
gst_validate_action_unref (action); gst_validate_action_unref (action);
gst_mini_object_unref (GST_MINI_OBJECT (seek_type));
gst_mini_object_unref (GST_MINI_OBJECT (set_vars));
gst_object_unref (scenario);
gst_object_unref (runner); gst_object_unref (runner);
} }