[libav-commits] mem: introduce av_malloc_array and av_mallocz_array

Luca Barbato git at libav.org
Sat Jul 14 20:30:56 CEST 2012


Module: libav
Branch: master
Commit: f3e5e6f05bde31374eb6ea389b56d3979b5e1010

Author:    Luca Barbato <lu_zero at gentoo.org>
Committer: Luca Barbato <lu_zero at gentoo.org>
Date:      Mon Jul  9 15:29:30 2012 +0200

mem: introduce av_malloc_array and av_mallocz_array

Both function ease allocating large arrays implementing the overflow
check inside it.

---

 doc/APIchanges      |    3 +++
 libavutil/mem.h     |   37 +++++++++++++++++++++++++++++++++++--
 libavutil/version.h |    2 +-
 3 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 990e36e..cad5a3a 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil:     2011-04-18
 
 API changes, most recent first:
 
+2012-07-10 - xxxxxxx - lavu 51.37.0
+  Add av_malloc_array() and av_mallocz_array()
+
 2012-06-22 - xxxxxxx - lavu 51.34.0
   Add av_usleep()
 
diff --git a/libavutil/mem.h b/libavutil/mem.h
index cd8490b..211d33f 100644
--- a/libavutil/mem.h
+++ b/libavutil/mem.h
@@ -63,9 +63,9 @@
 #endif
 
 #if AV_GCC_VERSION_AT_LEAST(4,3)
-    #define av_alloc_size(n) __attribute__((alloc_size(n)))
+    #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
 #else
-    #define av_alloc_size(n)
+    #define av_alloc_size(...)
 #endif
 
 /**
@@ -79,6 +79,22 @@
 void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);
 
 /**
+ * Helper function to allocate a block of size * nmemb bytes with
+ * using av_malloc()
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_malloc()
+ */
+av_alloc_size(1,2) static inline void *av_malloc_array(size_t nmemb, size_t size)
+{
+    if (size <= 0 || nmemb >= INT_MAX / size)
+        return NULL;
+    return av_malloc(nmemb * size);
+}
+
+/**
  * Allocate or reallocate a block of memory.
  * If ptr is NULL and size > 0, allocate a new block. If
  * size is zero, free the memory block pointed to by ptr.
@@ -113,6 +129,23 @@ void av_free(void *ptr);
 void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1);
 
 /**
+ * Helper function to allocate a block of size * nmemb bytes with
+ * using av_mallocz()
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_mallocz()
+ * @see av_malloc_array()
+ */
+av_alloc_size(1,2) static inline void *av_mallocz_array(size_t nmemb, size_t size)
+{
+    if (size <= 0 || nmemb >= INT_MAX / size)
+        return NULL;
+    return av_mallocz(nmemb * size);
+}
+
+/**
  * Duplicate the string s.
  * @param s string to be duplicated
  * @return Pointer to a newly allocated string containing a
diff --git a/libavutil/version.h b/libavutil/version.h
index c42c6b0..f55a99f 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -37,7 +37,7 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR 51
-#define LIBAVUTIL_VERSION_MINOR 36
+#define LIBAVUTIL_VERSION_MINOR 37
 #define LIBAVUTIL_VERSION_MICRO  0
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \



More information about the libav-commits mailing list