Merge some cherry-picked fixes originating in OpenBSD
Check whether the version field is available before looking at it. While we're at it, use ND_TCHECK(), rather than a hand-rolled check, to check whether we have the full fixed-length portion of the IPv4 header. commit c67afe913011138a2504ec4d3d423b48e73b12f3 Do more length checking. From OpenBSD. commit d7516761f9c4877bcb05bb6543be3543e165249
This commit is contained in:
parent
08263d1957
commit
927a3633f0
11
print-ip.c
11
print-ip.c
@ -529,6 +529,7 @@ ip_print(netdissect_options *ndo,
|
||||
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)
|
||||
@ -537,10 +538,7 @@ ip_print(netdissect_options *ndo,
|
||||
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;
|
||||
@ -669,6 +667,11 @@ ip_print(netdissect_options *ndo,
|
||||
ND_PRINT((ndo, " ip-proto-%d", ipds->ip->ip_p));
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
trunc:
|
||||
ND_PRINT((ndo, "%s", tstr));
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -62,7 +62,7 @@ sl_if_print(netdissect_options *ndo,
|
||||
register u_int length = h->len;
|
||||
register const struct ip *ip;
|
||||
|
||||
if (caplen < SLIP_HDRLEN) {
|
||||
if (caplen < SLIP_HDRLEN || length < SLIP_HDRLEN) {
|
||||
ND_PRINT((ndo, "%s", tstr));
|
||||
return (caplen);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user