From: <tp...@fr...> - 2005-10-09 17:59:20
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: tpm Date: Sun Oct 09 2005 10:59:20 PDT Log message: * gst/base/gsttypefindhelper.c: (helper_find_peek): Fix evil typefind crasher: getrange() might return a short buffer at the end of a file, but gst_type_find_peek() must either return the full data as requested or NULL, but never a short buffer. Modified files: . : ChangeLog gst/base : gsttypefindhelper.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1660&r2=1.1661 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/base/gsttypefindhelper.c.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1660 retrieving revision 1.1661 diff -u -d -r1.1660 -r1.1661 --- ChangeLog 9 Oct 2005 17:53:33 -0000 1.1660 +++ ChangeLog 9 Oct 2005 17:59:07 -0000 1.1661 @@ -1,3 +1,11 @@ +2005-10-09 Tim-Philipp Müller <tim at centricular dot net> + + * gst/base/gsttypefindhelper.c: (helper_find_peek): + Fix evil typefind crasher: getrange() might return a short + buffer at the end of a file, but gst_type_find_peek() must + either return the full data as requested or NULL, but + never a short buffer. 2005-10-09 Thomas Vander Stichele <thomas at apestaart dot org> * gst/gstmessage.c: (gst_message_new_state_changed), Index: gsttypefindhelper.c RCS file: /cvs/gstreamer/gstreamer/gst/base/gsttypefindhelper.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gsttypefindhelper.c 21 Aug 2005 10:54:47 -0000 1.7 +++ gsttypefindhelper.c 9 Oct 2005 17:59:08 -0000 1.8 @@ -75,8 +75,18 @@ if (ret != GST_FLOW_OK) goto error; - find->buffers = g_list_prepend (find->buffers, buffer); + /* getrange might silently return shortened buffers at the end of a file, + * we must, however, always return either the full requested data or NULL */ + if (GST_BUFFER_OFFSET (buffer) != offset || GST_BUFFER_SIZE (buffer) < size) { + GST_DEBUG ("droping short buffer: %" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT + " instead of %" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT, + GST_BUFFER_OFFSET (buffer), GST_BUFFER_OFFSET (buffer) + + GST_BUFFER_SIZE (buffer), offset, offset + size); + gst_buffer_unref (buffer); + return NULL; + } + find->buffers = g_list_prepend (find->buffers, buffer); return GST_BUFFER_DATA (buffer); error: |