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
 }