mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2024-12-23 00:05:35 +00:00
Merge pull request #3601 from gufe44/helpers-redirect-restore-output-2.16
[Backport 2.16] Fix bug in redirection of unit test outputs
This commit is contained in:
commit
d69edda8de
4
ChangeLog.d/stdout-macro.txt
Normal file
4
ChangeLog.d/stdout-macro.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
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.
|
||||||
|
Adopted for LTS branch 2.16 in #3601.
|
|
@ -391,45 +391,52 @@ void mbedtls_param_failed( const char *failure_condition,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
|
#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 );
|
path_stream = fopen( path, "w" );
|
||||||
fclose( *out_stream );
|
if( path_stream == NULL )
|
||||||
*out_stream = fopen( path, "w" );
|
|
||||||
|
|
||||||
if( *out_stream == NULL )
|
|
||||||
{
|
{
|
||||||
close( stdout_fd );
|
close( dup_fd );
|
||||||
return -1;
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return stdout_fd;
|
fflush( out_stream );
|
||||||
|
if( dup2( fileno( path_stream ), out_fd ) == -1 )
|
||||||
|
{
|
||||||
|
close( dup_fd );
|
||||||
|
fclose( path_stream );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
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 );
|
int out_fd = fileno( out_stream );
|
||||||
fclose( *out_stream );
|
|
||||||
|
|
||||||
*out_stream = fdopen( old_fd, "w" );
|
fflush( out_stream );
|
||||||
if( *out_stream == NULL )
|
if( dup2( dup_fd, out_fd ) == -1 )
|
||||||
{
|
{
|
||||||
return -1;
|
close( out_fd );
|
||||||
|
close( dup_fd );
|
||||||
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
close( dup_fd );
|
||||||
}
|
return( 0 );
|
||||||
|
|
||||||
static void close_output( FILE* out_stream )
|
|
||||||
{
|
|
||||||
fclose( out_stream );
|
|
||||||
}
|
}
|
||||||
#endif /* __unix__ || __APPLE__ __MACH__ */
|
#endif /* __unix__ || __APPLE__ __MACH__ */
|
||||||
|
|
||||||
|
|
|
@ -555,7 +555,7 @@ int execute_tests( int argc , const char ** argv )
|
||||||
*/
|
*/
|
||||||
if( !option_verbose )
|
if( !option_verbose )
|
||||||
{
|
{
|
||||||
stdout_fd = redirect_output( &stdout, "/dev/null" );
|
stdout_fd = redirect_output( stdout, "/dev/null" );
|
||||||
if( stdout_fd == -1 )
|
if( stdout_fd == -1 )
|
||||||
{
|
{
|
||||||
/* Redirection has failed with no stdout so exit */
|
/* Redirection has failed with no stdout so exit */
|
||||||
|
@ -575,7 +575,7 @@ int execute_tests( int argc , const char ** argv )
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
|
#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 */
|
/* Redirection has failed with no stdout so exit */
|
||||||
exit( 1 );
|
exit( 1 );
|
||||||
|
@ -667,10 +667,5 @@ int execute_tests( int argc , const char ** argv )
|
||||||
mbedtls_memory_buffer_alloc_free();
|
mbedtls_memory_buffer_alloc_free();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
|
|
||||||
if( stdout_fd != -1 )
|
|
||||||
close_output( stdout );
|
|
||||||
#endif /* __unix__ || __APPLE__ __MACH__ */
|
|
||||||
|
|
||||||
return( total_errors != 0 );
|
return( total_errors != 0 );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue