]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-bootp.c
DHCP: Fix printing IP address pairs options
[tcpdump] / print-bootp.c
index a541d74e8164c987ed924467cdeeff7f4d43a6e6..10048b4e53a3c5ffc82853ecf4af17c8673c1335 100644 (file)
@@ -703,6 +703,14 @@ rfc1048_print(netdissect_options *ndo,
 
                case 'p':
                        /* IP address pairs */
+                       /* this option should be N x 8 bytes long */
+                       if (len < 8 || len % 8 != 0) {
+                               ND_PRINT("%s[length != N x 8 bytes]",
+                                        len == 0 ? " " : "");
+                               bp += len;
+                               len = 0;
+                               break;
+                       }
                        while (len >= 2*4) {
                                if (!first)
                                        ND_PRINT(",");
@@ -733,7 +741,8 @@ rfc1048_print(netdissect_options *ndo,
                    {
                        /* this option should be 1 byte long */
                        if (len != 1) {
-                               ND_PRINT("[ERROR: length != 1 byte]");
+                               ND_PRINT("[length != 1 byte]");
+                               nd_print_invalid(ndo);
                                bp += len;
                                len = 0;
                                break;
@@ -783,7 +792,8 @@ rfc1048_print(netdissect_options *ndo,
                        case TAG_NETBIOS_NODE:
                                /* this option should be at least 1 byte long */
                                if (len < 1) {
-                                       ND_PRINT("[ERROR: length < 1 byte]");
+                                       ND_PRINT("[length < 1 byte]");
+                                       nd_print_invalid(ndo);
                                        break;
                                }
                                tag = GET_U_1(bp);
@@ -795,7 +805,8 @@ rfc1048_print(netdissect_options *ndo,
                        case TAG_OPT_OVERLOAD:
                                /* this option should be at least 1 byte long */
                                if (len < 1) {
-                                       ND_PRINT("[ERROR: length < 1 byte]");
+                                       ND_PRINT("[length < 1 byte]");
+                                       nd_print_invalid(ndo);
                                        break;
                                }
                                tag = GET_U_1(bp);
@@ -807,14 +818,16 @@ rfc1048_print(netdissect_options *ndo,
                        case TAG_CLIENT_FQDN:
                                /* this option should be at least 3 bytes long */
                                if (len < 3) {
-                                       ND_PRINT("[ERROR: length < 3 bytes]");
+                                       ND_PRINT("[length < 3 bytes]");
+                                       nd_print_invalid(ndo);
                                        bp += len;
                                        len = 0;
                                        break;
                                }
                                if (GET_U_1(bp) & 0xf0) {
-                                       ND_PRINT("[ERROR: MBZ nibble 0x%x != 0] ",
+                                       ND_PRINT("[MBZ nibble 0x%x != 0] ",
                                                 (GET_U_1(bp) & 0xf0) >> 4);
+                                       nd_print_invalid(ndo);
                                }
                                if (GET_U_1(bp) & 0x0f)
                                        ND_PRINT("[%s] ",
@@ -840,7 +853,8 @@ rfc1048_print(netdissect_options *ndo,
 
                                /* this option should be at least 1 byte long */
                                if (len < 1) {
-                                       ND_PRINT("[ERROR: length < 1 byte]");
+                                       ND_PRINT("[length < 1 byte]");
+                                       nd_print_invalid(ndo);
                                        break;
                                }
                                type = GET_U_1(bp);
@@ -914,7 +928,8 @@ rfc1048_print(netdissect_options *ndo,
 
                                /* this option should be at least 5 bytes long */
                                if (len < 5) {
-                                       ND_PRINT("[ERROR: length < 5 bytes]");
+                                       ND_PRINT("[length < 5 bytes]");
+                                       nd_print_invalid(ndo);
                                        bp += len;
                                        len = 0;
                                        break;
@@ -927,7 +942,8 @@ rfc1048_print(netdissect_options *ndo,
                                        len--;
                                        /* mask_width <= 32 */
                                        if (mask_width > 32) {
-                                               ND_PRINT("[ERROR: Mask width (%u) > 32]", mask_width);
+                                               ND_PRINT("[Mask width (%u) > 32]", mask_width);
+                                               nd_print_invalid(ndo);
                                                bp += len;
                                                len = 0;
                                                break;
@@ -935,7 +951,8 @@ rfc1048_print(netdissect_options *ndo,
                                        significant_octets = (mask_width + 7) / 8;
                                        /* significant octets + router(4) */
                                        if (len < significant_octets + 4) {
-                                               ND_PRINT("[ERROR: Remaining length (%u) < %u bytes]", len, significant_octets + 4);
+                                               ND_PRINT("[Remaining length (%u) < %u bytes]", len, significant_octets + 4);
+                                               nd_print_invalid(ndo);
                                                bp += len;
                                                len = 0;
                                                break;
@@ -969,7 +986,8 @@ rfc1048_print(netdissect_options *ndo,
 
                                first = 1;
                                if (len < 2) {
-                                       ND_PRINT("[ERROR: length < 2 bytes]");
+                                       ND_PRINT("[length < 2 bytes]");
+                                       nd_print_invalid(ndo);
                                        bp += len;
                                        len = 0;
                                        break;
@@ -981,13 +999,16 @@ rfc1048_print(netdissect_options *ndo,
                                        ND_PRINT("\n\t      ");
                                        ND_PRINT("instance#%u: ", suboptnumber);
                                        if (suboptlen == 0) {
-                                               ND_PRINT("[ERROR: suboption length must be non-zero]");
+                                               ND_PRINT("[suboption length == 0]");
+                                               nd_print_invalid(ndo);
                                                bp += len;
                                                len = 0;
                                                break;
                                        }
                                        if (len < suboptlen) {
-                                               ND_PRINT("[ERROR: invalid option]");
+                                               ND_PRINT("[length %u < suboption length %u",
+                                                        len, suboptlen);
+                                               nd_print_invalid(ndo);
                                                bp += len;
                                                len = 0;
                                                break;
@@ -1037,7 +1058,8 @@ rfc1048_print(netdissect_options *ndo,
                                        bp += suboptlen2;
                                }
                                if (len != 0) {
-                                       ND_PRINT("[ERROR: length < 2 bytes]");
+                                       ND_PRINT("[length < 2 bytes]");
+                                       nd_print_invalid(ndo);
                                }
                                break;