From: Tim-Philipp Müller Date: Wed, 2 Jan 2013 00:03:27 +0000 (+0000) Subject: udpsrc: sanity check size of available packet data for reading to avoid memory waste X-Git-Tag: 1.19.3~509^2~6145 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cf1f6aff0de8ee7d735e964b17bbe253148bb671;p=platform%2Fupstream%2Fgstreamer.git udpsrc: sanity check size of available packet data for reading to avoid memory waste On Windows and OS/X, _get_available_bytes() may not return the size of the next pending packet, but the size of all pending packets in the kernel-side buffer, which might be rather large depending on configuration. Sanity-check the size returned by _get_available_bytes() to make sure we never allocate more memory than the max. size for a packet, if it's an IPv4 socket. https://bugzilla.gnome.org/show_bug.cgi?id=610364 --- diff --git a/gst/udp/gstudpsrc.c b/gst/udp/gstudpsrc.c index bd7082d..82f183c 100644 --- a/gst/udp/gstudpsrc.c +++ b/gst/udp/gstudpsrc.c @@ -116,6 +116,9 @@ #include #endif +/* not 100% correct, but a good upper bound for memory allocation purposes */ +#define MAX_IPV4_UDP_PACKET_SIZE (65536 - 8) + GST_DEBUG_CATEGORY_STATIC (udpsrc_debug); #define GST_CAT_DEFAULT (udpsrc_debug) @@ -442,6 +445,11 @@ retry: no_select: GST_LOG_OBJECT (udpsrc, "ioctl says %d bytes available", (int) readsize); + /* sanity check value from _get_available_bytes(), which might be as + * large as the kernel-side buffer on some operating systems */ + if (g_socket_get_family (udpsrc->used_socket) == G_SOCKET_FAMILY_IPV4) + readsize = MIN (MAX_IPV4_UDP_PACKET_SIZE, readsize); + ret = GST_BASE_SRC_CLASS (parent_class)->alloc (GST_BASE_SRC_CAST (udpsrc), -1, readsize, &outbuf); if (ret != GST_FLOW_OK)