Explorar el Código

TCP: Correct checksum for packets with odd number of bytes.

Andreas Kling hace 6 años
padre
commit
5dfdcf796d
Se han modificado 1 ficheros con 2 adiciones y 1 borrados
  1. 2 1
      Kernel/TCPSocket.cpp

+ 2 - 1
Kernel/TCPSocket.cpp

@@ -50,6 +50,7 @@ int TCPSocket::protocol_receive(const ByteBuffer& packet_buffer, void* buffer, s
     auto& ipv4_packet = *(const IPv4Packet*)(packet_buffer.pointer());
     auto& ipv4_packet = *(const IPv4Packet*)(packet_buffer.pointer());
     auto& tcp_packet = *static_cast<const TCPPacket*>(ipv4_packet.payload());
     auto& tcp_packet = *static_cast<const TCPPacket*>(ipv4_packet.payload());
     size_t payload_size = packet_buffer.size() - sizeof(IPv4Packet) - tcp_packet.header_size();
     size_t payload_size = packet_buffer.size() - sizeof(IPv4Packet) - tcp_packet.header_size();
+    kprintf("payload_size %u, will it fit in %u?\n", payload_size, buffer_size);
     ASSERT(buffer_size >= payload_size);
     ASSERT(buffer_size >= payload_size);
     if (addr) {
     if (addr) {
         auto& ia = *(sockaddr_in*)addr;
         auto& ia = *(sockaddr_in*)addr;
@@ -141,7 +142,7 @@ NetworkOrdered<word> TCPSocket::compute_tcp_checksum(const IPv4Address& source,
             checksum = (checksum >> 16) + (checksum & 0xffff);
             checksum = (checksum >> 16) + (checksum & 0xffff);
     }
     }
     if (payload_size & 1) {
     if (payload_size & 1) {
-        word expanded_byte = ((const byte*)packet.payload())[payload_size - 1];
+        word expanded_byte = ((const byte*)packet.payload())[payload_size - 1] << 8;
         checksum += expanded_byte;
         checksum += expanded_byte;
         if (checksum > 0xffff)
         if (checksum > 0xffff)
             checksum = (checksum >> 16) + (checksum & 0xffff);
             checksum = (checksum >> 16) + (checksum & 0xffff);