瀏覽代碼

Kernel: Release packet buffer in TCPSocket::send_tcp_packet

Previously we wouldn't release the buffer back to the network adapter
in all cases. While this didn't leak the buffer it would cause the
buffer to not be reused for other packets.
Gunnar Beutner 4 年之前
父節點
當前提交
3fc75088a2
共有 1 個文件被更改,包括 5 次插入1 次删除
  1. 5 1
      Kernel/Net/TCPSocket.cpp

+ 5 - 1
Kernel/Net/TCPSocket.cpp

@@ -220,8 +220,10 @@ KResult TCPSocket::send_tcp_packet(u16 flags, const UserOrKernelBuffer* payload,
         tcp_packet.set_ack_number(m_ack_number);
         tcp_packet.set_ack_number(m_ack_number);
     }
     }
 
 
-    if (payload && !payload->read(tcp_packet.payload(), payload_size))
+    if (payload && !payload->read(tcp_packet.payload(), payload_size)) {
+        routing_decision.adapter->release_packet_buffer(*packet);
         return EFAULT;
         return EFAULT;
+    }
 
 
     if (flags & TCPFlags::SYN) {
     if (flags & TCPFlags::SYN) {
         ++m_sequence_number;
         ++m_sequence_number;
@@ -247,6 +249,8 @@ KResult TCPSocket::send_tcp_packet(u16 flags, const UserOrKernelBuffer* payload,
         m_not_acked.append({ m_sequence_number, move(packet), ipv4_payload_offset, *routing_decision.adapter });
         m_not_acked.append({ m_sequence_number, move(packet), ipv4_payload_offset, *routing_decision.adapter });
         m_not_acked_size += payload_size;
         m_not_acked_size += payload_size;
         enqueue_for_retransmit();
         enqueue_for_retransmit();
+    } else {
+        routing_decision.adapter->release_packet_buffer(*packet);
     }
     }
 
 
     return KSuccess;
     return KSuccess;