]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-lisp.c
erspan: add checks for data we don't print.
[tcpdump] / print-lisp.c
index 379bffbbbdf4cf0e9e9bfe699fa824e6cb561713..b995f2dfb8722cb8bf798b31be46b600a688bd6c 100644 (file)
  *  +-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  */
 
-#ifdef HAVE_CONFIG_H
 #include <config.h>
-#endif
 
 #include "netdissect-stdinc.h"
 #include "netdissect.h"
-#include <stdlib.h>
 
 #include "ip.h"
 #include "ip6.h"
@@ -130,12 +127,12 @@ enum {
 };
 
 static const struct tok lisp_type [] = {
-       { 0, "LISP-Reserved"                    },
-       { 1, "LISP-Map-Request"                 },
-       { 2, "LISP-Map-Reply"                   },
-       { 3, "LISP-Map-Register"                },
-       { 4, "LISP-Map-Notify"                  },
-       { 8, "LISP-Encapsulated-Contol-Message" },
+       { 0, "LISP-Reserved"                     },
+       { 1, "LISP-Map-Request"                  },
+       { 2, "LISP-Map-Reply"                    },
+       { 3, "LISP-Map-Register"                 },
+       { 4, "LISP-Map-Notify"                   },
+       { 8, "LISP-Encapsulated-Control-Message" },
        { 0, NULL }
 };
 
@@ -243,7 +240,6 @@ lisp_print(netdissect_options *ndo, const u_char *bp, u_int length)
        uint16_t auth_data_len;
        uint32_t ttl;
        const u_char *packet_iterator;
-       const u_char *loc_ip_pointer;
        const lisp_map_register_hdr *lisp_hdr;
        const lisp_map_register_eid *lisp_eid;
        const lisp_map_register_loc *lisp_loc;
@@ -284,8 +280,8 @@ lisp_print(netdissect_options *ndo, const u_char *bp, u_int length)
                goto invalid;
 
        /* Print all the EID records */
-       while ((length > packet_offset) && (record_count--)) {
-
+       while ((length > packet_offset) && (record_count != 0)) {
+               record_count--;
                ND_TCHECK_LEN(packet_iterator + packet_offset,
                              MAP_REGISTER_EID_LEN);
                ND_PRINT("\n");
@@ -322,16 +318,15 @@ lisp_print(netdissect_options *ndo, const u_char *bp, u_int length)
                         * No support for LCAF right now.
                         */
                        return;
-                       break;
                }
 
                ND_PRINT(" %u locator(s)", loc_count);
 
-               while (loc_count--) {
+               while (loc_count != 0) {
+                       loc_count--;
                        ND_TCHECK_LEN(packet_iterator + packet_offset,
                                      MAP_REGISTER_LOC_LEN);
                        lisp_loc = (const lisp_map_register_loc *) (packet_iterator + packet_offset);
-                       loc_ip_pointer = (const u_char *) (lisp_loc + 1);
                        packet_offset += MAP_REGISTER_LOC_LEN;
                        loc_afi = GET_BE_U_2(lisp_loc->locator_afi);
 
@@ -340,13 +335,15 @@ lisp_print(netdissect_options *ndo, const u_char *bp, u_int length)
 
                        switch (loc_afi) {
                        case IPv4_AFI:
-                               ND_TCHECK_4(packet_iterator + packet_offset);
-                               ND_PRINT(" LOC %s", GET_IPADDR_STRING(loc_ip_pointer));
+                               ND_PRINT(" LOC %s",
+                                        GET_IPADDR_STRING(packet_iterator +
+                                        packet_offset));
                                packet_offset += 4;
                                break;
                        case IPv6_AFI:
-                               ND_TCHECK_16(packet_iterator + packet_offset);
-                               ND_PRINT(" LOC %s", GET_IP6ADDR_STRING(loc_ip_pointer));
+                               ND_PRINT(" LOC %s",
+                                        GET_IP6ADDR_STRING(packet_iterator +
+                                        packet_offset));
                                packet_offset += 16;
                                break;
                        default: