瀏覽代碼

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 年之前
父節點
當前提交
c797eaa9f8
共有 1 個文件被更改,包括 6 次插入6 次删除
  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_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 (auto result = payload->read(tcp_packet.payload(), payload_size); result.is_error()) {
             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) {
         ++m_sequence_number;
     } else {