From: Jan Alexander Steffens (heftig) Date: Fri, 4 Mar 2022 14:36:20 +0000 (+0100) Subject: deinterlace: Prevent race between _set_method and latency query X-Git-Tag: 1.22.0~2259 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ce503d06450080e07b37f701a4b16f7890a41d29;p=platform%2Fupstream%2Fgstreamer.git deinterlace: Prevent race between _set_method and latency query It's possible that the method is being manipulated while downstream queries our latency, leading to crashes. Prevent that from happening. Part-of: --- diff --git a/subprojects/gst-plugins-good/gst/deinterlace/gstdeinterlace.c b/subprojects/gst-plugins-good/gst/deinterlace/gstdeinterlace.c index e3fc594..8e92103 100644 --- a/subprojects/gst-plugins-good/gst/deinterlace/gstdeinterlace.c +++ b/subprojects/gst-plugins-good/gst/deinterlace/gstdeinterlace.c @@ -412,8 +412,11 @@ gst_deinterlace_set_method (GstDeinterlace * self, GstDeinterlaceMethods method) gst_child_proxy_child_removed (GST_OBJECT (self), GST_OBJECT (self->method)); #endif + + GST_OBJECT_LOCK (self); gst_object_unparent (GST_OBJECT (self->method)); self->method = NULL; + GST_OBJECT_UNLOCK (self); } method_type = @@ -443,10 +446,13 @@ gst_deinterlace_set_method (GstDeinterlace * self, GstDeinterlaceMethods method) g_assert (method_type != G_TYPE_INVALID); } - self->method = g_object_new (method_type, "name", "method", NULL); self->method_id = method; + GST_OBJECT_LOCK (self); + self->method = g_object_new (method_type, "name", "method", NULL); gst_object_set_parent (GST_OBJECT (self->method), GST_OBJECT (self)); + GST_OBJECT_UNLOCK (self); + #if 0 gst_child_proxy_child_added (GST_OBJECT (self), GST_OBJECT (self->method)); #endif @@ -3283,12 +3289,14 @@ gst_deinterlace_src_query (GstPad * pad, GstObject * parent, GstQuery * query) gint fields_required = 0; gint method_latency = 0; + GST_OBJECT_LOCK (self); if (self->method) { fields_required = gst_deinterlace_method_get_fields_required (self->method); method_latency = gst_deinterlace_method_get_latency (self->method); } + GST_OBJECT_UNLOCK (self); gst_query_parse_latency (query, &live, &min, &max);