diff --git a/ChangeLog b/ChangeLog index b653c3b350..edd5064b97 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-05-19 Tim-Philipp Müller + + * gst/gstpad.c: (gst_pad_buffer_alloc_unchecked): + Add sanity check to make sure we don't get smaller buffers + than requested (and fallback to normal buffer alloc if we do). + 2008-05-19 Wim Taymans * libs/gst/base/gstbasesink.c: (gst_base_sink_adjust_time), diff --git a/gst/gstpad.c b/gst/gstpad.c index 86d7d5437a..c9446521d6 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -2671,12 +2671,18 @@ gst_pad_buffer_alloc_unchecked (GstPad * pad, guint64 offset, gint size, goto fallback; ret = bufferallocfunc (pad, offset, size, caps, buf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) goto error; + /* no error, but NULL buffer means fallback to the default */ if (G_UNLIKELY (*buf == NULL)) goto fallback; + /* sanity check */ + if (G_UNLIKELY (GST_BUFFER_SIZE (*buf) < size)) + goto wrong_size; + /* If the buffer alloc function didn't set up the caps like it should, * do it for it */ if (G_UNLIKELY (caps && (GST_BUFFER_CAPS (*buf) == NULL))) { @@ -2699,6 +2705,14 @@ error: "alloc function returned error (%d) %s", ret, gst_flow_get_name (ret)); return ret; } +wrong_size: + { + GST_CAT_ERROR_OBJECT (GST_CAT_PADS, pad, "buffer returned by alloc " + "function is too small: %u < %d", GST_BUFFER_SIZE (*buf), size); + gst_buffer_unref (*buf); + *buf = NULL; + goto fallback; + } fallback: { /* fallback case, allocate a buffer of our own, add pad caps. */