]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ip.c
Squelch a Coverity warning.
[tcpdump] / print-ip.c
index 03b0a87d19780c11a830f31c5f2fca8975a7cc7e..d64aef7532055ea27c9b911b3f5ab8f8eb586ea9 100644 (file)
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#define NETDISSECT_REWORKED
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
 
 #include <string.h>
 
+#include "netdissect.h"
 #include "addrtoname.h"
-#include "interface.h"
-#include "extract.h"                   /* must come after interface.h */
+#include "extract.h"
 
 #include "ip.h"
 #include "ipproto.h"
@@ -71,7 +70,7 @@ ip_printroute(netdissect_options *ndo,
                ND_PRINT((ndo, " [bad ptr %u]", cp[2]));
 
        for (len = 3; len < length; len += 4) {
-               ND_PRINT((ndo, " %s", ipaddr_string(&cp[len])));
+               ND_PRINT((ndo, " %s", ipaddr_string(ndo, &cp[len])));
                if (ptr > len)
                        ND_PRINT((ndo, ","));
        }
@@ -84,14 +83,14 @@ ip_printroute(netdissect_options *ndo,
  * This is used for UDP and TCP pseudo-header in the checksum
  * calculation.
  */
-static u_int32_t
+static uint32_t
 ip_finddst(netdissect_options *ndo,
            const struct ip *ip)
 {
        int length;
        int len;
        const u_char *cp;
-       u_int32_t retval;
+       uint32_t retval;
 
        cp = (const u_char *)(ip + 1);
        length = (IP_HL(ip) << 2) - sizeof(struct ip);
@@ -123,7 +122,7 @@ ip_finddst(netdissect_options *ndo,
                }
        }
 trunc:
-       UNALIGNED_MEMCPY(&retval, &ip->ip_dst.s_addr, sizeof(u_int32_t));
+       UNALIGNED_MEMCPY(&retval, &ip->ip_dst, sizeof(uint32_t));
        return retval;
 }
 
@@ -132,29 +131,29 @@ trunc:
  */
 int
 nextproto4_cksum(netdissect_options *ndo,
-                 const struct ip *ip, const u_int8_t *data,
+                 const struct ip *ip, const uint8_t *data,
                  u_int len, u_int covlen, u_int next_proto)
 {
        struct phdr {
-               u_int32_t src;
-               u_int32_t dst;
+               uint32_t src;
+               uint32_t dst;
                u_char mbz;
                u_char proto;
-               u_int16_t len;
+               uint16_t len;
        } ph;
        struct cksum_vec vec[2];
 
        /* pseudo-header.. */
-       ph.len = htons((u_int16_t)len);
+       ph.len = htons((uint16_t)len);
        ph.mbz = 0;
        ph.proto = next_proto;
-       UNALIGNED_MEMCPY(&ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
+       UNALIGNED_MEMCPY(&ph.src, &ip->ip_src, sizeof(uint32_t));
        if (IP_HL(ip) == 5)
-               UNALIGNED_MEMCPY(&ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
+               UNALIGNED_MEMCPY(&ph.dst, &ip->ip_dst, sizeof(uint32_t));
        else
                ph.dst = ip_finddst(ndo, ip);
 
-       vec[0].ptr = (const u_int8_t *)(void *)&ph;
+       vec[0].ptr = (const uint8_t *)(void *)&ph;
        vec[0].len = sizeof(ph);
        vec[1].ptr = data;
        vec[1].len = covlen;
@@ -211,7 +210,7 @@ ip_printts(netdissect_options *ndo,
                if (ptr == len)
                        type = " ^ ";
                ND_PRINT((ndo, "%s%d@%s", type, EXTRACT_32BITS(&cp[len+hoplen-4]),
-                      hoplen!=8 ? "" : ipaddr_string(&cp[len])));
+                      hoplen!=8 ? "" : ipaddr_string(ndo, &cp[len])));
                type = " ";
        }
 
@@ -324,7 +323,6 @@ ip_print_demux(netdissect_options *ndo,
               struct ip_print_demux_state *ipds)
 {
        struct protoent *proto;
-       struct cksum_vec vec[1];
 
 again:
        switch (ipds->nh) {
@@ -436,12 +434,10 @@ again:
                }
                break;
 
-#ifdef INET6
        case IPPROTO_IPV6:
                /* ip6-in-ip encapsulation */
                ip6_print(ndo, ipds->cp, ipds->len);
                break;
-#endif /*INET6*/
 
        case IPPROTO_RSVP:
                rsvp_print(ndo, ipds->cp, ipds->len);
@@ -457,23 +453,21 @@ again:
                break;
 
        case IPPROTO_PIM:
-               vec[0].ptr = ipds->cp;
-               vec[0].len = ipds->len;
-               pim_print(ndo, ipds->cp, ipds->len, in_cksum(vec, 1));
+               pim_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip);
                break;
 
        case IPPROTO_VRRP:
                if (ndo->ndo_packettype == PT_CARP) {
                        if (ndo->ndo_vflag)
                                ND_PRINT((ndo, "carp %s > %s: ",
-                                            ipaddr_string(&ipds->ip->ip_src),
-                                            ipaddr_string(&ipds->ip->ip_dst)));
+                                            ipaddr_string(ndo, &ipds->ip->ip_src),
+                                            ipaddr_string(ndo, &ipds->ip->ip_dst)));
                        carp_print(ndo, ipds->cp, ipds->len, ipds->ip->ip_ttl);
                } else {
                        if (ndo->ndo_vflag)
                                ND_PRINT((ndo, "vrrp %s > %s: ",
-                                            ipaddr_string(&ipds->ip->ip_src),
-                                            ipaddr_string(&ipds->ip->ip_dst)));
+                                            ipaddr_string(ndo, &ipds->ip->ip_src),
+                                            ipaddr_string(ndo, &ipds->ip->ip_dst)));
                        vrrp_print(ndo, ipds->cp, ipds->len,
                                (const u_char *)ipds->ip, ipds->ip->ip_ttl);
                }
