From 8a54cc3b161b60268075bdf2d80e89d9ae979b9f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 30 Nov 2018 12:47:57 +0200 Subject: [PATCH] rtspconnection: Handle EOF on writev() after checking for all other error conditions Otherwise we would return EOF if nothing was written in any case, even if this was actually a case of TIMEOUT or EWOULDBLOCK for example. Thanks to Edward Hervey for debugging and finding this issue. --- gst-libs/gst/rtsp/gstrtspconnection.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/gst-libs/gst/rtsp/gstrtspconnection.c b/gst-libs/gst/rtsp/gstrtspconnection.c index abc933f..ae393e4 100644 --- a/gst-libs/gst/rtsp/gstrtspconnection.c +++ b/gst-libs/gst/rtsp/gstrtspconnection.c @@ -1269,7 +1269,7 @@ writev_bytes (GOutputStream * stream, GOutputVector * vectors, gint n_vectors, g_pollable_output_stream_writev_nonblocking (G_POLLABLE_OUTPUT_STREAM (stream), vectors, n_vectors, &written, cancellable, &err); _bytes_written += written; - if (G_UNLIKELY (!res)) + if (G_UNLIKELY (!res || written == 0)) goto error; /* skip vectors that have been written in full */ @@ -1295,10 +1295,8 @@ error: { *bytes_written = _bytes_written; - if (G_UNLIKELY (written == 0)) - return GST_RTSP_EEOF; - - GST_DEBUG ("%s", err->message); + if (err) + GST_DEBUG ("%s", err->message); if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { g_clear_error (&err); return GST_RTSP_EINTR; @@ -1308,7 +1306,11 @@ error: } else if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_TIMED_OUT)) { g_clear_error (&err); return GST_RTSP_ETIMEOUT; + } else if (G_UNLIKELY (written == 0)) { + g_clear_error (&err); + return GST_RTSP_EEOF; } + g_clear_error (&err); return GST_RTSP_ESYS; } -- 2.7.4