From 6b5decf0e68a2f69c308d1703ac3a42c6fe51e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Wed, 6 Jan 2016 19:50:21 +0000 Subject: [PATCH] queue2: fix fill level arithmetic overflow with large values Based on patch by: Aleksander Wabik https://bugzilla.gnome.org/show_bug.cgi?id=755971 --- plugins/elements/gstqueue2.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c index 9dbf26c408..4fbc0e4ad1 100644 --- a/plugins/elements/gstqueue2.c +++ b/plugins/elements/gstqueue2.c @@ -830,6 +830,22 @@ apply_buffer_list (GstQueue2 * queue, GstBufferList * buffer_list, update_time_level (queue); } +static inline gint +get_percent (guint64 cur_level, guint64 max_level, guint64 alt_max) +{ + guint64 p; + + if (max_level == 0) + return 0; + + if (alt_max > 0) + p = gst_util_uint64_scale (cur_level, 100, MIN (max_level, alt_max)); + else + p = gst_util_uint64_scale (cur_level, 100, max_level); + + return MIN (p, 100); +} + static gboolean get_buffering_percent (GstQueue2 * queue, gboolean * is_buffering, gint * percent) @@ -843,7 +859,8 @@ get_buffering_percent (GstQueue2 * queue, gboolean * is_buffering, *is_buffering = FALSE; return FALSE; } -#define GET_PERCENT(format,alt_max) ((queue->max_level.format) > 0 ? (queue->cur_level.format) * 100 / ((alt_max) > 0 ? MIN ((alt_max), (queue->max_level.format)) : (queue->max_level.format)) : 0) +#define GET_PERCENT(format,alt_max) \ + get_percent(queue->cur_level.format,queue->max_level.format,(alt_max)) if (queue->is_eos) { /* on EOS we are always 100% full, we set the var here so that it we can