From 2c5199bb049efe8e29cd12461dc57bd6e30388e8 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 5 May 2021 08:49:52 +0200 Subject: Return NULL for zero size allocations In POSIX, zero size memory allocations are implementation-defined behaviour. The implementation has two options: https://pubs.opengroup.org/onlinepubs/9699919799/functions/malloc.html https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_memalign.html Linux and FreeBSD return a unique pointer for zero size memory allocations. Return NULL on RTEMS to more likely catch the use of a zero size memory area by erroneous applications. Update #4390. --- testsuites/libtests/malloctest/init.c | 81 +++++++++++------------------------ 1 file changed, 26 insertions(+), 55 deletions(-) (limited to 'testsuites') diff --git a/testsuites/libtests/malloctest/init.c b/testsuites/libtests/malloctest/init.c index c9dcb63b2c..a33764177d 100644 --- a/testsuites/libtests/malloctest/init.c +++ b/testsuites/libtests/malloctest/init.c @@ -1153,10 +1153,7 @@ static void test_rtems_malloc(void) void *p; p = rtems_malloc(0); - rtems_test_assert(p != NULL); - - RTEMS_OBFUSCATE_VARIABLE(p); - free(p); + rtems_test_assert(p == NULL); errno = 0; p = rtems_malloc(SIZE_MAX / 2); @@ -1176,22 +1173,13 @@ static void test_rtems_calloc(void) int *i; p = rtems_calloc(0, 0); - rtems_test_assert(p != NULL); - - RTEMS_OBFUSCATE_VARIABLE(p); - free(p); + rtems_test_assert(p == NULL); p = rtems_calloc(0, 1); - rtems_test_assert(p != NULL); - - RTEMS_OBFUSCATE_VARIABLE(p); - free(p); + rtems_test_assert(p == NULL); p = rtems_calloc(1, 0); - rtems_test_assert(p != NULL); - - RTEMS_OBFUSCATE_VARIABLE(p); - free(p); + rtems_test_assert(p == NULL); errno = 0; p = rtems_calloc(1, SIZE_MAX / 2); @@ -1323,73 +1311,56 @@ static void test_alloc_zero_size(void) int eno; size = 0; + errno = -1; RTEMS_OBFUSCATE_VARIABLE( size ); p = malloc( size ); - rtems_test_assert( p != NULL ); - - RTEMS_OBFUSCATE_VARIABLE( p ); - free( p ); + rtems_test_assert( p == NULL ); + rtems_test_assert( errno == -1 ); RTEMS_OBFUSCATE_VARIABLE( size ); - p = calloc( 1, size ); - rtems_test_assert( p != NULL ); - - RTEMS_OBFUSCATE_VARIABLE( p ); - free( p ); + p = calloc( size, 1 ); + rtems_test_assert( p == NULL ); + rtems_test_assert( errno == -1 ); RTEMS_OBFUSCATE_VARIABLE( size ); p = rtems_malloc( size ); - rtems_test_assert( p != NULL ); - - RTEMS_OBFUSCATE_VARIABLE( p ); - free( p ); + rtems_test_assert( p == NULL ); + rtems_test_assert( errno == -1 ); RTEMS_OBFUSCATE_VARIABLE( size ); p = rtems_calloc( 1, size ); - rtems_test_assert( p != NULL ); - - RTEMS_OBFUSCATE_VARIABLE( p ); - free( p ); + rtems_test_assert( p == NULL ); + rtems_test_assert( errno == -1 ); RTEMS_OBFUSCATE_VARIABLE( size ); - p = NULL; + p = (void *)(uintptr_t) 1; eno = posix_memalign( &p, 32, size ); rtems_test_assert( eno == 0 ); - rtems_test_assert( p != NULL ); - - RTEMS_OBFUSCATE_VARIABLE( p ); - free( p ); + rtems_test_assert( p == NULL ); + rtems_test_assert( errno == -1 ); RTEMS_OBFUSCATE_VARIABLE( size ); - p = NULL; + p = (void *)(uintptr_t) 1; eno = rtems_memalign( &p, 32, size ); rtems_test_assert( eno == 0 ); - rtems_test_assert( p != NULL ); - - RTEMS_OBFUSCATE_VARIABLE( p ); - free( p ); + rtems_test_assert( p == NULL ); + rtems_test_assert( errno == -1 ); RTEMS_OBFUSCATE_VARIABLE( size ); p = aligned_alloc( 32, size ); - rtems_test_assert( p != NULL ); - - RTEMS_OBFUSCATE_VARIABLE( p ); - free( p ); + rtems_test_assert( p == NULL ); + rtems_test_assert( errno == -1 ); RTEMS_OBFUSCATE_VARIABLE( size ); p = realloc( NULL, size ); - rtems_test_assert( p != NULL ); - - RTEMS_OBFUSCATE_VARIABLE( p ); - free( p ); + rtems_test_assert( p == NULL ); + rtems_test_assert( errno == -1 ); RTEMS_OBFUSCATE_VARIABLE( size ); p = reallocarray( NULL, 1, size ); - rtems_test_assert( p != NULL ); - - RTEMS_OBFUSCATE_VARIABLE( p ); - free( p ); + rtems_test_assert( p == NULL ); + rtems_test_assert( errno == -1 ); } rtems_task Init( -- cgit v1.2.3