From 06725c985f55fd4d8b96ad3de8759b40abe9f0eb Mon Sep 17 00:00:00 2001 From: Gilles Peskine Date: Mon, 30 Mar 2020 21:39:09 +0200 Subject: [PATCH] Fix intermittent crash in test suites with outcome file enabled Fix an intermittent crash when running test suites in non-verbose mode (i.e. with -v off) and with the outcome file enabled. The array unmet_dependencies was only filled in verbose mode, but was used in write_outcome_result regardless. Since unmet_dependencies only ever contains strings that are integers written out in decimal, store the integer instead. Do this unconditionally since it doesn't cost any extra memory. It would be better to record the dependency names, both in the verbose output and in the outcome file. But the dependency names are not currently available at runtime. Signed-off-by: Gilles Peskine --- tests/suites/host_test.function | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/tests/suites/host_test.function b/tests/suites/host_test.function index 646734081..1069c2415 100644 --- a/tests/suites/host_test.function +++ b/tests/suites/host_test.function @@ -425,7 +425,7 @@ static void write_outcome_entry( FILE *outcome_file, */ static void write_outcome_result( FILE *outcome_file, size_t unmet_dep_count, - char *unmet_dependencies[], + int unmet_dependencies[], int ret, const test_info_t *info ) { @@ -443,7 +443,7 @@ static void write_outcome_result( FILE *outcome_file, mbedtls_fprintf( outcome_file, "SKIP" ); for( i = 0; i < unmet_dep_count; i++ ) { - mbedtls_fprintf( outcome_file, "%c%s", + mbedtls_fprintf( outcome_file, "%c%d", i == 0 ? ';' : ':', unmet_dependencies[i] ); } @@ -598,7 +598,7 @@ int execute_tests( int argc , const char ** argv ) testfile_index++ ) { size_t unmet_dep_count = 0; - char *unmet_dependencies[20]; + int unmet_dependencies[20]; test_filename = test_files[ testfile_index ]; @@ -647,19 +647,7 @@ int execute_tests( int argc , const char ** argv ) int dep_id = strtol( params[i], NULL, 10 ); if( dep_check( dep_id ) != DEPENDENCY_SUPPORTED ) { - if( 0 == option_verbose ) - { - /* Only one count is needed if not verbose */ - unmet_dep_count++; - break; - } - - unmet_dependencies[ unmet_dep_count ] = strdup( params[i] ); - if( unmet_dependencies[ unmet_dep_count ] == NULL ) - { - mbedtls_fprintf( stderr, "FATAL: Out of memory\n" ); - mbedtls_exit( MBEDTLS_EXIT_FAILURE ); - } + unmet_dependencies[unmet_dep_count] = dep_id; unmet_dep_count++; } } @@ -730,9 +718,8 @@ int execute_tests( int argc , const char ** argv ) mbedtls_fprintf( stdout, "\n Unmet dependencies: " ); for( i = 0; i < unmet_dep_count; i++ ) { - mbedtls_fprintf( stdout, "%s ", + mbedtls_fprintf( stdout, "%d ", unmet_dependencies[i] ); - free( unmet_dependencies[i] ); } } mbedtls_fprintf( stdout, "\n" ); @@ -783,10 +770,6 @@ int execute_tests( int argc , const char ** argv ) total_errors++; } fclose( file ); - - /* In case we encounter early end of file */ - for( i = 0; i < unmet_dep_count; i++ ) - free( unmet_dependencies[i] ); } if( outcome_file != NULL )