5a298e8685
This change introduce 2 items: 1. If the size of the space requested is 0, the behavior is implementation-defined: either a null pointer shall be returned, or the behavior shall be as if the size were some non-zero value, except that the behavior is undefined if the returned pointer is used to access an object. Change the behavior to be similar to Linux and Android and allocates an object of a minimum size instead of returning null pointer. https://pubs.opengroup.org/onlinepubs/9699919799/functions/malloc.html https://pubs.opengroup.org/onlinepubs/9699919799/functions/calloc.html https://pubs.opengroup.org/onlinepubs/9699919799/functions/realloc.html 2. The description of realloc() has been modified from previous versions of this standard to align with the ISO/IEC 9899:1999 standard. Previous versions explicitly permitted a call to realloc (p, 0) to free the space pointed to by p and return a null pointer. While this behavior could be interpreted as permitted by this version of the standard, the C language committee have indicated that this interpretation is incorrect. Applications should assume that if realloc() returns a null pointer, the space pointed to by p has not been freed. Since this could lead to double-frees, implementations should also set errno if a null pointer actually indicates a failure, and applications should only free the space if errno was changed. Do not free memory of zero-length reallocation is requested https://pubs.opengroup.org/onlinepubs/9699919799/functions/realloc.html Co-authored-by: fangxinyong <fangxinyong@xiaomi.com> Signed-off-by: Petro Karashchenko <petro.karashchenko@gmail.com>
76 lines
2.4 KiB
C
76 lines
2.4 KiB
C
/****************************************************************************
|
|
* mm/umm_heap/umm_calloc.c
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <nuttx/mm/mm.h>
|
|
|
|
#include "umm_heap/umm_heap.h"
|
|
|
|
/****************************************************************************
|
|
* Public Functions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: calloc
|
|
*
|
|
* Description:
|
|
* calloc is a thin wrapper for mm_calloc()
|
|
*
|
|
****************************************************************************/
|
|
|
|
#undef calloc /* See mm/README.txt */
|
|
FAR void *calloc(size_t n, size_t elem_size)
|
|
{
|
|
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_BUILD_KERNEL)
|
|
/* Use zalloc() because it implements the sbrk() logic */
|
|
|
|
FAR void *mem = NULL;
|
|
/* Verify input parameters
|
|
*
|
|
* elem_size or n is zero treats as valid input.
|
|
*
|
|
* Assure that the following multiplication cannot overflow the size_t
|
|
* type, i.e., that: SIZE_MAX >= n * elem_size
|
|
*
|
|
* Refer to SEI CERT C Coding Standard.
|
|
*/
|
|
|
|
if (elem_size == 0 || n <= (SIZE_MAX / elem_size))
|
|
{
|
|
/* Use zalloc() because it implements the sbrk() logic */
|
|
|
|
mem = zalloc(n * elem_size);
|
|
}
|
|
|
|
return mem;
|
|
#else
|
|
/* Use mm_calloc() because it implements the clear */
|
|
|
|
return mm_calloc(USR_HEAP, n, elem_size);
|
|
#endif
|
|
}
|