make malloc(0) return unique pointers rather than NULL
[musl] / src / malloc / malloc.c
index d9a30fe..3c08c41 100644 (file)
@@ -216,9 +216,14 @@ static int init_malloc()
 static int adjust_size(size_t *n)
 {
        /* Result of pointer difference must fit in ptrdiff_t. */
-       if (*n > PTRDIFF_MAX - SIZE_ALIGN - PAGE_SIZE) {
-               errno = ENOMEM;
-               return -1;
+       if (*n-1 > PTRDIFF_MAX - SIZE_ALIGN - PAGE_SIZE) {
+               if (*n) {
+                       errno = ENOMEM;
+                       return -1;
+               } else {
+                       *n = SIZE_ALIGN;
+                       return 0;
+               }
        }
        *n = (*n + OVERHEAD + SIZE_ALIGN - 1) & SIZE_MASK;
        return 0;
@@ -325,7 +330,7 @@ void *malloc(size_t n)
        struct chunk *c;
        int i, j;
 
-       if (!n || adjust_size(&n) < 0) return 0;
+       if (adjust_size(&n) < 0) return 0;
 
        if (n > MMAP_THRESHOLD) {
                size_t len = n + PAGE_SIZE - 1 & -PAGE_SIZE;
@@ -377,7 +382,6 @@ void *realloc(void *p, size_t n)
        void *new;
 
        if (!p) return malloc(n);
-       else if (!n) return free(p), (void *)0;
 
        if (adjust_size(&n) < 0) return 0;