rtsp: handle socket errors
authorPatrick Radizi <patrick.radizi at axis.com>
Mon, 12 Oct 2009 13:48:46 +0000 (15:48 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 12 Oct 2009 13:48:46 +0000 (15:48 +0200)
gstrtspconnection.c:gst_rtsp_connection_receive() can hang when an error occured
on a socekt. Fix this problem by checking for error on 'other' socket after poll
return.

Fixes #596159

gst-libs/gst/rtsp/gstrtspconnection.c

index 088a67e..19202a2 100644 (file)
@@ -1337,6 +1337,10 @@ gst_rtsp_connection_write (GstRTSPConnection * conn, const guint8 * data,
       else
         goto select_error;
     }
+
+    /* could also be an error with read socket */
+    if (gst_poll_fd_has_error (conn->fdset, conn->readfd))
+      goto socket_error;
   }
   return GST_RTSP_OK;
 
@@ -1353,6 +1357,10 @@ stopped:
   {
     return GST_RTSP_EINTR;
   }
+socket_error:
+  {
+    return GST_RTSP_ENET;
+  }
 write_error:
   {
     return res;
@@ -2050,6 +2058,11 @@ gst_rtsp_connection_read (GstRTSPConnection * conn, guint8 * data, guint size,
       else
         goto select_error;
     }
+
+    /* could also be an error with write socket */
+    if (gst_poll_fd_has_error (conn->fdset, conn->writefd))
+      goto socket_error;
+
     gst_poll_set_controllable (conn->fdset, FALSE);
   }
   return GST_RTSP_OK;
@@ -2071,6 +2084,10 @@ eof:
   {
     return GST_RTSP_EEOF;
   }
+socket_error:
+  {
+    res = GST_RTSP_ENET;
+  }
 read_error:
   {
     return res;
@@ -2204,6 +2221,11 @@ gst_rtsp_connection_receive (GstRTSPConnection * conn, GstRTSPMessage * message,
       else
         goto select_error;
     }
+
+    /* could also be an error with write socket */
+    if (gst_poll_fd_has_error (conn->fdset, conn->writefd))
+      goto socket_error;
+
     gst_poll_set_controllable (conn->fdset, FALSE);
   }
 
@@ -2233,6 +2255,11 @@ eof:
     res = GST_RTSP_EEOF;
     goto cleanup;
   }
+socket_error:
+  {
+    res = GST_RTSP_ENET;
+    goto cleanup;
+  }
 read_error:
 cleanup:
   {