mem: introduce av_malloc_array and av_mallocz_array
authorLuca Barbato <lu_zero@gentoo.org>
Mon, 9 Jul 2012 13:29:30 +0000 (15:29 +0200)
committerLuca Barbato <lu_zero@gentoo.org>
Sat, 14 Jul 2012 18:07:25 +0000 (20:07 +0200)
Both function ease allocating large arrays implementing the overflow
check inside it.

doc/APIchanges
libavutil/mem.h
libavutil/version.h

index 990e36e..cad5a3a 100644 (file)
@@ -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()
 
index cd8490b..211d33f 100644 (file)
@@ -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
 
 /**
  */
 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
@@ -112,6 +128,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
index c42c6b0..f55a99f 100644 (file)
@@ -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, \