summaryrefslogtreecommitdiff
path: root/libavutil
diff options
context:
space:
mode:
authorNicolas George <nicolas.george@normalesup.org>2011-03-20 19:39:20 +0100
committerMichael Niedermayer <michaelni@gmx.at>2011-09-28 18:13:52 +0200
commitb2600509fef4d77645491f208b8113c372a32110 (patch)
tree35f79194c55bc095eef1c98e4d9b3efbf7ec3f29 /libavutil
parente89f58810d0d508552089495781e2a70e95edb99 (diff)
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@normalesup.org> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavutil')
-rw-r--r--libavutil/mem.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/libavutil/mem.h b/libavutil/mem.h
index 1711b18658..ffdbb98d94 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 */