From 61f611bf3cbdaa726a86c14524912ebff591d868 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 23 Nov 2019 21:44:32 +0100 Subject: [PATCH] IPv4: Protect the list of unacked TCP packets with a lock Otherwise things get racy and crashy. --- Kernel/Net/TCPSocket.cpp | 3 +++ Kernel/Net/TCPSocket.h | 1 + 2 files changed, 4 insertions(+) diff --git a/Kernel/Net/TCPSocket.cpp b/Kernel/Net/TCPSocket.cpp index 8389cec31c7..98cdcb68e9c 100644 --- a/Kernel/Net/TCPSocket.cpp +++ b/Kernel/Net/TCPSocket.cpp @@ -162,6 +162,7 @@ void TCPSocket::send_tcp_packet(u16 flags, const void* payload, int payload_size tcp_packet.set_checksum(compute_tcp_checksum(local_address(), peer_address(), tcp_packet, payload_size)); if (tcp_packet.has_syn() || payload_size > 0) { + LOCKER(m_not_acked_lock); m_not_acked.append({ m_sequence_number, move(buffer), 0, {} }); send_outgoing_packets(); return; @@ -185,6 +186,7 @@ void TCPSocket::send_outgoing_packets() auto now = kgettimeofday(); + LOCKER(m_not_acked_lock); for (auto& packet : m_not_acked) { timeval diff; timeval_sub(packet.tx_time, now, diff); @@ -228,6 +230,7 @@ void TCPSocket::receive_tcp_packet(const TCPPacket& packet, u16 size) #endif int removed = 0; + LOCKER(m_not_acked_lock); while (!m_not_acked.is_empty()) { auto& packet = m_not_acked.first(); diff --git a/Kernel/Net/TCPSocket.h b/Kernel/Net/TCPSocket.h index bfbe5eda206..a01cf3a1ac8 100644 --- a/Kernel/Net/TCPSocket.h +++ b/Kernel/Net/TCPSocket.h @@ -172,5 +172,6 @@ private: timeval tx_time; }; + Lock m_not_acked_lock { "TCPSocket unacked packets" }; SinglyLinkedList m_not_acked; };