[FFmpeg-cvslog] Introduce av_size_mult.

Nicolas George git at videolan.org
Wed Sep 28 18:17:15 CEST 2011


ffmpeg | branch: master | Nicolas George <nicolas.george at normalesup.org> | Sun Mar 20 19:39:20 2011 +0100| [b2600509fef4d77645491f208b8113c372a32110] | committer: Michael Niedermayer

Introduce av_size_mult.

av_size_mult helps checking for overflow when computing the size of a memory
area.

Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b2600509fef4d77645491f208b8113c372a32110
---

 libavutil/mem.h |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/libavutil/mem.h b/libavutil/mem.h
index 1711b18..ffdbb98 100644
--- a/libavutil/mem.h
+++ b/libavutil/mem.h
@@ -27,6 +27,7 @@
 #define AVUTIL_MEM_H
 
 #include "attributes.h"
+#include "error.h"
 #include "avutil.h"
 
 #if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C)
@@ -144,4 +145,19 @@ void av_freep(void *ptr);
  */
 void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem);
 
+/**
+ * Multiply two size_t values checking for overflow.
+ * @return  0 if success, AVERROR(EINVAL) if overflow.
+ */
+static inline int av_size_mult(size_t a, size_t b, size_t *r)
+{
+    size_t t = a * b;
+    /* Hack inspired from glibc: only try the division if nelem and elsize
+     * are both greater than sqrt(SIZE_MAX). */
+    if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b)
+        return AVERROR(EINVAL);
+    *r = t;
+    return 0;
+}
+
 #endif /* AVUTIL_MEM_H */



More information about the ffmpeg-cvslog mailing list