]> git.proxmox.com Git - mirror_frr.git/commitdiff
babeld: fix #10487 by adding a check on packet length
authorwhichbug <whichbug@github.com>
Thu, 3 Feb 2022 17:01:31 +0000 (12:01 -0500)
committerwhichbug <whichbug@github.com>
Fri, 4 Feb 2022 21:07:37 +0000 (16:07 -0500)
The body length of a packet should satisfy the condition:
packetlen >= bodylen + 4. Otherwise, heap overflows may happen.

Signed-off-by: whichbug <whichbug@github.com>
babeld/message.c

index 5c2e29d8b3673a96d7668e7100eff5224876fa3b..3a29b6a60fe9409e5be919d4dee59d59cb5b1d6a 100644 (file)
@@ -288,13 +288,18 @@ channels_len(unsigned char *channels)
 static int
 babel_packet_examin(const unsigned char *packet, int packetlen)
 {
-    unsigned i = 0, bodylen;
+    int i = 0, bodylen;
     const unsigned char *message;
     unsigned char type, len;
 
     if(packetlen < 4 || packet[0] != 42 || packet[1] != 2)
         return 1;
     DO_NTOHS(bodylen, packet + 2);
+    if(bodylen + 4 > packetlen) {
+        debugf(BABEL_DEBUG_COMMON, "Received truncated packet (%d + 4 > %d).",
+                 bodylen, packetlen);
+        return 1;
+    }
     while (i < bodylen){
         message = packet + 4 + i;
         type = message[0];
@@ -366,12 +371,6 @@ parse_packet(const unsigned char *from, struct interface *ifp,
 
     DO_NTOHS(bodylen, packet + 2);
 
-    if(bodylen + 4 > packetlen) {
-        flog_err(EC_BABEL_PACKET, "Received truncated packet (%d + 4 > %d).",
-                 bodylen, packetlen);
-        bodylen = packetlen - 4;
-    }
-
     i = 0;
     while(i < bodylen) {
         message = packet + 4 + i;