diff options
author | Nicolas George <nicolas.george@normalesup.org> | 2011-03-20 19:39:20 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-09-28 18:13:52 +0200 |
commit | b2600509fef4d77645491f208b8113c372a32110 (patch) | |
tree | 35f79194c55bc095eef1c98e4d9b3efbf7ec3f29 | |
parent | e89f58810d0d508552089495781e2a70e95edb99 (diff) | |
download | ffmpeg-b2600509fef4d77645491f208b8113c372a32110.tar.gz |
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>
-rw-r--r-- | libavutil/mem.h | 16 |
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 */ |