Changeset 2c5199b in rtems


Ignore:
Timestamp:
May 5, 2021, 6:49:52 AM (7 weeks ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
master
Children:
b391affc
Parents:
5580b93
git-author:
Sebastian Huber <sebastian.huber@…> (05/05/21 06:49:52)
git-committer:
Sebastian Huber <sebastian.huber@…> (05/06/21 06:03:58)
Message:

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.

Files:
8 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libcsupport/src/alignedalloc.c

    r5580b93 r2c5199b  
    3636void *aligned_alloc( size_t alignment, size_t size )
    3737{
     38  if ( size == 0 ) {
     39    return NULL;
     40  }
     41
    3842  return rtems_heap_allocate_aligned_with_boundary( size, alignment, 0 );
    3943}
  • cpukit/libcsupport/src/calloc.c

    r5580b93 r2c5199b  
    3636
    3737  if ( nelem == 0 ) {
    38     length = 0;
    39   } else if ( elsize > SIZE_MAX / nelem ) {
     38    return NULL;
     39  }
     40
     41  if ( elsize > SIZE_MAX / nelem ) {
    4042    errno = ENOMEM;
    4143    return NULL;
    42   } else {
    43     length = nelem * elsize;
    4444  }
    4545
     46  length = nelem * elsize;
    4647  cptr = malloc( length );
    4748  RTEMS_OBFUSCATE_VARIABLE( cptr );
  • cpukit/libcsupport/src/malloc.c

    r5580b93 r2c5199b  
    3131  void        *return_this;
    3232
     33  if ( size == 0 ) {
     34    return NULL;
     35  }
     36
    3337  return_this = rtems_heap_allocate_aligned_with_boundary( size, 0, 0 );
    3438  if ( !return_this ) {
  • cpukit/libcsupport/src/malloc_deferred.c

    r5580b93 r2c5199b  
    107107void *rtems_malloc( size_t size )
    108108{
     109  if ( size == 0 ) {
     110    return NULL;
     111  }
     112
    109113  return rtems_heap_allocate_aligned_with_boundary( size, 0, 0 );
    110114}
  • cpukit/libcsupport/src/posix_memalign.c

    r5580b93 r2c5199b  
    3838  *memptr = NULL;
    3939
     40  if ( size == 0 ) {
     41    return 0;
     42  }
     43
    4044  if ( alignment < sizeof( void * ) ) {
    4145    return EINVAL;
  • cpukit/libcsupport/src/rtems_memalign.c

    r5580b93 r2c5199b  
    4141  *pointer = NULL;
    4242
     43  if ( size == 0 ) {
     44    return 0;
     45  }
     46
    4347  /*
    4448   *  Perform the aligned allocation requested
  • cpukit/libcsupport/src/rtemscalloc.c

    r5580b93 r2c5199b  
    4848
    4949  if ( nelem == 0 ) {
    50     length = 0;
    51   } else if ( elsize > SIZE_MAX / nelem ) {
    5250    return NULL;
    53   } else {
    54     length = nelem * elsize;
    5551  }
    5652
     53  if ( elsize > SIZE_MAX / nelem ) {
     54    return NULL;
     55  }
     56
     57  length = nelem * elsize;
    5758  p = rtems_malloc( length );
    5859  RTEMS_OBFUSCATE_VARIABLE( p );
  • testsuites/libtests/malloctest/init.c

    r5580b93 r2c5199b  
    11541154
    11551155  p = rtems_malloc(0);
    1156   rtems_test_assert(p != NULL);
    1157 
    1158   RTEMS_OBFUSCATE_VARIABLE(p);
    1159   free(p);
     1156  rtems_test_assert(p == NULL);
    11601157
    11611158  errno = 0;
     
    11771174
    11781175  p = rtems_calloc(0, 0);
    1179   rtems_test_assert(p != NULL);
    1180 
    1181   RTEMS_OBFUSCATE_VARIABLE(p);
    1182   free(p);
     1176  rtems_test_assert(p == NULL);
    11831177
    11841178  p = rtems_calloc(0, 1);
    1185   rtems_test_assert(p != NULL);
    1186 
    1187   RTEMS_OBFUSCATE_VARIABLE(p);
    1188   free(p);
     1179  rtems_test_assert(p == NULL);
    11891180
    11901181  p = rtems_calloc(1, 0);
    1191   rtems_test_assert(p != NULL);
    1192 
    1193   RTEMS_OBFUSCATE_VARIABLE(p);
    1194   free(p);
     1182  rtems_test_assert(p == NULL);
    11951183
    11961184  errno = 0;
     
    13241312
    13251313  size = 0;
     1314  errno = -1;
    13261315
    13271316  RTEMS_OBFUSCATE_VARIABLE( size );
    13281317  p = malloc( size );
    1329   rtems_test_assert( p != NULL );
    1330 
    1331   RTEMS_OBFUSCATE_VARIABLE( p );
    1332   free( p );
     1318  rtems_test_assert( p == NULL );
     1319  rtems_test_assert( errno == -1 );
    13331320
    13341321  RTEMS_OBFUSCATE_VARIABLE( size );
    1335   p = calloc( 1, size );
    1336   rtems_test_assert( p != NULL );
    1337 
    1338   RTEMS_OBFUSCATE_VARIABLE( p );
    1339   free( p );
     1322  p = calloc( size, 1 );
     1323  rtems_test_assert( p == NULL );
     1324  rtems_test_assert( errno == -1 );
    13401325
    13411326  RTEMS_OBFUSCATE_VARIABLE( size );
    13421327  p = rtems_malloc( size );
    1343   rtems_test_assert( p != NULL );
    1344 
    1345   RTEMS_OBFUSCATE_VARIABLE( p );
    1346   free( p );
     1328  rtems_test_assert( p == NULL );
     1329  rtems_test_assert( errno == -1 );
    13471330
    13481331  RTEMS_OBFUSCATE_VARIABLE( size );
    13491332  p = rtems_calloc( 1, size );
    1350   rtems_test_assert( p != NULL );
    1351 
    1352   RTEMS_OBFUSCATE_VARIABLE( p );
    1353   free( p );
     1333  rtems_test_assert( p == NULL );
     1334  rtems_test_assert( errno == -1 );
    13541335
    13551336  RTEMS_OBFUSCATE_VARIABLE( size );
    1356   p = NULL;
     1337  p = (void *)(uintptr_t) 1;
    13571338  eno = posix_memalign( &p, 32, size );
    13581339  rtems_test_assert( eno == 0 );
    1359   rtems_test_assert( p != NULL );
    1360 
    1361   RTEMS_OBFUSCATE_VARIABLE( p );
    1362   free( p );
     1340  rtems_test_assert( p == NULL );
     1341  rtems_test_assert( errno == -1 );
    13631342
    13641343  RTEMS_OBFUSCATE_VARIABLE( size );
    1365   p = NULL;
     1344  p = (void *)(uintptr_t) 1;
    13661345  eno = rtems_memalign( &p, 32, size );
    13671346  rtems_test_assert( eno == 0 );
    1368   rtems_test_assert( p != NULL );
    1369 
    1370   RTEMS_OBFUSCATE_VARIABLE( p );
    1371   free( p );
     1347  rtems_test_assert( p == NULL );
     1348  rtems_test_assert( errno == -1 );
    13721349
    13731350  RTEMS_OBFUSCATE_VARIABLE( size );
    13741351  p = aligned_alloc( 32, size );
    1375   rtems_test_assert( p != NULL );
    1376 
    1377   RTEMS_OBFUSCATE_VARIABLE( p );
    1378   free( p );
     1352  rtems_test_assert( p == NULL );
     1353  rtems_test_assert( errno == -1 );
    13791354
    13801355  RTEMS_OBFUSCATE_VARIABLE( size );
    13811356  p = realloc( NULL, size );
    1382   rtems_test_assert( p != NULL );
    1383 
    1384   RTEMS_OBFUSCATE_VARIABLE( p );
    1385   free( p );
     1357  rtems_test_assert( p == NULL );
     1358  rtems_test_assert( errno == -1 );
    13861359
    13871360  RTEMS_OBFUSCATE_VARIABLE( size );
    13881361  p = reallocarray( NULL, 1, size );
    1389   rtems_test_assert( p != NULL );
    1390 
    1391   RTEMS_OBFUSCATE_VARIABLE( p );
    1392   free( p );
     1362  rtems_test_assert( p == NULL );
     1363  rtems_test_assert( errno == -1 );
    13931364}
    13941365
Note: See TracChangeset for help on using the changeset viewer.