[vlc-devel] [PATCH] demux/asf: fix 17580: prevent overflow leading to crash

Filip Roséen filip at atch.se
Tue Nov 1 02:20:26 CET 2016


Given that the previous implementation assigned the return-value of
vlc_stream_Peek to a size_t, the value would wrap around on error
(since vlc_stream_Peek returns -1), rendering the "< 78" somewhat
useless (when an error occurs).

These changes change the type of i_peek to correspond to that of
vlc_stream_Peek, while also making sure that we error before calling
the function if the object size is larger than SSIZE_MAX (meaning that
we cannot peek).

fixes #17580
---
 modules/demux/asf/libasf.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/modules/demux/asf/libasf.c b/modules/demux/asf/libasf.c
index ed782bd..b303ce5 100644
--- a/modules/demux/asf/libasf.c
+++ b/modules/demux/asf/libasf.c
@@ -25,6 +25,8 @@
 # include "config.h"
 #endif
 
+#include <limits.h>
+
 #include <vlc_demux.h>
 #include <vlc_charset.h>          /* FromCharset */
 
@@ -528,9 +530,17 @@ static void ASF_FreeObject_header_extension( asf_object_t *p_obj )
 static int ASF_ReadObject_stream_properties( stream_t *s, asf_object_t *p_obj )
 {
     asf_object_stream_properties_t *p_sp = &p_obj->stream_properties;
-    size_t        i_peek;
+    ssize_t i_peek;
     const uint8_t *p_peek;
 
+#if UINT64_MAX > SSIZE_MAX
+    if( p_sp->i_object_size > SSIZE_MAX )
+    {
+        msg_Err( s, "unable to peek: object size is larger than SSIZE_MAX" );
+        return VLC_EGENERIC;
+    }
+#endif
+
     if( ( i_peek = vlc_stream_Peek( s, &p_peek,  p_sp->i_object_size ) ) < 78 )
        return VLC_EGENERIC;
 
-- 
2.10.1



More information about the vlc-devel mailing list