FS-11362 Attempt to rearrange verto socket shutdown sequence
This commit is contained in:
parent
fdea350817
commit
655c8a1a7b
|
@ -698,23 +698,6 @@ void ws_destroy(wsh_t *wsh)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wsh->ssl) {
|
if (wsh->ssl) {
|
||||||
int code, ssl_err, sanity = 100;
|
|
||||||
do {
|
|
||||||
code = SSL_shutdown(wsh->ssl);
|
|
||||||
if (code == 1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (code < 0) {
|
|
||||||
ssl_err = SSL_get_error(wsh->ssl, code);
|
|
||||||
}
|
|
||||||
if (wsh->block) {
|
|
||||||
ms_sleep(10);
|
|
||||||
} else {
|
|
||||||
ms_sleep(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
} while ((code == 0 || (code < 0 && SSL_WANT_READ_WRITE(ssl_err))) && --sanity > 0);
|
|
||||||
|
|
||||||
SSL_free(wsh->ssl);
|
SSL_free(wsh->ssl);
|
||||||
wsh->ssl = NULL;
|
wsh->ssl = NULL;
|
||||||
}
|
}
|
||||||
|
@ -749,12 +732,30 @@ ssize_t ws_close(wsh_t *wsh, int16_t reason)
|
||||||
ws_raw_write(wsh, fr, 4);
|
ws_raw_write(wsh, fr, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wsh->ssl && wsh->sock != ws_sock_invalid) {
|
||||||
|
/* first invocation of SSL_shutdown() would normally return 0 and just try to send SSL protocol close request.
|
||||||
|
we just slightly polite, since we want to close socket fast and
|
||||||
|
not bother waiting for SSL protocol close response before closing socket,
|
||||||
|
since we want cleanup to be done fast for scenarios like:
|
||||||
|
client change NAT (like jump from one WiFi to another) and now unreachable from old ip:port, however
|
||||||
|
immidiately reconnect with new ip:port but old session id (and thus should replace the old session/channel)
|
||||||
|
*/
|
||||||
|
SSL_shutdown(wsh->ssl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* restore to blocking here, so any further read/writes will block */
|
||||||
restore_socket(wsh->sock);
|
restore_socket(wsh->sock);
|
||||||
|
|
||||||
if (wsh->close_sock && wsh->sock != ws_sock_invalid) {
|
if (wsh->close_sock && wsh->sock != ws_sock_invalid) {
|
||||||
|
/* signal socket to shutdown() before close(): FIN-ACK-FIN-ACK insead of RST-RST
|
||||||
|
do not really handle errors here since it all going to die anyway.
|
||||||
|
all buffered writes if any(like SSL_shutdown() ones) will still be sent.
|
||||||
|
*/
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
|
shutdown(wsh->sock, SHUT_RDWR);
|
||||||
close(wsh->sock);
|
close(wsh->sock);
|
||||||
#else
|
#else
|
||||||
|
shutdown(wsh->sock, SD_BOTH);
|
||||||
closesocket(wsh->sock);
|
closesocket(wsh->sock);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue