mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2024-12-23 04:55:33 +00:00
Fix race condition in error printing in ssl_server2.c
The race goes this way: 1. ssl_recv() succeeds (ie no signal received yet) 2. processing the message leads to aborting handshake with ret != 0 3. reset ret if we were signaled 4. print error if ret is still non-zero 5. go back to net_accept() which can be interrupted by a signal We print the error message only if the signal is received between steps 3 and 5, not when it arrives between steps 1 and 3. This can cause failures in ssl-opt.sh where we check for the presence of "Last error was..." in the server's output: if we perform step 2, the client will be notified and exit, then ssl-opt.sh will send SIGTERM to the server, but if it didn't get a chance to run and pass step 3 in the meantime, we're in trouble. The purpose of step 3 was to avoid spurious "Last error" messages in the output so that ssl-opt.sh can check for a successful run by the absence of that message. However, it is enough to suppress that message when the last error we get is the one we expect from being interrupted by a signal - doing more could hide real errors. Also, improve the messages printed when interrupted to make it easier to distinguish the two cases - this could be used in a testing script wanted to check that the server doesn't see the client as disconnecting unexpectedly.
This commit is contained in:
parent
d3e3725dda
commit
e10d634856
|
@ -1620,8 +1620,13 @@ reset:
|
|||
#if !defined(_WIN32)
|
||||
if( received_sigterm )
|
||||
{
|
||||
polarssl_printf( " interrupted by SIGTERM\n" );
|
||||
ret = 0;
|
||||
polarssl_printf( " interrupted by SIGTERM (not in net_accept())\n" );
|
||||
if( ret == POLARSSL_ERR_NET_RECV_FAILED ||
|
||||
ret == POLARSSL_ERR_NET_SEND_FAILED )
|
||||
{
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
goto exit;
|
||||
}
|
||||
#endif
|
||||
|
@ -1653,8 +1658,10 @@ reset:
|
|||
#if !defined(_WIN32)
|
||||
if( received_sigterm )
|
||||
{
|
||||
polarssl_printf( " interrupted by signal\n" );
|
||||
ret = 0;
|
||||
polarssl_printf( " interrupted by SIGTERM (in net_accept())\n" );
|
||||
if( ret == POLARSSL_ERR_NET_ACCEPT_FAILED )
|
||||
ret = 0;
|
||||
|
||||
goto exit;
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue