Browse Source

Bad checksum: fix double-byteswapped checksum in SessionManager.c, also use _be suffix for checksums everywhere

Caleb James DeLisle 3 years ago
parent
commit
7d90b598d4

+ 2 - 2
interface/addressable/PacketHeaderToUDPAddrIface.c

@@ -56,8 +56,8 @@ static Iface_DEFUN incomingFromUdpIf(struct Message* message, struct Iface* udpI
     Assert_true(Sockaddr_getAddress(context->pub.udpIf.addr, &addrPtr) == 16);
     Bits_memcpy(ip.sourceAddr, addrPtr, 16);
 
-    uint16_t checksum = Checksum_udpIp6_be(ip.sourceAddr, message->bytes, message->length);
-    ((struct Headers_UDPHeader*)message->bytes)->checksum_be = checksum;
+    uint16_t checksum_be = Checksum_udpIp6_be(ip.sourceAddr, message->bytes, message->length);
+    ((struct Headers_UDPHeader*)message->bytes)->checksum_be = checksum_be;
 
     Er_assert(Message_epush(message, &ip, sizeof(struct Headers_IP6Header)));
 

+ 3 - 3
net/SessionManager.c

@@ -365,9 +365,9 @@ static Iface_DEFUN failedDecrypt(struct Message* msg,
     Er_assert(Message_epush32be(msg, Error_AUTHENTICATION));
     Er_assert(Message_epush16be(msg, Control_ERROR));
     Er_assert(Message_epush16be(msg, 0));
-    uint16_t csum = Checksum_engine_be(msg->bytes, msg->length);
-    Er_assert(Message_epop16be(msg));
-    Er_assert(Message_epush16be(msg, csum));
+    uint16_t csum_be = Checksum_engine_be(msg->bytes, msg->length);
+    Er_assert(Message_epop16h(msg));
+    Er_assert(Message_epush16h(msg, csum_be));
 
     Er_assert(Message_epush32be(msg, 0xffffffff));
 

+ 2 - 2
net/UpperDistributor.c

@@ -123,8 +123,8 @@ static void sendToHandlers(struct Message* msg,
             uint8_t srcAndDest[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
             AddressCalc_makeValidAddress(srcAndDest);
             Bits_memcpy(&srcAndDest[16], ud->myAddress->ip6.bytes, 16);
-            uint16_t checksum = Checksum_udpIp6_be(srcAndDest, cmsg->bytes, cmsg->length);
-            ((struct Headers_UDPHeader*)cmsg->bytes)->checksum_be = checksum;
+            uint16_t checksum_be = Checksum_udpIp6_be(srcAndDest, cmsg->bytes, cmsg->length);
+            ((struct Headers_UDPHeader*)cmsg->bytes)->checksum_be = checksum_be;
         }
         {
             struct DataHeader dh = { .unused = 0 };

+ 2 - 2
test/Main_fuzz_test.c

@@ -176,8 +176,8 @@ void CJDNS_FUZZ_MAIN(void* vctx, struct Message* msg)
     // fc00::1
     AddressCalc_makeValidAddress(&srcAndDest[16]);
     Bits_memcpy(&srcAndDest, from->ip, 16);
-    uint16_t checksum = Checksum_udpIp6_be(srcAndDest, msg->bytes, msg->length);
-    ((struct Headers_UDPHeader*)msg->bytes)->checksum_be = checksum;
+    uint16_t checksum_be = Checksum_udpIp6_be(srcAndDest, msg->bytes, msg->length);
+    ((struct Headers_UDPHeader*)msg->bytes)->checksum_be = checksum_be;
 
     TestFramework_craftIPHeader(msg, srcAndDest, &srcAndDest[16]);
     ((struct Headers_IP6Header*) msg->bytes)->nextHeader = 17;

+ 3 - 3
tunnel/test/IpTunnel_test.c

@@ -263,8 +263,8 @@ static void testAddr(struct Context* ctx,
     struct Headers_UDPHeader* uh = (struct Headers_UDPHeader*) msg->bytes;
     uh->length_be = Endian_hostToBigEndian16(msg->length - Headers_UDPHeader_SIZE);
 
-    uint16_t* checksum = &((struct Headers_UDPHeader*) msg->bytes)->checksum_be;
-    *checksum = 0;
+    uint16_t* checksum_be = &((struct Headers_UDPHeader*) msg->bytes)->checksum_be;
+    *checksum_be = 0;
     uint32_t length = msg->length;
 
     // Because of old reasons, we need to have at least an empty IPv6 header
@@ -274,7 +274,7 @@ static void testAddr(struct Context* ctx,
     ip->payloadLength_be = Endian_hostToBigEndian16(msg->length - Headers_IP6Header_SIZE);
     ip->nextHeader = 17;
 
-    *checksum = Checksum_udpIp6_be(ip->sourceAddr, (uint8_t*) uh, length);
+    *checksum_be = Checksum_udpIp6_be(ip->sourceAddr, (uint8_t*) uh, length);
 
     pushRouteDataHeaders(ctx, msg);