EGP: Modernize packet parsing style.

Enable ND_LONGJMP_FROM_TCHECK. Report invalid packets as invalid.
This commit is contained in:
Denis Ovsienko 2021-01-11 14:47:59 +00:00
parent b05797e0df
commit e6cf3b7fdb
2 changed files with 17 additions and 12 deletions

View File

@ -2,7 +2,7 @@ Monthday, Month DD, YYYY by gharris and denis
Summary for 5.0.0 tcpdump release (so far!)
Source code:
Use %zu when printing a sizeof to squelch compiler warnings
BOOTP, EIGRP, Geneve, L2TP, OLSR, PGM, RSVP: Modernize packet parsing style
BOOTP, EGP, EIGRP, Geneve, L2TP, OLSR, PGM, RSVP: Modernize packet parsing style
EGP: Replace custom code with tok2str()
EIGRP: Get the packet header fields right.

View File

@ -28,6 +28,7 @@
#include "netdissect-stdinc.h"
#define ND_LONGJMP_FROM_TCHECK
#include "netdissect.h"
#include "addrtoname.h"
#include "extract.h"
@ -179,7 +180,7 @@ egpnr_print(netdissect_options *ndo,
/* Pickup host part of gateway address */
addr = 0;
if (length < 4 - netlen)
goto trunc;
goto invalid;
ND_TCHECK_LEN(cp, 4 - netlen);
switch (netlen) {
@ -199,7 +200,7 @@ egpnr_print(netdissect_options *ndo,
addr |= net;
length -= 4 - netlen;
if (length < 1)
goto trunc;
goto invalid;
distances = GET_U_1(cp);
cp++;
length--;
@ -211,7 +212,7 @@ egpnr_print(netdissect_options *ndo,
ND_PRINT("(");
while (distances != 0) {
if (length < 2)
goto trunc;
goto invalid;
ND_PRINT("%sd%u:", comma, GET_U_1(cp));
cp++;
comma = ", ";
@ -221,19 +222,19 @@ egpnr_print(netdissect_options *ndo,
while (networks != 0) {
/* Pickup network number */
if (length < 1)
goto trunc;
goto invalid;
addr = ((uint32_t) GET_U_1(cp)) << 24;
cp++;
length--;
if (IN_CLASSB(addr)) {
if (length < 1)
goto trunc;
goto invalid;
addr |= ((uint32_t) GET_U_1(cp)) << 16;
cp++;
length--;
} else if (!IN_CLASSA(addr)) {
if (length < 2)
goto trunc;
goto invalid;
addr |= ((uint32_t) GET_U_1(cp)) << 16;
cp++;
addr |= ((uint32_t) GET_U_1(cp)) << 8;
@ -248,8 +249,8 @@ egpnr_print(netdissect_options *ndo,
ND_PRINT(")");
}
return;
trunc:
nd_print_trunc(ndo);
invalid:
nd_print_invalid(ndo);
}
void
@ -264,10 +265,11 @@ egp_print(netdissect_options *ndo,
ndo->ndo_protocol = "egp";
egp = (const struct egp_packet *)bp;
if (length < sizeof(*egp) || !ND_TTEST_SIZE(egp)) {
nd_print_trunc(ndo);
return;
if (length < sizeof(*egp)) {
ND_PRINT(" packet length %u < %zu", length, sizeof(*egp));
goto invalid;
}
ND_TCHECK_SIZE(egp);
version = GET_U_1(egp->egp_version);
if (!ndo->ndo_vflag) {
@ -369,4 +371,7 @@ egp_print(netdissect_options *ndo,
ND_PRINT(" %s", tok2str(egp_reasons_str, "[reason %u]", GET_BE_U_2(egp->egp_reason)));
break;
}
return;
invalid:
nd_print_invalid(ndo);
}