Browse Source

Kernel/Net: Don't update TCP socket "last sent ACK" field too early

Defer updating this field until after the last fallible operation has
succeeded.
Andreas Kling 3 years ago
parent
commit
c797eaa9f8
1 changed files with 6 additions and 6 deletions
  1. 6 6
      Kernel/Net/TCPSocket.cpp

+ 6 - 6
Kernel/Net/TCPSocket.cpp

@@ -237,12 +237,6 @@ ErrorOr<void> TCPSocket::send_tcp_packet(u16 flags, const UserOrKernelBuffer* pa
     tcp_packet.set_data_offset(tcp_header_size / sizeof(u32));
     tcp_packet.set_data_offset(tcp_header_size / sizeof(u32));
     tcp_packet.set_flags(flags);
     tcp_packet.set_flags(flags);
 
 
-    if (flags & TCPFlags::ACK) {
-        m_last_ack_number_sent = m_ack_number;
-        m_last_ack_sent_time = kgettimeofday();
-        tcp_packet.set_ack_number(m_ack_number);
-    }
-
     if (payload) {
     if (payload) {
         if (auto result = payload->read(tcp_packet.payload(), payload_size); result.is_error()) {
         if (auto result = payload->read(tcp_packet.payload(), payload_size); result.is_error()) {
             routing_decision.adapter->release_packet_buffer(*packet);
             routing_decision.adapter->release_packet_buffer(*packet);
@@ -250,6 +244,12 @@ ErrorOr<void> TCPSocket::send_tcp_packet(u16 flags, const UserOrKernelBuffer* pa
         }
         }
     }
     }
 
 
+    if (flags & TCPFlags::ACK) {
+        m_last_ack_number_sent = m_ack_number;
+        m_last_ack_sent_time = kgettimeofday();
+        tcp_packet.set_ack_number(m_ack_number);
+    }
+
     if (flags & TCPFlags::SYN) {
     if (flags & TCPFlags::SYN) {
         ++m_sequence_number;
         ++m_sequence_number;
     } else {
     } else {