Skip to content

Commit f338f77

Browse files
Add a test component with malloc(0) returning NULL
Exercise the library functions with malloc(0) returning NULL. Make this a separte job with UBSan (and ASan) to detect potential. Other test components jobs either use the system malloc which returns non-NULL on Linux and FreeBSD, or the memory_buffer_alloc malloc which returns NULL but does not give as useful feedback with ASan (because the whole heap is a single C object).
1 parent 1fd94fa commit f338f77

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

tests/config-wrapper-malloc-0-null.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/* config.h wrapper that forces calloc(0) to return NULL.
2+
* Used for testing.
3+
*/
4+
/*
5+
* Copyright (C) 2019, ARM Limited, All Rights Reserved
6+
* SPDX-License-Identifier: Apache-2.0
7+
*
8+
* Licensed under the Apache License, Version 2.0 (the "License"); you may
9+
* not use this file except in compliance with the License.
10+
* You may obtain a copy of the License at
11+
*
12+
* http://www.apache.org/licenses/LICENSE-2.0
13+
*
14+
* Unless required by applicable law or agreed to in writing, software
15+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17+
* See the License for the specific language governing permissions and
18+
* limitations under the License.
19+
*
20+
* This file is part of mbed TLS (https://tls.mbed.org)
21+
*/
22+
23+
#ifndef MBEDTLS_CONFIG_H
24+
/* Don't #define MBEDTLS_CONFIG_H, let config.h do it. */
25+
26+
#include "mbedtls/config.h"
27+
28+
#include <stdlib.h>
29+
static inline void *custom_calloc( size_t nmemb, size_t size )
30+
{
31+
if( nmemb == 0 || size == 0 )
32+
return( NULL );
33+
return( calloc( nmemb, size ) );
34+
}
35+
36+
#define MBEDTLS_PLATFORM_MEMORY
37+
#define MBEDTLS_PLATFORM_STD_CALLOC custom_calloc
38+
39+
#endif /* MBEDTLS_CONFIG_H */

tests/scripts/all.sh

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,22 @@ component_test_platform_calloc_macro () {
822822
make test
823823
}
824824

825+
component_test_malloc_0_null () {
826+
msg "build: malloc(0) returns NULL (ASan+UBSan build)"
827+
scripts/config.pl full
828+
scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C
829+
make CC=gcc CFLAGS="'-DMBEDTLS_CONFIG_FILE=\"$PWD/tests/config-wrapper-malloc-0-null.h\"' -O -Werror -Wall -Wextra -fsanitize=address,undefined" LDFLAGS='-fsanitize=address,undefined'
830+
831+
msg "test: malloc(0) returns NULL (ASan+UBSan build)"
832+
make test
833+
834+
msg "selftest: malloc(0) returns NULL (ASan+UBSan build)"
835+
# By default ASan terminates the process if called with a size that's
836+
# insanely large. We do this deliberately in selftest, so disable this
837+
# behavior.
838+
if_build_succeeded env ASAN_OPTIONS='allocator_may_return_null=1' programs/test/selftest calloc
839+
}
840+
825841
component_test_aes_fewer_tables () {
826842
msg "build: default config with AES_FEWER_TABLES enabled"
827843
scripts/config.pl set MBEDTLS_AES_FEWER_TABLES

0 commit comments

Comments
 (0)