summaryrefslogtreecommitdiff
path: root/print-dtp.c
diff options
context:
space:
mode:
authorDenis Ovsienko <denis@ovsienko.info>2015-09-05 21:17:30 +0100
committerDenis Ovsienko <denis@ovsienko.info>2015-09-19 20:32:27 +0100
commit1f1771153757b79382d035b61d4c2c52ef4c9fb2 (patch)
tree5823888fbfe26659165a61c65d1aef2523ba3aee /print-dtp.c
parentde7c6192e47b605a48b6fc37adf8de31a1b331a3 (diff)
downloadtcpdump-1f1771153757b79382d035b61d4c2c52ef4c9fb2.tar.gz
DTP: improve packet integrity checks
Adjust the TLV infinite loop check to require the right amount of bytes for T and L; do it after printing the TLV header so it is easier to understand what was wrong. Check if the TLV V is within the capture. Use the new "invalid" exit label to indicate a packet anomaly and add more checks for the length value into the type-specific case blocks. Print the domain string with fn_printzp().
Diffstat (limited to 'print-dtp.c')
-rw-r--r--print-dtp.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/print-dtp.c b/print-dtp.c
index 3381ad80..4170cc7a 100644
--- a/print-dtp.c
+++ b/print-dtp.c
@@ -27,6 +27,9 @@
#include "addrtoname.h"
#include "extract.h"
+static const char tstr[] = " [|dtp]";
+static const char istr[] = " (invalid)";
+
#define DTP_HEADER_LEN 1
#define DTP_DOMAIN_TLV 0x0001
#define DTP_STATUS_TLV 0x0002
@@ -70,30 +73,36 @@ dtp_print (netdissect_options *ndo, const u_char *pptr, u_int length)
while (tptr < (pptr+length)) {
ND_TCHECK2(*tptr, 4);
-
type = EXTRACT_16BITS(tptr);
len = EXTRACT_16BITS(tptr+2);
-
- /* infinite loop check */
- if (type == 0 || len == 0) {
+ /* XXX: should not be but sometimes it is, see the test captures */
+ if (type == 0)
return;
- }
-
ND_PRINT((ndo, "\n\t%s (0x%04x) TLV, length %u",
tok2str(dtp_tlv_values, "Unknown", type),
type, len));
+ /* infinite loop check */
+ if (len < 4)
+ goto invalid;
+ ND_TCHECK2(*tptr, len);
+
switch (type) {
case DTP_DOMAIN_TLV:
- ND_PRINT((ndo, ", %s", tptr+4));
+ ND_PRINT((ndo, ", "));
+ fn_printzp(ndo, tptr+4, len-4, pptr+length);
break;
case DTP_STATUS_TLV:
case DTP_DTP_TYPE_TLV:
+ if (len < 5)
+ goto invalid;
ND_PRINT((ndo, ", 0x%x", *(tptr+4)));
break;
case DTP_NEIGHBOR_TLV:
+ if (len < 10)
+ goto invalid;
ND_PRINT((ndo, ", %s", etheraddr_string(ndo, tptr+4)));
break;
@@ -105,8 +114,11 @@ dtp_print (netdissect_options *ndo, const u_char *pptr, u_int length)
return;
+ invalid:
+ ND_PRINT((ndo, "%s", istr));
+ return;
trunc:
- ND_PRINT((ndo, "[|dtp]"));
+ ND_PRINT((ndo, "%s", tstr));
}
/*