gst/udp/gstudpsrc.c: Handle the case where there are exactly 0 bytes to read and...
authorWim Taymans <wim.taymans@gmail.com>
Thu, 26 Apr 2007 08:48:30 +0000 (08:48 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Thu, 26 Apr 2007 08:48:30 +0000 (08:48 +0000)
Original commit message from CVS:
* gst/udp/gstudpsrc.c: (gst_udpsrc_create):
Handle the case where there are exactly 0 bytes to read and the ioctl
did not report an error. Fixes #433530.

ChangeLog
gst/udp/gstudpsrc.c

index 5c3f750..1b1a2cd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2007-04-26  Wim Taymans  <wim@fluendo.com>
 
+       * gst/udp/gstudpsrc.c: (gst_udpsrc_create):
+       Handle the case where there are exactly 0 bytes to read and the ioctl
+       did not report an error. Fixes #433530.
+
+2007-04-26  Wim Taymans  <wim@fluendo.com>
+
        * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek),
        (gst_wavparse_stream_headers), (gst_wavparse_stream_data):
        * gst/wavparse/gstwavparse.h:
index e80a74c..6c6f701 100644 (file)
@@ -451,13 +451,18 @@ gst_udpsrc_create (GstPushSrc * psrc, GstBuffer ** buf)
       goto stopped;
   } while (try_again);
 
-  /* ask how much is available for reading on the socket, this is exactly one
-   * UDP packet. */
+  /* ask how much is available for reading on the socket, this should be exactly
+   * one UDP packet. We will check the return value, though, because in some
+   * case it can return 0 and we don't want a 0 sized buffer. */
+  readsize = 0;
   if ((ret = IOCTL_SOCKET (udpsrc->sock, FIONREAD, &readsize)) < 0)
     goto ioctl_failed;
 
   GST_LOG_OBJECT (udpsrc, "ioctl says %d bytes available", (int) readsize);
 
+  if (!readsize)
+    goto nothing_to_read;
+
   pktdata = g_malloc (readsize);
   pktsize = readsize;
 
@@ -516,6 +521,13 @@ ioctl_failed:
         ("ioctl failed %d: %s (%d)", ret, g_strerror (errno), errno));
     return GST_FLOW_ERROR;
   }
+nothing_to_read:
+  {
+    GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL),
+        ("ioctl returned readsize 0 %d: %s (%d)", ret, g_strerror (errno),
+            errno));
+    return GST_FLOW_ERROR;
+  }
 receive_error:
   {
     g_free (pktdata);