rtspsrc: Avoid stack overflow recursing waiting for response
authorThibault Saunier <tsaunier@igalia.com>
Wed, 8 Apr 2020 13:45:17 +0000 (09:45 -0400)
committerThibault Saunier <tsaunier@igalia.com>
Wed, 8 Apr 2020 13:49:49 +0000 (09:49 -0400)
Instead of recursing, simply implement a loop with gotos, the same
way it was done before 812175288769d647ed6388755aed386378d9210c

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/710

gst/rtsp/gstrtspsrc.c

index f2ca49e..09c42c7 100644 (file)
@@ -6325,7 +6325,10 @@ gst_rtsp_src_receive_response (GstRTSPSrc * src, GstRTSPConnInfo * conninfo,
 {
   GstRTSPStatusCode thecode;
   gchar *content_base = NULL;
-  GstRTSPResult res = gst_rtspsrc_connection_receive (src, conninfo, response,
+  GstRTSPResult res;
+
+next:
+  res = gst_rtspsrc_connection_receive (src, conninfo, response,
       src->tcp_timeout);
 
   if (res < 0)
@@ -6342,7 +6345,7 @@ gst_rtsp_src_receive_response (GstRTSPSrc * src, GstRTSPConnInfo * conninfo,
         goto handle_request_failed;
 
       /* Not a response, receive next message */
-      return gst_rtsp_src_receive_response (src, conninfo, response, code);
+      goto next;
     case GST_RTSP_MESSAGE_RESPONSE:
       /* ok, a response is good */
       GST_DEBUG_OBJECT (src, "received response message");
@@ -6353,13 +6356,13 @@ gst_rtsp_src_receive_response (GstRTSPSrc * src, GstRTSPConnInfo * conninfo,
       gst_rtspsrc_handle_data (src, response);
 
       /* Not a response, receive next message */
-      return gst_rtsp_src_receive_response (src, conninfo, response, code);
+      goto next;
     default:
       GST_WARNING_OBJECT (src, "ignoring unknown message type %d",
           response->type);
 
       /* Not a response, receive next message */
-      return gst_rtsp_src_receive_response (src, conninfo, response, code);
+      goto next;
   }
 
   thecode = response->type_data.response.code;