diff options
author | gufe44 <56860520+gufe44@users.noreply.github.com> | 2020-07-30 09:02:27 +0200 |
---|---|---|
committer | gufe44 <gu981@protonmail.com> | 2020-08-21 08:32:26 +0200 |
commit | 067f6e01f1a82041b6f9fa34e0de8149b211c64e (patch) | |
tree | 02dca62fc44528276d25cae1d29c54492ce8ac27 | |
parent | ee7e85f5b94a49cbe7a1977e4ac089e4c9013aa8 (diff) | |
download | mbed-tls-067f6e01f1a82041b6f9fa34e0de8149b211c64e.tar.gz |
Fix bug in redirection of unit test outputs
Avoid replacing handle. stdout is defined as a macro on several platforms.
Signed-off-by: gufe44 <gu981@protonmail.com>
-rw-r--r-- | ChangeLog.d/stdout-macro.txt | 3 | ||||
-rw-r--r-- | tests/suites/helpers.function | 53 | ||||
-rw-r--r-- | tests/suites/host_test.function | 9 |
3 files changed, 35 insertions, 30 deletions
diff --git a/ChangeLog.d/stdout-macro.txt b/ChangeLog.d/stdout-macro.txt new file mode 100644 index 000000000..94562404a --- /dev/null +++ b/ChangeLog.d/stdout-macro.txt @@ -0,0 +1,3 @@ +Bugfix + * Fix bug in redirection of unit test outputs on platforms where stdout is + defined as a macro. First reported in #2311 and fix contributed in #3528. diff --git a/tests/suites/helpers.function b/tests/suites/helpers.function index a5285a3a6..7425a359c 100644 --- a/tests/suites/helpers.function +++ b/tests/suites/helpers.function @@ -446,44 +446,51 @@ void mbedtls_param_failed( const char *failure_condition, #endif #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) -static int redirect_output( FILE** out_stream, const char* path ) +static int redirect_output( FILE* out_stream, const char* path ) { - int stdout_fd = dup( fileno( *out_stream ) ); + int out_fd, dup_fd; + FILE* path_stream; - if( stdout_fd == -1 ) + out_fd = fileno( out_stream ); + dup_fd = dup( out_fd ); + + if( dup_fd == -1 ) { - return -1; + return( -1 ); } - fflush( *out_stream ); - fclose( *out_stream ); - *out_stream = fopen( path, "w" ); + path_stream = fopen( path, "w" ); + if( path_stream == NULL ) + { + close( dup_fd ); + return( -1 ); + } - if( *out_stream == NULL ) + fflush( out_stream ); + if( dup2( fileno( path_stream ), out_fd ) == -1 ) { - close( stdout_fd ); - return -1; + close( dup_fd ); + fclose( path_stream ); + return( -1 ); } - return stdout_fd; + fclose( path_stream ); + return( dup_fd ); } -static int restore_output( FILE** out_stream, int old_fd ) +static int restore_output( FILE* out_stream, int dup_fd ) { - fflush( *out_stream ); - fclose( *out_stream ); + int out_fd = fileno( out_stream ); - *out_stream = fdopen( old_fd, "w" ); - if( *out_stream == NULL ) + fflush( out_stream ); + if( dup2( dup_fd, out_fd ) == -1 ) { - return -1; + close( out_fd ); + close( dup_fd ); + return( -1 ); } - return 0; -} - -static void close_output( FILE* out_stream ) -{ - fclose( out_stream ); + close( dup_fd ); + return( 0 ); } #endif /* __unix__ || __APPLE__ __MACH__ */ diff --git a/tests/suites/host_test.function b/tests/suites/host_test.function index a459eed56..cce2899f4 100644 --- a/tests/suites/host_test.function +++ b/tests/suites/host_test.function @@ -692,7 +692,7 @@ int execute_tests( int argc , const char ** argv ) */ if( !option_verbose ) { - stdout_fd = redirect_output( &stdout, "/dev/null" ); + stdout_fd = redirect_output( stdout, "/dev/null" ); if( stdout_fd == -1 ) { /* Redirection has failed with no stdout so exit */ @@ -712,7 +712,7 @@ int execute_tests( int argc , const char ** argv ) } #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) - if( !option_verbose && restore_output( &stdout, stdout_fd ) ) + if( !option_verbose && restore_output( stdout, stdout_fd ) ) { /* Redirection has failed with no stdout so exit */ exit( 1 ); @@ -817,10 +817,5 @@ int execute_tests( int argc , const char ** argv ) mbedtls_memory_buffer_alloc_free(); #endif -#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) - if( stdout_fd != -1 ) - close_output( stdout ); -#endif /* __unix__ || __APPLE__ __MACH__ */ - return( total_errors != 0 ); } |