mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 10:58:12 +00:00
Kernel: Handle listening socket disappearing during incoming handshake
This commit is contained in:
parent
feb6d1afe0
commit
3f1c3a341b
1 changed files with 25 additions and 4 deletions
|
@ -453,11 +453,32 @@ void handle_tcp(const IPv4Packet& ipv4_packet)
|
||||||
switch (tcp_packet.flags()) {
|
switch (tcp_packet.flags()) {
|
||||||
case TCPFlags::ACK:
|
case TCPFlags::ACK:
|
||||||
socket->set_ack_number(tcp_packet.sequence_number() + payload_size);
|
socket->set_ack_number(tcp_packet.sequence_number() + payload_size);
|
||||||
socket->set_state(TCPSocket::State::Established);
|
|
||||||
socket->set_setup_state(Socket::SetupState::Completed);
|
switch (socket->direction()) {
|
||||||
if (socket->direction() == TCPSocket::Direction::Outgoing)
|
case TCPSocket::Direction::Incoming:
|
||||||
|
if (!socket->has_originator()) {
|
||||||
|
kprintf("handle_tcp: connection doesn't have an originating socket; maybe it went away?\n");
|
||||||
|
socket->send_tcp_packet(TCPFlags::RST);
|
||||||
|
socket->set_state(TCPSocket::State::Closed);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
socket->set_state(TCPSocket::State::Established);
|
||||||
|
socket->set_setup_state(Socket::SetupState::Completed);
|
||||||
|
socket->release_to_originator();
|
||||||
|
return;
|
||||||
|
case TCPSocket::Direction::Outgoing:
|
||||||
|
socket->set_state(TCPSocket::State::Established);
|
||||||
|
socket->set_setup_state(Socket::SetupState::Completed);
|
||||||
socket->set_connected(true);
|
socket->set_connected(true);
|
||||||
socket->release_to_originator();
|
return;
|
||||||
|
default:
|
||||||
|
kprintf("handle_tcp: got ACK in SynReceived state but direction is invalid (%s)\n", TCPSocket::to_string(socket->direction()));
|
||||||
|
socket->send_tcp_packet(TCPFlags::RST);
|
||||||
|
socket->set_state(TCPSocket::State::Closed);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
kprintf("handle_tcp: unexpected flags in SynReceived state\n");
|
kprintf("handle_tcp: unexpected flags in SynReceived state\n");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue