diff --git a/libavutil/mem.c b/libavutil/mem.c index b7bb65c139..15c28808c1 100644 --- a/libavutil/mem.c +++ b/libavutil/mem.c @@ -139,21 +139,22 @@ void *av_realloc(void *ptr, size_t size) int av_reallocp(void *ptr, size_t size) { - void **ptrptr = ptr; - void *ret; + void *val; if (!size) { av_freep(ptr); return 0; } - ret = av_realloc(*ptrptr, size); - if (!ret) { + memcpy(&val, ptr, sizeof(val)); + val = av_realloc(val, size); + + if (!val) { av_freep(ptr); return AVERROR(ENOMEM); } - *ptrptr = ret; + memcpy(ptr, &val, sizeof(val)); return 0; } @@ -166,20 +167,23 @@ void *av_realloc_array(void *ptr, size_t nmemb, size_t size) int av_reallocp_array(void *ptr, size_t nmemb, size_t size) { - void **ptrptr = ptr; - void *ret; + void *val; + if (!size || nmemb >= INT_MAX / size) return AVERROR(ENOMEM); if (!nmemb) { av_freep(ptr); return 0; } - ret = av_realloc(*ptrptr, nmemb * size); - if (!ret) { + + memcpy(&val, ptr, sizeof(val)); + val = av_realloc(val, nmemb * size); + if (!val) { av_freep(ptr); return AVERROR(ENOMEM); } - *ptrptr = ret; + + memcpy(ptr, &val, sizeof(val)); return 0; } @@ -197,9 +201,11 @@ void av_free(void *ptr) void av_freep(void *arg) { - void **ptr = (void **)arg; - av_free(*ptr); - *ptr = NULL; + void *val; + + memcpy(&val, arg, sizeof(val)); + memcpy(arg, &(void *){ NULL }, sizeof(val)); + av_free(val); } void *av_mallocz(size_t size)