]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-icmp.c
ESP: Add a const qualifier
[tcpdump] / print-icmp.c
index 6642c99078b309f71f818d0a851f4cd2f58bb049..124fc05d418862d299ecadefe587900a9d8237d8 100644 (file)
@@ -282,7 +282,7 @@ static const struct tok icmp_interface_identification_role_values[] = {
     { 1, "the sub-IP component of an IP interface upon which a datagram arrived"},
     { 2, "the IP interface through which the datagram would have been forwarded had it been forwardable"},
     { 3, "the IP next hop to which the datagram would have been forwarded"},
-       { 0, NULL }
+    { 0, NULL }
 };
 
 /*
@@ -806,62 +806,76 @@ icmp_print(netdissect_options *ndo, const u_char *bp, u_int plen, const u_char *
                     break;
 
                 case INTERFACE_INFORMATION_OBJECT_CLASS:
-                                       /*
-
-                                       Ctype in a INTERFACE_INFORMATION_OBJECT_CLASS object:
-                                       
-                                       Bit     0       1       2       3       4       5       6       7
-                                       +-------+-------+-------+-------+-------+-------+-------+-------+
-                                       | Interface Role| Rsvd1 | Rsvd2 |ifIndex| IPAddr|  name |  MTU  |
-                                       +-------+-------+-------+-------+-------+-------+-------+-------+
-
-                                       */
-                                       interface_role = (obj_ctype & 0xc0) >> 6;
-                                       if_index_flag  = (obj_ctype & 0x8) >> 3;
-                                       ipaddr_flag    = (obj_ctype & 0x4) >> 2;
-                                       name_flag      = (obj_ctype & 0x2) >> 1;
-                                       mtu_flag       = (obj_ctype & 0x1);
-
-                                       ND_PRINT("\n\t\t This object describes %s",
-                       tok2str(icmp_interface_identification_role_values,"an unknown interface role",interface_role));
-
-                                       offset = obj_tptr;
-
-                                       if (if_index_flag) {
-                                               ND_PRINT("\n\t\t Interface Index: %u", GET_BE_U_4(offset));
-                                               offset += 4;
-                                       }
-
-                                       if (ipaddr_flag) {
-                                               ND_PRINT("\n\t\t IP Address sub-object: ");
-                                               ipaddr_subobj = (const struct icmp_interface_identification_ipaddr_subobject_t *) offset;
-                                               switch (GET_BE_U_2(ipaddr_subobj->afi)) {
-                                                       case 1:
-                                                               ND_PRINT("%s", GET_IPADDR_STRING(ipaddr_subobj->ip_addr));
-                                                               offset += 4;
-                                                               break;
-                                                       case 2:
-                                                               ND_PRINT("%s", GET_IP6ADDR_STRING(ipaddr_subobj->ip_addr));
-                                                               offset += 16;
-                                                               break;
-                                                       default:
-                                                               ND_PRINT("Unknown Address Family Identifier");
-                                                               return;
-                                               }
-                                               offset += 4;
-                                       }
-
-                                       if (name_flag) {
-                                               ifname_subobj = (const struct icmp_interface_identification_ifname_subobject_t *) offset;
-                                               ND_PRINT("\n\t\t Interface Name: %.*s", GET_U_1(ifname_subobj->length), ifname_subobj->if_name);
-                                               offset += 1 + GET_U_1(ifname_subobj->length);
-                                       }
-                                       if (mtu_flag) {
-                                               ND_PRINT("\n\t\t MTU: %u", GET_BE_U_4(offset));
-                                               offset += 4;
-                                       }
-
-                                       break;
+                    /*
+                    Ctype in a INTERFACE_INFORMATION_OBJECT_CLASS object:
+
+                    Bit     0       1       2       3       4       5       6       7
+                    +-------+-------+-------+-------+-------+-------+-------+-------+
+                    | Interface Role| Rsvd1 | Rsvd2 |ifIndex| IPAddr|  name |  MTU  |
+                    +-------+-------+-------+-------+-------+-------+-------+-------+
+                    */
+                    interface_role = (obj_ctype & 0xc0) >> 6;
+                    if_index_flag  = (obj_ctype & 0x8) >> 3;
+                    ipaddr_flag    = (obj_ctype & 0x4) >> 2;
+                    name_flag      = (obj_ctype & 0x2) >> 1;
+                    mtu_flag       = (obj_ctype & 0x1);
+
+                    ND_PRINT("\n\t\t This object describes %s",
+                             tok2str(icmp_interface_identification_role_values,
+                             "an unknown interface role",interface_role));
+
+                    offset = obj_tptr;
+
+                    if (if_index_flag) {
+                        ND_PRINT("\n\t\t Interface Index: %u", GET_BE_U_4(offset));
+                        offset += 4;
+                    }
+                    if (ipaddr_flag) {
+                        ND_PRINT("\n\t\t IP Address sub-object: ");
+                        ipaddr_subobj = (const struct icmp_interface_identification_ipaddr_subobject_t *) offset;
+                        switch (GET_BE_U_2(ipaddr_subobj->afi)) {
+                            case 1:
+                                ND_PRINT("%s", GET_IPADDR_STRING(ipaddr_subobj->ip_addr));
+                                offset += 4;
+                                break;
+                            case 2:
+                                ND_PRINT("%s", GET_IP6ADDR_STRING(ipaddr_subobj->ip_addr));
+                                offset += 16;
+                                break;
+                            default:
+                                ND_PRINT("Unknown Address Family Identifier");
+                                return;
+                        }
+                        offset += 4;
+                    }
+                    if (name_flag) {
+                        uint8_t inft_name_length_field;
+
+                        ifname_subobj = (const struct icmp_interface_identification_ifname_subobject_t *) offset;
+                        inft_name_length_field = GET_U_1(ifname_subobj->length);
+                        ND_PRINT("\n\t\t Interface Name");
+                        if (inft_name_length_field % 4 != 0) {
+                            ND_PRINT(" [length %u != N x 4]", inft_name_length_field);
+                            nd_print_invalid(ndo);
+                            offset += inft_name_length_field;
+                            break;
+                        }
+                        if (inft_name_length_field > 64) {
+                            ND_PRINT(" [length %u > 64]", inft_name_length_field);
+                            nd_print_invalid(ndo);
+                            offset += inft_name_length_field;
+                            break;
+                        }
+                        ND_PRINT(", length %u: ", inft_name_length_field);
+                        nd_printjnp(ndo, ifname_subobj->if_name,
+                                    inft_name_length_field - 1);
+                        offset += inft_name_length_field;
+                    }
+                    if (mtu_flag) {
+                        ND_PRINT("\n\t\t MTU: %u", GET_BE_U_4(offset));
+                        offset += 4;
+                    }
+                    break;
 
                 default:
                     print_unknown_data(ndo, obj_tptr, "\n\t    ", obj_tlen);