diff --git a/src/mem.h b/src/mem.h index dd6360fae47cfc8604947abd3a86036d317a62c2..0ff7deb7dcba8180fdfa4927b99936c54df42617 100644 --- a/src/mem.h +++ b/src/mem.h @@ -101,10 +101,12 @@ static inline void *dav1d_alloc_aligned_internal(const size_t sz, const size_t a // must be an integral multiple of alignment. return aligned_alloc(align, ROUND_UP(sz, align)); #else - char *ptr = (char *)malloc(sz + align + sizeof(void *)); - char *result = (char *)(((size_t)ptr + sizeof(void *) + align - 1) & ~(align - 1)); - ((char **)result)[-1] = ptr; - return result; + void *const buf = malloc(sz + align + sizeof(void *)); + if (!buf) return NULL; + + void *const ptr = (void *)(((uintptr_t)buf + sizeof(void *) + align - 1) & ~(align - 1)); + ((void **)ptr)[-1] = buf; + return ptr; #endif } @@ -114,7 +116,7 @@ static inline void dav1d_free_aligned_internal(void *ptr) { #elif HAVE_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_ALIGNED_ALLOC free(ptr); #else - free(((void **)ptr)[-1]); + if (ptr) free(((void **)ptr)[-1]); #endif }