[LWIP] Use tcp_close when both shut_rx and shut_tx are set. Fixes CORE-16868 (#2582)

This commit is contained in:
Sylvain Deverre 2020-04-26 18:40:47 +02:00 committed by GitHub
parent c2dbc18660
commit 666bac44c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -647,11 +647,24 @@ LibTCPShutdownCallback(void *arg)
* PCB without telling us if we shutdown TX and RX. To avoid these problems, we'll clear the
* socket context if we have called shutdown for TX and RX.
*/
if (msg->Input.Shutdown.shut_rx) {
msg->Output.Shutdown.Error = tcp_shutdown(pcb, TRUE, FALSE);
if (msg->Input.Shutdown.shut_rx != msg->Input.Shutdown.shut_tx) {
if (msg->Input.Shutdown.shut_rx) {
msg->Output.Shutdown.Error = tcp_shutdown(pcb, TRUE, FALSE);
}
if (msg->Input.Shutdown.shut_tx) {
msg->Output.Shutdown.Error = tcp_shutdown(pcb, FALSE, TRUE);
}
}
if (msg->Input.Shutdown.shut_tx) {
msg->Output.Shutdown.Error = tcp_shutdown(pcb, FALSE, TRUE);
else if (msg->Input.Shutdown.shut_rx) {
/* We received both RX and TX requests, which seems to mean closing connection from TDI.
* So call tcp_close, otherwise we risk to be put in TCP_WAIT_* states, which makes further
* attempts to close the socket to fail in this state.
*/
msg->Output.Shutdown.Error = tcp_close(pcb);
}
else {
/* This case shouldn't happen */
DbgPrint("Requested socket shutdown(0, 0) !\n");
}
if (!msg->Output.Shutdown.Error)