diff --git a/CMakeLists.txt b/CMakeLists.txt index a7d422d3646..886c6366043 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,7 @@ option(S2N_LTO, "Enables link time optimizations when building s2n-tls." OFF) option(S2N_STACKTRACE "Enables stacktrace functionality in s2n-tls. Note that this functionality is only available on platforms that support execinfo." ON) option(COVERAGE "Enable profiling collection for code coverage calculation" OFF) +option(BUILD_TESTING "Build tests for s2n-tls. By default only unit tests are built." ON) option(S2N_INTEG_TESTS "Enable the integrationv2 tests" OFF) option(S2N_FAST_INTEG_TESTS "Enable the integrationv2 with more parallelism, only has effect if S2N_INTEG_TESTS=ON" ON) option(S2N_INSTALL_S2NC_S2ND "Install the binaries s2nc and s2nd" OFF) @@ -41,9 +42,6 @@ option(TSAN "Enable ThreadSanitizer to test thread safety" OFF) option(ASAN "Enable AddressSanitizer to test memory safety" OFF) option(SECCOMP "Link with seccomp and run seccomp tests" OFF) -# Turn BUILD_TESTING=ON by default -include(CTest) - file(GLOB API_HEADERS "api/*.h") file(GLOB API_UNSTABLE_HEADERS "api/unstable/*.h") @@ -497,6 +495,29 @@ if (BUILD_TESTING) ########################## configure unit tests ############################ ############################################################################ + # CTest configuration variables need to be set before include(CTest) is called + set(VALGRIND_DEFAULT " \ + --leak-check=full \ + --leak-resolution=high \ + --trace-children=yes \ + -q --error-exitcode=123 \ + --error-limit=no \ + --num-callers=40 \ + --undef-value-errors=no \ + --log-fd=2 \ + --suppressions=valgrind.suppressions") + + # "pedantic valgrind" will error on memory that is "Still Reachable". + # We only run this on OpenSSL 1.1.1 because there are hundreds of false positives in other libcryptos. + # Tracking issue: https://github.com/aws/s2n-tls/issues/4777 + if ($ENV{S2N_LIBCRYPTO} MATCHES "openssl-1.1.1") + set(MEMORYCHECK_COMMAND_OPTIONS "${VALGRIND_DEFAULT} --run-libc-freeres=yes --errors-for-leak-kinds=all --show-leak-kinds=all") + else() + set(MEMORYCHECK_COMMAND_OPTIONS "${VALGRIND_DEFAULT} --run-libc-freeres=no") + endif() + + set(MEMORYCHECK_TYPE "Valgrind") + set(UNIT_TEST_ENVS S2N_DONT_MLOCK=1) if (TSAN OR ASAN) set(UNIT_TEST_ENVS ${UNIT_TEST_ENVS} S2N_ADDRESS_SANITIZER=1) @@ -525,6 +546,8 @@ if (BUILD_TESTING) endif() message(STATUS "Running tests with environment: ${UNIT_TEST_ENVS}") + include(CTest) + ############################################################################ ############################ build unit tests ############################## ############################################################################ diff --git a/codebuild/spec/buildspec_valgrind.yml b/codebuild/spec/buildspec_valgrind.yml new file mode 100644 index 00000000000..01c9b21bb9b --- /dev/null +++ b/codebuild/spec/buildspec_valgrind.yml @@ -0,0 +1,72 @@ +--- +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file 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. +version: 0.2 + +batch: + build-list: + - identifier: gcc_awslc + env: + compute-type: BUILD_GENERAL1_LARGE + image: 024603541914.dkr.ecr.us-west-2.amazonaws.com/docker:ubuntu22codebuild + variables: + S2N_LIBCRYPTO: awslc + COMPILER: gcc + - identifier: gcc_openssl_3_0 + env: + compute-type: BUILD_GENERAL1_LARGE + image: 024603541914.dkr.ecr.us-west-2.amazonaws.com/docker:ubuntu22codebuild + variables: + S2N_LIBCRYPTO: openssl-3.0 + COMPILER: gcc + - identifier: gcc_openssl_1_1_1 + env: + compute-type: BUILD_GENERAL1_LARGE + image: 024603541914.dkr.ecr.us-west-2.amazonaws.com/docker:ubuntu18codebuild + variables: + S2N_LIBCRYPTO: openssl-1.1.1 + COMPILER: gcc + - identifier: gcc_openssl_1_0_2 + env: + compute-type: BUILD_GENERAL1_LARGE + image: 024603541914.dkr.ecr.us-west-2.amazonaws.com/docker:ubuntu22codebuild + variables: + S2N_LIBCRYPTO: openssl-1.0.2 + COMPILER: gcc + +phases: + pre_build: + commands: + - | + if [ -d "third-party-src" ]; then + cd third-party-src; + fi + - /usr/bin/$COMPILER --version + build: + on-failure: ABORT + commands: + - | + cmake . -Bbuild \ + -DCMAKE_C_COMPILER=/usr/bin/$COMPILER \ + -DCMAKE_PREFIX_PATH=/usr/local/$S2N_LIBCRYPTO \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo + - cmake --build ./build -- -j $(nproc) + post_build: + on-failure: ABORT + commands: + - | + S2N_VALGRIND=1 \ + CTEST_PARALLEL_LEVEL=$(nproc) \ + CTEST_OUTPUT_ON_FAILURE=1 \ + cmake --build build/ --target test \ + -- ARGS="--test-action memcheck" diff --git a/tests/unit/s2n_alerts_protocol_test.c b/tests/unit/s2n_alerts_protocol_test.c index 4e50f552835..fc62b7024b0 100644 --- a/tests/unit/s2n_alerts_protocol_test.c +++ b/tests/unit/s2n_alerts_protocol_test.c @@ -551,7 +551,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client, config)); - DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + struct s2n_test_io_pair io_pair = { 0 }; EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client, server, &io_pair)); @@ -573,6 +573,8 @@ int main(int argc, char **argv) S2N_ERR_CLOSED); EXPECT_FALSE(s2n_connection_check_io_status(receiver, S2N_IO_READABLE)); } + /* Close the other end of pipe */ + EXPECT_SUCCESS(s2n_io_pair_close_one_end(&io_pair, 1 - mode)); }; /* Test: With partial read */ @@ -594,7 +596,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client, &partial_write_config_copy)); - DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + struct s2n_test_io_pair io_pair = { 0 }; EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client, server, &io_pair)); @@ -629,6 +631,8 @@ int main(int argc, char **argv) EXPECT_FAILURE_WITH_ERRNO(s2n_recv(receiver, data, sizeof(data), &blocked), S2N_ERR_CLOSED); } + /* Close the other end of pipe */ + EXPECT_SUCCESS(s2n_io_pair_close_one_end(&io_pair, 1 - mode)); }; }; diff --git a/tests/unit/s2n_certificate_test.c b/tests/unit/s2n_certificate_test.c index bbe9fca0cd0..48797611486 100644 --- a/tests/unit/s2n_certificate_test.c +++ b/tests/unit/s2n_certificate_test.c @@ -698,7 +698,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_cipher_preferences(tls12_client_conn, "test_all_tls12")); EXPECT_SUCCESS(s2n_connection_set_cipher_preferences(tls12_server_conn, "test_all_tls12")); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(tls12_client_conn, tls12_server_conn, &io_pair)); EXPECT_SUCCESS(s2n_negotiate_test_server_and_client(tls12_server_conn, tls12_client_conn)); @@ -719,7 +719,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_cipher_preferences(tls13_client_conn, "default_tls13")); EXPECT_SUCCESS(s2n_connection_set_cipher_preferences(tls13_server_conn, "default_tls13")); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(tls13_client_conn, tls13_server_conn, &io_pair)); EXPECT_SUCCESS(s2n_negotiate_test_server_and_client(tls13_server_conn, tls13_client_conn)); diff --git a/tests/unit/s2n_client_hello_retry_test.c b/tests/unit/s2n_client_hello_retry_test.c index 00ab2bcd5d8..c817ed54213 100644 --- a/tests/unit/s2n_client_hello_retry_test.c +++ b/tests/unit/s2n_client_hello_retry_test.c @@ -712,7 +712,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(client_conn); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -741,7 +741,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -777,7 +777,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -810,7 +810,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -844,7 +844,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -886,7 +886,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -948,7 +948,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1001,7 +1001,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1067,7 +1067,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1118,7 +1118,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1185,7 +1185,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); EXPECT_SUCCESS(s2n_set_server_name(client_conn, "localhost")); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1219,7 +1219,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); EXPECT_SUCCESS(s2n_set_server_name(client_conn, "localhost")); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1253,7 +1253,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1301,7 +1301,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(client_conn); EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1425,7 +1425,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config_with_cb)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1509,7 +1509,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(client_conn); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1553,7 +1553,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(client_conn); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1606,7 +1606,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(client_conn); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1643,7 +1643,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(client_conn); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1709,7 +1709,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(client_conn); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1792,7 +1792,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1845,7 +1845,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1920,7 +1920,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(client_conn); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -1986,7 +1986,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); diff --git a/tests/unit/s2n_client_psk_extension_test.c b/tests/unit/s2n_client_psk_extension_test.c index 676b4401cc3..72555bfa847 100644 --- a/tests/unit/s2n_client_psk_extension_test.c +++ b/tests/unit/s2n_client_psk_extension_test.c @@ -500,7 +500,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(server_conn); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); diff --git a/tests/unit/s2n_client_supported_versions_extension_test.c b/tests/unit/s2n_client_supported_versions_extension_test.c index e76ff132c1a..f78a4ed8b7d 100644 --- a/tests/unit/s2n_client_supported_versions_extension_test.c +++ b/tests/unit/s2n_client_supported_versions_extension_test.c @@ -418,7 +418,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(client_conn); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config_with_cert)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); diff --git a/tests/unit/s2n_config_test.c b/tests/unit/s2n_config_test.c index 998754458a4..e43930bb188 100644 --- a/tests/unit/s2n_config_test.c +++ b/tests/unit/s2n_config_test.c @@ -910,7 +910,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_config(client_conn, client_config)); EXPECT_SUCCESS(s2n_set_server_name(client_conn, "localhost")); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -945,7 +945,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_config(client_conn, client_config)); EXPECT_SUCCESS(s2n_connection_set_blinding(client_conn, S2N_SELF_SERVICE_BLINDING)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); diff --git a/tests/unit/s2n_crypto_test.c b/tests/unit/s2n_crypto_test.c index 744f25c4b99..e6a8fc8f768 100644 --- a/tests/unit/s2n_crypto_test.c +++ b/tests/unit/s2n_crypto_test.c @@ -142,7 +142,7 @@ int main() /* Set server master secret to known value to ensure overridden later */ memset(server->secrets.version.tls12.master_secret, 1, S2N_TLS_SECRET_LEN); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client, server, &io_pair)); EXPECT_SUCCESS(s2n_negotiate_test_server_and_client(server, client)); diff --git a/tests/unit/s2n_drbg_test.c b/tests/unit/s2n_drbg_test.c index 4595ff79b6f..4b4222cfbfc 100644 --- a/tests/unit/s2n_drbg_test.c +++ b/tests/unit/s2n_drbg_test.c @@ -451,6 +451,8 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_stuffer_free(&nist_aes256_reference_entropy)); EXPECT_SUCCESS(s2n_config_free(config)); + /* Clean up with previously set functions */ + POSIX_GUARD_RESULT(s2n_rand_cleanup()); END_TEST(); } diff --git a/tests/unit/s2n_early_data_io_api_test.c b/tests/unit/s2n_early_data_io_api_test.c index 38b56330e51..ba599a5b674 100644 --- a/tests/unit/s2n_early_data_io_api_test.c +++ b/tests/unit/s2n_early_data_io_api_test.c @@ -28,7 +28,8 @@ EXPECT_EQUAL((blocked), (expected_blocked)); \ EXPECT_EQUAL(s2n_conn_get_current_message_type(conn), (expected_msg)) -static S2N_RESULT s2n_test_client_and_server_new(struct s2n_connection **client_conn, struct s2n_connection **server_conn) +static S2N_RESULT s2n_test_client_and_server_new(struct s2n_connection **client_conn, struct s2n_connection **server_conn, + struct s2n_test_io_pair *io_pair) { *client_conn = s2n_connection_new(S2N_CLIENT); EXPECT_NOT_NULL(*client_conn); @@ -39,9 +40,8 @@ static S2N_RESULT s2n_test_client_and_server_new(struct s2n_connection **client_ EXPECT_SUCCESS(s2n_connection_set_blinding(*server_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_cipher_preferences(*server_conn, "default_tls13")); - struct s2n_test_io_pair io_pair = { 0 }; - EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); - EXPECT_SUCCESS(s2n_connections_set_io_pair(*client_conn, *server_conn, &io_pair)); + EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(io_pair)); + EXPECT_SUCCESS(s2n_connections_set_io_pair(*client_conn, *server_conn, io_pair)); return S2N_RESULT_OK; } @@ -247,7 +247,8 @@ int main(int argc, char **argv) /* Propagate errors from s2n_recv */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -276,7 +277,8 @@ int main(int argc, char **argv) /* Send zero-length early data */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -308,7 +310,8 @@ int main(int argc, char **argv) /* Send early data once */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -342,7 +345,8 @@ int main(int argc, char **argv) /* Receive early data too large for buffer */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -393,7 +397,8 @@ int main(int argc, char **argv) /* Send multiple early data messages */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -432,7 +437,8 @@ int main(int argc, char **argv) /* Receive and combine multiple early data records */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -474,7 +480,8 @@ int main(int argc, char **argv) /* Early data not requested */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk_with_wrong_early_data)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -509,7 +516,8 @@ int main(int argc, char **argv) /* Early data rejected */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk_with_wrong_early_data)); diff --git a/tests/unit/s2n_early_data_io_test.c b/tests/unit/s2n_early_data_io_test.c index 75c133cc033..a388126f7e5 100644 --- a/tests/unit/s2n_early_data_io_test.c +++ b/tests/unit/s2n_early_data_io_test.c @@ -25,7 +25,8 @@ EXPECT_EQUAL(s2n_recv(conn, data_buffer, data_buffer_size, blocked), data_len); \ EXPECT_BYTEARRAY_EQUAL(data_buffer, data, data_len) -static S2N_RESULT s2n_test_client_and_server_new(struct s2n_connection **client_conn, struct s2n_connection **server_conn) +static S2N_RESULT s2n_test_client_and_server_new(struct s2n_connection **client_conn, struct s2n_connection **server_conn, + struct s2n_test_io_pair *io_pair) { *client_conn = s2n_connection_new(S2N_CLIENT); EXPECT_NOT_NULL(*client_conn); @@ -36,9 +37,8 @@ static S2N_RESULT s2n_test_client_and_server_new(struct s2n_connection **client_ EXPECT_SUCCESS(s2n_connection_set_blinding(*server_conn, S2N_SELF_SERVICE_BLINDING)); EXPECT_SUCCESS(s2n_connection_set_cipher_preferences(*server_conn, "default_tls13")); - struct s2n_test_io_pair io_pair = { 0 }; - EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); - EXPECT_SUCCESS(s2n_connections_set_io_pair(*client_conn, *server_conn, &io_pair)); + EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(io_pair)); + EXPECT_SUCCESS(s2n_connections_set_io_pair(*client_conn, *server_conn, io_pair)); return S2N_RESULT_OK; } @@ -88,7 +88,8 @@ int main(int argc, char **argv) /* Early data not supported by server */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -115,7 +116,8 @@ int main(int argc, char **argv) /* Early data not supported by client */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -142,7 +144,8 @@ int main(int argc, char **argv) /* Server does not support TLS1.3 */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_set_early_data_expected(client_conn)); @@ -166,7 +169,8 @@ int main(int argc, char **argv) /* Early data accepted */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -212,7 +216,8 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(config); struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_set_config(server_conn, config)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); @@ -255,7 +260,8 @@ int main(int argc, char **argv) /* Early data rejected */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk_without_early_data)); @@ -289,7 +295,8 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(config); struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_set_config(server_conn, config)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); @@ -327,7 +334,8 @@ int main(int argc, char **argv) /* Early data rejected and ignored */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk_to_reject)); @@ -364,7 +372,8 @@ int main(int argc, char **argv) /* Early data rejected, but too much early data received */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk_to_reject)); @@ -403,7 +412,8 @@ int main(int argc, char **argv) /* Early data rejected due to HRR */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -494,7 +504,8 @@ int main(int argc, char **argv) /* PSK rejected altogether */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_set_config(client_conn, config_with_cert)); EXPECT_SUCCESS(s2n_connection_set_config(server_conn, config_with_cert)); @@ -526,7 +537,8 @@ int main(int argc, char **argv) /* End early data after the server accepts the early data request */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -589,7 +601,8 @@ int main(int argc, char **argv) /* End early data before the server accepts the early data request. */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -626,7 +639,8 @@ int main(int argc, char **argv) { DEFER_CLEANUP(struct s2n_connection *client_conn = NULL, s2n_connection_ptr_free); DEFER_CLEANUP(struct s2n_connection *server_conn = NULL, s2n_connection_ptr_free); - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -675,7 +689,8 @@ int main(int argc, char **argv) /* s2n_recv can read early data sent with s2n_send */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -742,7 +757,8 @@ int main(int argc, char **argv) /* s2n_recv fails if it encounters a handshake message instead of early data. */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); @@ -774,7 +790,8 @@ int main(int argc, char **argv) /* s2n_recv fails on too much early data */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_test_client_and_server_new(&client_conn, &server_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); diff --git a/tests/unit/s2n_examples_test.c b/tests/unit/s2n_examples_test.c index 9e06ee27ea7..7c0edcd68ad 100644 --- a/tests/unit/s2n_examples_test.c +++ b/tests/unit/s2n_examples_test.c @@ -250,6 +250,7 @@ static S2N_RESULT s2n_run_self_talk_test(s2n_test_scenario scenario_fn) EXPECT_SUCCESS(s2n_cert_chain_and_key_free(chain_and_key)); EXPECT_SUCCESS(s2n_config_free(config)); EXPECT_SUCCESS(s2n_free(&input)); + EXPECT_SUCCESS(s2n_io_pair_close_one_end(&io_pair, S2N_CLIENT)); exit(EXIT_SUCCESS); } @@ -273,6 +274,7 @@ static S2N_RESULT s2n_run_self_talk_test(s2n_test_scenario scenario_fn) EXPECT_SUCCESS(s2n_cert_chain_and_key_free(chain_and_key)); EXPECT_SUCCESS(s2n_config_free(config)); EXPECT_SUCCESS(s2n_free(&input)); + EXPECT_SUCCESS(s2n_io_pair_close_one_end(&io_pair, S2N_SERVER)); exit(EXIT_SUCCESS); } diff --git a/tests/unit/s2n_extension_type_test.c b/tests/unit/s2n_extension_type_test.c index 2b5ea4e9ddf..97b60a97c34 100644 --- a/tests/unit/s2n_extension_type_test.c +++ b/tests/unit/s2n_extension_type_test.c @@ -487,7 +487,7 @@ int main() EXPECT_NOT_NULL(server_conn); EXPECT_SUCCESS(s2n_connection_set_config(server_conn, test_all_config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -515,7 +515,7 @@ int main() EXPECT_NOT_NULL(server_conn); EXPECT_SUCCESS(s2n_connection_set_config(server_conn, test_all_config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); @@ -544,7 +544,7 @@ int main() EXPECT_SUCCESS(s2n_connection_set_config(server_conn, test_all_config)); EXPECT_SUCCESS(s2n_connection_set_cipher_preferences(server_conn, "test_all_tls12")); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); diff --git a/tests/unit/s2n_fork_generation_number_test.c b/tests/unit/s2n_fork_generation_number_test.c index 6ccf9e9274f..5b99dc15577 100644 --- a/tests/unit/s2n_fork_generation_number_test.c +++ b/tests/unit/s2n_fork_generation_number_test.c @@ -30,6 +30,7 @@ #include "s2n_test.h" #include "utils/s2n_fork_detection.h" +#include "utils/s2n_random.h" #define NUMBER_OF_FGN_TEST_CASES 4 #define MAX_NUMBER_OF_TEST_THREADS 2 @@ -189,6 +190,9 @@ static int s2n_unit_test_clone_child_process(void *parent_process_fgn) /* Verify in threads */ EXPECT_EQUAL(s2n_unit_test_thread(return_fork_generation_number), S2N_SUCCESS); + /* Clean up urandom of the child process */ + POSIX_GUARD_RESULT(s2n_rand_cleanup()); + /* This translates to the exit code for this child process */ return EXIT_SUCCESS; } diff --git a/tests/unit/s2n_handshake_partial_test.c b/tests/unit/s2n_handshake_partial_test.c index 0ec829635d8..f1ed4a2b847 100644 --- a/tests/unit/s2n_handshake_partial_test.c +++ b/tests/unit/s2n_handshake_partial_test.c @@ -20,7 +20,7 @@ #include "tls/s2n_tls.h" static S2N_RESULT s2n_get_test_client_and_server(struct s2n_connection **client_conn, struct s2n_connection **server_conn, - struct s2n_config *config) + struct s2n_config *config, struct s2n_test_io_pair *io_pair) { *client_conn = s2n_connection_new(S2N_CLIENT); RESULT_ENSURE_REF(*client_conn); @@ -32,9 +32,8 @@ static S2N_RESULT s2n_get_test_client_and_server(struct s2n_connection **client_ RESULT_GUARD_POSIX(s2n_connection_set_config(*client_conn, config)); RESULT_GUARD_POSIX(s2n_connection_set_config(*server_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; - RESULT_GUARD_POSIX(s2n_io_pair_init_non_blocking(&io_pair)); - RESULT_GUARD_POSIX(s2n_connections_set_io_pair(*client_conn, *server_conn, &io_pair)); + RESULT_GUARD_POSIX(s2n_io_pair_init_non_blocking(io_pair)); + RESULT_GUARD_POSIX(s2n_connections_set_io_pair(*client_conn, *server_conn, io_pair)); return S2N_RESULT_OK; } @@ -75,7 +74,8 @@ int main() /* If message is never encountered, complete the handshake */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_get_test_client_and_server(&client_conn, &server_conn, config)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_get_test_client_and_server(&client_conn, &server_conn, config, &io_pair)); EXPECT_OK(s2n_negotiate_test_server_and_client_until_message(server_conn, client_conn, SERVER_KEY)); @@ -89,7 +89,8 @@ int main() /* Can stop on a given message */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_get_test_client_and_server(&client_conn, &server_conn, config)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_get_test_client_and_server(&client_conn, &server_conn, config, &io_pair)); EXPECT_OK(s2n_negotiate_test_server_and_client_until_message(server_conn, client_conn, SERVER_CERT_VERIFY)); @@ -103,7 +104,8 @@ int main() /* Can be called repeatedly */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_get_test_client_and_server(&client_conn, &server_conn, config)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_get_test_client_and_server(&client_conn, &server_conn, config, &io_pair)); EXPECT_OK(s2n_negotiate_test_server_and_client_until_message(server_conn, client_conn, CLIENT_HELLO)); @@ -142,7 +144,8 @@ int main() /* Can continue as normal after stopping */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_get_test_client_and_server(&client_conn, &server_conn, config)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_get_test_client_and_server(&client_conn, &server_conn, config, &io_pair)); EXPECT_OK(s2n_negotiate_test_server_and_client_until_message(server_conn, client_conn, CLIENT_FINISHED)); @@ -161,7 +164,8 @@ int main() * (This is the non-test use case for this feature) */ { struct s2n_connection *client_conn = NULL, *server_conn = NULL; - EXPECT_OK(s2n_get_test_client_and_server(&client_conn, &server_conn, config)); + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + EXPECT_OK(s2n_get_test_client_and_server(&client_conn, &server_conn, config, &io_pair)); EXPECT_SUCCESS(s2n_connection_append_psk(client_conn, test_psk)); EXPECT_SUCCESS(s2n_connection_append_psk(server_conn, test_psk)); diff --git a/tests/unit/s2n_io_test.c b/tests/unit/s2n_io_test.c index c06782f9308..b75254b2a07 100644 --- a/tests/unit/s2n_io_test.c +++ b/tests/unit/s2n_io_test.c @@ -102,6 +102,8 @@ int main(int argc, char **argv) s2n_test_real_interrupt(io_pair.client, n_times, &counter)); EXPECT_EQUAL(result, S2N_TEST_SUCCESS); EXPECT_EQUAL(counter, n_times); + /* Child process exit don't close io_pair properly, so manually close it*/ + EXPECT_SUCCESS(s2n_io_pair_close(&io_pair)); exit(0); } diff --git a/tests/unit/s2n_key_update_threads_test.c b/tests/unit/s2n_key_update_threads_test.c index 364e26edf67..418fbd4f152 100644 --- a/tests/unit/s2n_key_update_threads_test.c +++ b/tests/unit/s2n_key_update_threads_test.c @@ -208,6 +208,7 @@ static S2N_RESULT s2n_run_self_talk_test(s2n_test_scenario scenario_fn) EXPECT_SUCCESS(s2n_connection_free(client)); EXPECT_SUCCESS(s2n_cert_chain_and_key_free(chain_and_key)); EXPECT_SUCCESS(s2n_config_free(config)); + EXPECT_SUCCESS(s2n_io_pair_close_one_end(&io_pair, S2N_CLIENT)); exit(EXIT_SUCCESS); } @@ -231,6 +232,7 @@ static S2N_RESULT s2n_run_self_talk_test(s2n_test_scenario scenario_fn) EXPECT_SUCCESS(s2n_connection_free(server)); EXPECT_SUCCESS(s2n_cert_chain_and_key_free(chain_and_key)); EXPECT_SUCCESS(s2n_config_free(config)); + EXPECT_SUCCESS(s2n_io_pair_close_one_end(&io_pair, S2N_SERVER)); exit(EXIT_SUCCESS); } diff --git a/tests/unit/s2n_ktls_io_sendfile_test.c b/tests/unit/s2n_ktls_io_sendfile_test.c index 718d802fc5d..3d13cfd7730 100644 --- a/tests/unit/s2n_ktls_io_sendfile_test.c +++ b/tests/unit/s2n_ktls_io_sendfile_test.c @@ -133,7 +133,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(conn); conn->ktls_send_enabled = true; - DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); + struct s2n_test_io_pair io_pair = { 0 }; EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); int write_fd = io_pair.server; int read_fd = io_pair.client; @@ -149,6 +149,7 @@ int main(int argc, char **argv) EXPECT_FAILURE_WITH_ERRNO(ret, S2N_ERR_IO); EXPECT_EQUAL(bytes_written, 0); EXPECT_EQUAL(blocked, S2N_BLOCKED_ON_WRITE); + close(write_fd); }; /* Test: send blocks */ diff --git a/tests/unit/s2n_mem_usage_test.c b/tests/unit/s2n_mem_usage_test.c index 2eeeb90ecdb..e2dc88ddf88 100644 --- a/tests/unit/s2n_mem_usage_test.c +++ b/tests/unit/s2n_mem_usage_test.c @@ -155,7 +155,7 @@ int main(int argc, char **argv) BEGIN_TEST(); EXPECT_SUCCESS(s2n_disable_tls13_in_test()); - struct s2n_test_io_pair io_pair; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); /* Skip the test when running under valgrind or address sanitizer, as those tools diff --git a/tests/unit/s2n_override_openssl_random_test.c b/tests/unit/s2n_override_openssl_random_test.c index 765d806b525..b82043abf89 100644 --- a/tests/unit/s2n_override_openssl_random_test.c +++ b/tests/unit/s2n_override_openssl_random_test.c @@ -131,6 +131,8 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_stuffer_free(&dhparams_in)); EXPECT_SUCCESS(s2n_stuffer_free(&test_entropy)); free(dhparams_pem); + /* Clean up with previously set functions */ + POSIX_GUARD_RESULT(s2n_rand_cleanup()); END_TEST(); } diff --git a/tests/unit/s2n_random_test.c b/tests/unit/s2n_random_test.c index b2b5ecdbd63..2132854cfb2 100644 --- a/tests/unit/s2n_random_test.c +++ b/tests/unit/s2n_random_test.c @@ -839,10 +839,9 @@ static int s2n_random_invalid_urandom_fd_cb(struct random_test_case *test_case) EXPECT_OK(s2n_rand_set_urandom_for_test()); EXPECT_TRUE(dev_urandom->fd > STDERR_FILENO); - if (test == 0) { - /* Close the file descriptor. */ - EXPECT_EQUAL(close(dev_urandom->fd), 0); - } else { + /* Close the file descriptor. */ + EXPECT_EQUAL(close(dev_urandom->fd), 0); + if (test != 0) { /* Make the file descriptor invalid by pointing it to STDERR. */ dev_urandom->fd = STDERR_FILENO; } diff --git a/tests/unit/s2n_recv_test.c b/tests/unit/s2n_recv_test.c index acb6e37ee12..93bd93aad58 100644 --- a/tests/unit/s2n_recv_test.c +++ b/tests/unit/s2n_recv_test.c @@ -88,7 +88,7 @@ int main(int argc, char **argv) s2n_connection_ptr_free); EXPECT_SUCCESS(s2n_connection_set_config(server_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); EXPECT_SUCCESS(s2n_negotiate_test_server_and_client(server_conn, client_conn)); @@ -234,7 +234,7 @@ int main(int argc, char **argv) s2n_connection_ptr_free); EXPECT_SUCCESS(s2n_connection_set_config(server_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); EXPECT_SUCCESS(s2n_negotiate_test_server_and_client(server_conn, client_conn)); @@ -280,7 +280,7 @@ int main(int argc, char **argv) s2n_connection_ptr_free); EXPECT_SUCCESS(s2n_connection_set_config(server_conn, config)); - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); EXPECT_SUCCESS(s2n_negotiate_test_server_and_client(server_conn, client_conn)); diff --git a/tests/unit/s2n_release_non_empty_buffers_test.c b/tests/unit/s2n_release_non_empty_buffers_test.c index 7888583e925..7f40115e673 100644 --- a/tests/unit/s2n_release_non_empty_buffers_test.c +++ b/tests/unit/s2n_release_non_empty_buffers_test.c @@ -59,6 +59,7 @@ int mock_client(struct s2n_test_io_pair *io_pair) s2n_connection_free(conn); s2n_config_free(client_config); s2n_cleanup(); + EXPECT_SUCCESS(s2n_io_pair_close_one_end(io_pair, S2N_CLIENT)); exit(0); } @@ -82,7 +83,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_disable_tls13_in_test()); /* Create a pipe */ - struct s2n_test_io_pair io_pair; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init(&io_pair)); /* Create a child process */ @@ -196,6 +197,7 @@ int main(int argc, char **argv) free(private_key_pem); s2n_cleanup(); + EXPECT_SUCCESS(s2n_io_pair_close_one_end(&io_pair, S2N_SERVER)); END_TEST(); diff --git a/tests/unit/s2n_self_talk_broken_pipe_test.c b/tests/unit/s2n_self_talk_broken_pipe_test.c index 2303b9230da..8b3508a3f79 100644 --- a/tests/unit/s2n_self_talk_broken_pipe_test.c +++ b/tests/unit/s2n_self_talk_broken_pipe_test.c @@ -82,6 +82,7 @@ void mock_client(struct s2n_test_io_pair *io_pair) sleep(1); s2n_io_pair_shutdown_one_end(io_pair, S2N_CLIENT, SHUT_WR); + s2n_io_pair_close_one_end(io_pair, S2N_CLIENT); exit(0); } @@ -102,7 +103,7 @@ int main(int argc, char **argv) struct s2n_cert_chain_and_key *chain_and_keys[SUPPORTED_CERTIFICATE_FORMATS]; /* Create a pipe */ - struct s2n_test_io_pair io_pair; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init(&io_pair)); /* Create a child process */ diff --git a/tests/unit/s2n_self_talk_io_mem_test.c b/tests/unit/s2n_self_talk_io_mem_test.c index f28a1d1f8fc..058cb901421 100644 --- a/tests/unit/s2n_self_talk_io_mem_test.c +++ b/tests/unit/s2n_self_talk_io_mem_test.c @@ -54,7 +54,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_config(server_conn, config)); /* Create nonblocking pipes */ - struct s2n_test_io_pair io_pair; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connection_set_io_pair(client_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_set_io_pair(server_conn, &io_pair)); @@ -89,7 +89,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_config(server_conn, config)); /* Create nonblocking pipes */ - struct s2n_test_io_pair io_pair; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connection_set_io_pair(client_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_set_io_pair(server_conn, &io_pair)); @@ -143,7 +143,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_set_config(server_conn, config_for_mfl)); /* Create nonblocking pipes */ - struct s2n_test_io_pair io_pair; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connection_set_io_pair(client_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_set_io_pair(server_conn, &io_pair)); @@ -190,7 +190,7 @@ int main(int argc, char **argv) EXPECT_EQUAL(server_conn->out.blob.size, 0); /* Create nonblocking pipes */ - struct s2n_test_io_pair io_pair; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connection_set_io_pair(client_conn, &io_pair)); EXPECT_SUCCESS(s2n_connection_set_io_pair(server_conn, &io_pair)); diff --git a/tests/unit/s2n_self_talk_session_id_test.c b/tests/unit/s2n_self_talk_session_id_test.c index f111e77cd33..933ccc16a20 100644 --- a/tests/unit/s2n_self_talk_session_id_test.c +++ b/tests/unit/s2n_self_talk_session_id_test.c @@ -578,6 +578,7 @@ int main(int argc, char **argv) EXPECT_SUCCESS(s2n_connection_free(client_conn)); EXPECT_SUCCESS(s2n_connection_free(server_conn)); + EXPECT_SUCCESS(s2n_io_pair_close(&io_pair)); }; /** diff --git a/tests/unit/s2n_testlib_test.c b/tests/unit/s2n_testlib_test.c index f5f7b8b9df0..127c4976072 100644 --- a/tests/unit/s2n_testlib_test.c +++ b/tests/unit/s2n_testlib_test.c @@ -33,7 +33,7 @@ int main(int argc, char **argv) EXPECT_NOT_NULL(server_conn = s2n_connection_new(S2N_SERVER)); /* Create nonblocking pipes */ - struct s2n_test_io_pair io_pair; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair, s2n_io_pair_close); POSIX_GUARD(s2n_io_pair_init_non_blocking(&io_pair)); POSIX_GUARD(s2n_connection_set_io_pair(server_conn, &io_pair)); diff --git a/tests/unit/s2n_tls13_cert_verify_test.c b/tests/unit/s2n_tls13_cert_verify_test.c index 7a6e781be1a..a3d362440a1 100644 --- a/tests/unit/s2n_tls13_cert_verify_test.c +++ b/tests/unit/s2n_tls13_cert_verify_test.c @@ -307,7 +307,7 @@ int main(int argc, char **argv) client_policy.signature_preferences = &test_sig_preferences; client_conn->security_policy_override = &client_policy; - struct s2n_test_io_pair io_pair = { 0 }; + DEFER_CLEANUP(struct s2n_test_io_pair io_pair = { 0 }, s2n_io_pair_close); EXPECT_SUCCESS(s2n_io_pair_init_non_blocking(&io_pair)); EXPECT_SUCCESS(s2n_connections_set_io_pair(client_conn, server_conn, &io_pair)); diff --git a/tests/unit/valgrind.suppressions b/tests/unit/valgrind.suppressions index 3662410a9bf..e0f90fd05cb 100644 --- a/tests/unit/valgrind.suppressions +++ b/tests/unit/valgrind.suppressions @@ -1,13 +1,48 @@ -# It looks like valgrind may generate false positives on pthreads: https://stackoverflow.com/a/13132968 +# Valgrind may generate false positives on pthreads: https://stackoverflow.com/a/13132968 +# Without these suppressions, the following tests will fail: +# s2n_examples_test, s2n_fork_generation_number_test, s2n_init_test, s2n_key_update_threads_test, and s2n_random_test. { - pthred_false_positive + pthread_false_positive Memcheck:Leak match-leak-kinds: possible fun:calloc + ... fun:allocate_dtv fun:_dl_allocate_tls fun:allocate_stack - fun:pthread_create@@GLIBC_2.2.5 + fun:pthread_create@@* + ... + fun:main +} + +# This memory leak is believed to be caused by backtrace() loading libgcc dynamically. +# See https://man7.org/linux/man-pages/man3/backtrace_symbols_fd.3.html +# We were unable to find any relevant bug reports. However, testing showed that the memory +# leak didn't scale with the number of calls to backtrace(), both supporting this theory and +# limiting the potential impact of the leak. +{ + stacktrace_suppression + Memcheck:Leak + match-leak-kinds: possible + fun:malloc + fun:malloc + fun:_dlfo_mappings_segment_allocate + fun:_dl_find_object_update_1 + fun:_dl_find_object_update + fun:dl_open_worker_begin + fun:_dl_catch_exception + fun:dl_open_worker + fun:_dl_catch_exception + fun:_dl_open + fun:do_dlopen + fun:_dl_catch_exception + fun:_dl_catch_error + fun:dlerror_run + fun:__libc_dlopen_mode + fun:__libc_unwind_link_get + ... + fun:backtrace + ... fun:main }