summaryrefslogtreecommitdiffstats
path: root/print-ip6.c
diff options
context:
space:
mode:
Diffstat (limited to 'print-ip6.c')
-rw-r--r--print-ip6.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/print-ip6.c b/print-ip6.c
index 2f1183c..dc4aa26 100644
--- a/print-ip6.c
+++ b/print-ip6.c
@@ -21,9 +21,7 @@
/* \summary: IPv6 printer */
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
#include "netdissect-stdinc.h"
@@ -241,19 +239,13 @@ ip6_print(netdissect_options *ndo, const u_char *bp, u_int length)
ndo->ndo_protocol = "ip6";
ip6 = (const struct ip6_hdr *)bp;
- ND_TCHECK_SIZE(ip6);
- if (length < sizeof (struct ip6_hdr)) {
- ND_PRINT("truncated-ip6 %u", length);
- return;
+ if (!ndo->ndo_eflag) {
+ nd_print_protocol_caps(ndo);
+ ND_PRINT(" ");
}
- if (!ndo->ndo_eflag)
- ND_PRINT("IP6 ");
-
- if (IP6_VERSION(ip6) != 6) {
- ND_PRINT("version error: %u != 6", IP6_VERSION(ip6));
- return;
- }
+ ND_ICHECK_ZU(length, <, sizeof (struct ip6_hdr));
+ ND_ICHECKMSG_U("version", IP6_VERSION(ip6), !=, 6);
payload_len = GET_BE_U_2(ip6->ip6_plen);
/*
@@ -280,9 +272,12 @@ ip6_print(netdissect_options *ndo, const u_char *bp, u_int length)
*/
if (payload_len != 0) {
len = payload_len + sizeof(struct ip6_hdr);
- if (length < len)
- ND_PRINT("truncated-ip6 - %u bytes missing!",
- len - length);
+ if (len > length) {
+ ND_PRINT("[header+payload length %u > length %u]",
+ len, length);
+ nd_print_invalid(ndo);
+ ND_PRINT(" ");
+ }
} else
len = length + sizeof(struct ip6_hdr);
@@ -303,6 +298,7 @@ ip6_print(netdissect_options *ndo, const u_char *bp, u_int length)
nh,
payload_len);
}
+ ND_TCHECK_SIZE(ip6);
/*
* Cut off the snapshot length to the end of the IP payload.
@@ -330,7 +326,7 @@ ip6_print(netdissect_options *ndo, const u_char *bp, u_int length)
nh != IPPROTO_TCP && nh != IPPROTO_UDP &&
nh != IPPROTO_DCCP && nh != IPPROTO_SCTP) {
ND_PRINT("%s > %s: ", GET_IP6ADDR_STRING(ip6->ip6_src),
- GET_IP6ADDR_STRING(ip6->ip6_dst));
+ GET_IP6ADDR_STRING(ip6->ip6_dst));
}
switch (nh) {
@@ -389,7 +385,7 @@ ip6_print(netdissect_options *ndo, const u_char *bp, u_int length)
case IPPROTO_MOBILITY_OLD:
case IPPROTO_MOBILITY:
/*
- * XXX - we don't use "advance"; RFC 3775 says that
+ * RFC 3775 says that
* the next header field in a mobility header
* should be IPPROTO_NONE, but speaks of
* the possibility of a future extension in
@@ -436,9 +432,12 @@ ip6_print(netdissect_options *ndo, const u_char *bp, u_int length)
len = payload_len + sizeof(struct ip6_hdr);
if (len < total_advance)
goto trunc;
- if (length < len)
- ND_PRINT("truncated-ip6 - %u bytes missing!",
- len - length);
+ if (len > length) {
+ ND_PRINT("[header+payload length %u > length %u]",
+ len, length);
+ nd_print_invalid(ndo);
+ ND_PRINT(" ");
+ }
nd_change_snaplen(ndo, bp, len);
/*
@@ -499,4 +498,8 @@ ip6_print(netdissect_options *ndo, const u_char *bp, u_int length)
return;
trunc:
nd_print_trunc(ndo);
+ return;
+
+invalid:
+ nd_print_invalid(ndo);
}