@@ -525,22 +519,21 @@ ip_print(netdissect_options *ndo,
        const u_char *ipend;
        u_int hlen;
        struct cksum_vec vec[1];
-       u_int16_t sum, ip_sum;
+       uint16_t sum, ip_sum;
        struct protoent *proto;
 
        ipds->ip = (const struct ip *)bp;
+       ND_TCHECK(ipds->ip->ip_vhl);
        if (IP_V(ipds->ip) != 4) { /* print version if != 4 */
-           ND_PRINT((ndo, "IP%u ", IP_V(ipds->ip)));
            if (IP_V(ipds->ip) == 6)
-             ND_PRINT((ndo, ", wrong link-layer encapsulation"));
+             ND_PRINT((ndo, "IP6, wrong link-layer encapsulation "));
+           else
+             ND_PRINT((ndo, "IP%u ", IP_V(ipds->ip)));
        }
        else if (!ndo->ndo_eflag)
                ND_PRINT((ndo, "IP "));
 
-       if ((u_char *)(ipds->ip + 1) > ndo->ndo_snapend) {
-               ND_PRINT((ndo, "%s", tstr));
-               return;
-       }
+       ND_TCHECK(*ipds->ip);
        if (length < sizeof (struct ip)) {
                ND_PRINT((ndo, "truncated-ip %u", length));
                return;
@@ -618,12 +611,12 @@ ip_print(netdissect_options *ndo,
 
             if ((hlen - sizeof(struct ip)) > 0) {
                 ND_PRINT((ndo, ", options ("));
-                ip_optprint(ndo, (u_char *)(ipds->ip + 1), hlen - sizeof(struct ip));
+                ip_optprint(ndo, (const u_char *)(ipds->ip + 1), hlen - sizeof(struct ip));
                 ND_PRINT((ndo, ")"));
             }
 
-           if (!ndo->ndo_Kflag && (u_char *)ipds->ip + hlen <= ndo->ndo_snapend) {
-               vec[0].ptr = (const u_int8_t *)(void *)ipds->ip;
+           if (!ndo->ndo_Kflag && (const u_char *)ipds->ip + hlen <= ndo->ndo_snapend) {
+               vec[0].ptr = (const uint8_t *)(const void *)ipds->ip;
                vec[0].len = hlen;
                sum = in_cksum(vec, 1);
                if (sum != 0) {
@@ -647,8 +640,8 @@ ip_print(netdissect_options *ndo,
                if (ipds->nh != IPPROTO_TCP && ipds->nh != IPPROTO_UDP &&
                    ipds->nh != IPPROTO_SCTP && ipds->nh != IPPROTO_DCCP) {
                        ND_PRINT((ndo, "%s > %s: ",
-                                    ipaddr_string(&ipds->ip->ip_src),
-                                    ipaddr_string(&ipds->ip->ip_dst)));
+                                    ipaddr_string(ndo, &ipds->ip->ip_src),
+                                    ipaddr_string(ndo, &ipds->ip->ip_dst)));
                }
                ip_print_demux(ndo, ipds);
        } else {
@@ -661,14 +654,19 @@ ip_print(netdissect_options *ndo,
             * and the protocol.
             */
                if (ipds->off & 0x1fff) {
-                       ND_PRINT((ndo, "%s > %s:", ipaddr_string(&ipds->ip->ip_src),
-                                 ipaddr_string(&ipds->ip->ip_dst)));
+                       ND_PRINT((ndo, "%s > %s:", ipaddr_string(ndo, &ipds->ip->ip_src),
+                                 ipaddr_string(ndo, &ipds->ip->ip_dst)));
                        if (!ndo->ndo_nflag && (proto = getprotobynumber(ipds->ip->ip_p)) != NULL)
                                ND_PRINT((ndo, " %s", proto->p_name));
                        else
                                ND_PRINT((ndo, " ip-proto-%d", ipds->ip->ip_p));
                }
        }
+       return;
+
+trunc:
+       ND_PRINT((ndo, "%s", tstr));
+       return;
 }
 
 void
@@ -685,11 +683,9 @@ ipN_print(netdissect_options *ndo, register const u_char *bp, register u_int len
        case 4:
                ip_print (ndo, bp, length);
                return;
-#ifdef INET6
        case 6:
                ip6_print (ndo, bp, length);
                return;
-#endif
        default:
                ND_PRINT((ndo, "unknown ip %d", IP_V(&hdr)));
                return;