X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavutil%2Fmem.c;h=be42342de2585bbf92e6ea8c77ee5afe1b864f7a;hb=74cc901905741ca3d9e8364f42239341f4f173c4;hp=e901533cc716f1b9e9c714f1d6c3a207005fd127;hpb=fc962d4e7a7c3d799d9364d5427564c22ee3880c;p=ffmpeg diff --git a/libavutil/mem.c b/libavutil/mem.c index e901533cc71..be42342de25 100644 --- a/libavutil/mem.c +++ b/libavutil/mem.c @@ -35,6 +35,7 @@ #endif #include "avutil.h" +#include "common.h" #include "intreadwrite.h" #include "mem.h" @@ -65,7 +66,7 @@ void *av_malloc(size_t size) long diff; #endif - /* let's disallow possible ambiguous cases */ + /* let's disallow possibly ambiguous cases */ if (size > (INT_MAX - 32) || !size) return NULL; @@ -119,7 +120,7 @@ void *av_realloc(void *ptr, size_t size) int diff; #endif - /* let's disallow possible ambiguous cases */ + /* let's disallow possibly ambiguous cases */ if (size > (INT_MAX - 16)) return NULL; @@ -136,9 +137,29 @@ void *av_realloc(void *ptr, size_t size) #endif } +int av_reallocp(void *ptr, size_t size) +{ + void **ptrptr = ptr; + void *ret; + + if (!size) { + av_freep(ptr); + return 0; + } + ret = av_realloc(*ptrptr, size); + + if (!ret) { + av_freep(ptr); + return AVERROR(ENOMEM); + } + + *ptrptr = ret; + return 0; +} + void *av_realloc_array(void *ptr, size_t nmemb, size_t size) { - if (size <= 0 || nmemb >= INT_MAX / size) + if (!size || nmemb >= INT_MAX / size) return NULL; return av_realloc(ptr, nmemb * size); } @@ -147,9 +168,9 @@ int av_reallocp_array(void *ptr, size_t nmemb, size_t size) { void **ptrptr = ptr; void *ret; - if (size <= 0 || nmemb >= INT_MAX / size) + if (!size || nmemb >= INT_MAX / size) return AVERROR(ENOMEM); - if (nmemb <= 0) { + if (!nmemb) { av_freep(ptr); return 0; } @@ -194,7 +215,7 @@ char *av_strdup(const char *s) char *ptr = NULL; if (s) { int len = strlen(s) + 1; - ptr = av_malloc(len); + ptr = av_realloc(NULL, len); if (ptr) memcpy(ptr, s, len); } @@ -324,3 +345,35 @@ void av_memcpy_backptr(uint8_t *dst, int back, int cnt) *dst = *src; } } + +void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size) +{ + if (min_size < *size) + return ptr; + + min_size = FFMAX(17 * min_size / 16 + 32, min_size); + + ptr = av_realloc(ptr, min_size); + /* we could set this to the unmodified min_size but this is safer + * if the user lost the ptr and uses NULL now + */ + if (!ptr) + min_size = 0; + + *size = min_size; + + return ptr; +} + +void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size) +{ + void **p = ptr; + if (min_size < *size) + return; + min_size = FFMAX(17 * min_size / 16 + 32, min_size); + av_free(*p); + *p = av_malloc(min_size); + if (!*p) + min_size = 0; + *size = min_size; +}