]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-loopback.c
More bounds checking when fetching addresses and converting to strings.
[tcpdump] / print-loopback.c
index e0c6efbdfc295a100aa75d0d836b4f0a256b0cf7..07fbcbdd14b45f1120a0b47485dded4160511777 100644 (file)
@@ -29,7 +29,7 @@
 
 /*
  * originally defined as the Ethernet Configuration Testing Protocol.
- * specification: http://www.mit.edu/people/jhawk/ctp.pdf
+ * specification: https://www.mit.edu/people/jhawk/ctp.pdf
  */
 
 #ifdef HAVE_CONFIG_H
@@ -42,7 +42,6 @@
 #include "extract.h"
 #include "addrtoname.h"
 
-static const char tstr[] = " [|loopback]";
 
 #define LOOPBACK_REPLY   1
 #define LOOPBACK_FWDDATA 2
@@ -56,14 +55,14 @@ static const struct tok fcode_str[] = {
 static void
 loopback_message_print(netdissect_options *ndo, const u_char *cp, const u_int len)
 {
-       const u_char *ep = cp + len;
+       const u_char *ep = ndo->ndo_snapend;
        uint16_t function;
 
        if (len < 2)
                goto invalid;
        /* function */
        ND_TCHECK_2(cp);
-       function = EXTRACT_LE_U_2(cp);
+       function = GET_LE_U_2(cp);
        cp += 2;
        ND_PRINT(", %s", tok2str(fcode_str, " invalid (%u)", function));
 
@@ -73,7 +72,7 @@ loopback_message_print(netdissect_options *ndo, const u_char *cp, const u_int le
                                goto invalid;
                        /* receipt number */
                        ND_TCHECK_2(cp);
-                       ND_PRINT(", receipt number %u", EXTRACT_LE_U_2(cp));
+                       ND_PRINT(", receipt number %u", GET_LE_U_2(cp));
                        cp += 2;
                        /* data */
                        ND_PRINT(", data (%u octets)", len - 4);
@@ -84,7 +83,7 @@ loopback_message_print(netdissect_options *ndo, const u_char *cp, const u_int le
                                goto invalid;
                        /* forwarding address */
                        ND_TCHECK_LEN(cp, MAC_ADDR_LEN);
-                       ND_PRINT(", forwarding address %s", etheraddr_string(ndo, cp));
+                       ND_PRINT(", forwarding address %s", GET_ETHERADDR_STRING(cp));
                        cp += MAC_ADDR_LEN;
                        /* data */
                        ND_PRINT(", data (%u octets)", len - 8);
@@ -97,25 +96,26 @@ loopback_message_print(netdissect_options *ndo, const u_char *cp, const u_int le
        return;
 
 invalid:
-       ND_PRINT("%s", istr);
+       nd_print_invalid(ndo);
        ND_TCHECK_LEN(cp, ep - cp);
        return;
 trunc:
-       ND_PRINT("%s", tstr);
+       nd_print_trunc(ndo);
 }
 
 void
 loopback_print(netdissect_options *ndo, const u_char *cp, const u_int len)
 {
-       const u_char *ep = cp + len;
+       const u_char *ep = ndo->ndo_snapend;
        uint16_t skipCount;
 
+       ndo->ndo_protocol = "loopback";
        ND_PRINT("Loopback");
        if (len < 2)
                goto invalid;
        /* skipCount */
        ND_TCHECK_2(cp);
-       skipCount = EXTRACT_LE_U_2(cp);
+       skipCount = GET_LE_U_2(cp);
        cp += 2;
        ND_PRINT(", skipCount %u", skipCount);
        if (skipCount % 8)
@@ -126,10 +126,10 @@ loopback_print(netdissect_options *ndo, const u_char *cp, const u_int len)
        return;
 
 invalid:
-       ND_PRINT("%s", istr);
+       nd_print_invalid(ndo);
        ND_TCHECK_LEN(cp, ep - cp);
        return;
 trunc:
-       ND_PRINT("%s", tstr);
+       nd_print_trunc(ndo);
 }