IPv4: Protect the list of unacked TCP packets with a lock

Otherwise things get racy and crashy.
This commit is contained in:
Andreas Kling 2019-11-23 21:44:32 +01:00
parent dc9d44d7b1
commit 61f611bf3c
Notes: sideshowbarker 2024-07-19 11:06:11 +09:00
2 changed files with 4 additions and 0 deletions

View file

@ -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();

View file

@ -172,5 +172,6 @@ private:
timeval tx_time;
};
Lock m_not_acked_lock { "TCPSocket unacked packets" };
SinglyLinkedList<OutgoingPacket> m_not_acked;
};