From 54c4ba82f818c648a37ae8899c2efb16be81264d Mon Sep 17 00:00:00 2001 From: Alexander Lapajne Date: Fri, 7 Feb 2020 10:03:49 +0100 Subject: [PATCH] rtspsrc: Fix for segmentation fault when handling set/get_parameter requests gstrtspsrc uses a queue, set_get_param_q, to store set param and get param requests. The requests are put on the queue by calling get_parameters() and set_parameter(). A thread which executs in gst_rtspsrc_thread() then pops requests from the queue and processes them. The crash occured because the queue became empty and a NULL request object was then used. The reason that the queue became empty is that it was popped even when the thread was NOT processing a get parameter or set parameter command. The fix is to make sure that the queue is ONLY popped when the command being processed is a set parameter or get parameter command. --- gst/rtsp/gstrtspsrc.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index 41de44dd32..a61d299357 100644 --- a/gst/rtsp/gstrtspsrc.c +++ b/gst/rtsp/gstrtspsrc.c @@ -8976,7 +8976,9 @@ gst_rtspsrc_thread (GstRTSPSrc * src) src->pending_cmd = CMD_LOOP; } else { ParameterRequest *next_req; - req = g_queue_pop_head (&src->set_get_param_q); + if (cmd == CMD_GET_PARAMETER || cmd == CMD_SET_PARAMETER) { + req = g_queue_pop_head (&src->set_get_param_q); + } next_req = g_queue_peek_head (&src->set_get_param_q); src->pending_cmd = next_req ? next_req->cmd : CMD_LOOP; } @@ -9369,6 +9371,8 @@ gst_rtspsrc_get_parameter (GstRTSPSrc * src, ParameterRequest * req) GST_DEBUG_OBJECT (src, "creating server get_parameter"); + g_assert (req); + if ((res = gst_rtspsrc_ensure_open (src, FALSE)) < 0) goto open_failed; @@ -9486,6 +9490,8 @@ gst_rtspsrc_set_parameter (GstRTSPSrc * src, ParameterRequest * req) GST_DEBUG_OBJECT (src, "creating server set_parameter"); + g_assert (req); + if ((res = gst_rtspsrc_ensure_open (src, FALSE)) < 0) goto open_failed;