#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.153 2005-11-13 11:51:32 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.155 2006-02-19 05:00:19 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
printf(" [bad ptr %u]", cp[2]);
for (len = 3; len < length; len += 4) {
- printf("%s", ipaddr_string(&cp[len]));
+ printf(" %s", ipaddr_string(&cp[len]));
if (ptr > len)
- printf (", ");
+ printf(",");
}
}
const char *type;
if (length < 4) {
- printf("[bad length %d]", length);
+ printf("[bad length %u]", length);
return;
}
printf(" TS{");
hoplen = ((cp[3]&0xF) != IPOPT_TS_TSONLY) ? 8 : 4;
if ((length - 4) & (hoplen-1))
- printf("[bad length %d]", length);
+ printf("[bad length %u]", length);
ptr = cp[2] - 1;
len = 0;
if (ptr < 4 || ((ptr - 4) & (hoplen-1)) || ptr > length + 1)
- printf("[bad ptr %d]", cp[2]);
+ printf("[bad ptr %u]", cp[2]);
switch (cp[3]&0xF) {
case IPOPT_TS_TSONLY:
printf("TSONLY");
ip_optprint(register const u_char *cp, u_int length)
{
register u_int option_len;
+ const char *sep = "";
for (; length > 0; cp += option_len, length -= option_len) {
u_int option_code;
+ printf("%s", sep);
+ sep = ",";
+
TCHECK(*cp);
option_code = *cp;
+ printf("%s",
+ tok2str(ip_option_values,"unknown %u",option_code));
+
if (option_code == IPOPT_NOP ||
option_code == IPOPT_EOL)
option_len = 1;
else {
TCHECK(cp[1]);
- option_len = cp[1];
+ option_len = cp[1];
+ if (option_len < 2) {
+ printf(" [bad length %u]", option_len);
+ return;
+ }
}
- printf("%s (%u) len %u",
- tok2str(ip_option_values,"unknown",option_code),
- option_code,
- option_len);
-
- if (option_len < 2)
- return;
+ if (option_len > length) {
+ printf(" [bad length %u]", option_len);
+ return;
+ }
TCHECK2(*cp, option_len);
case IPOPT_RR: /* fall through */
case IPOPT_SSRR:
case IPOPT_LSRR:
- ip_printroute( cp, option_len);
+ ip_printroute(cp, option_len);
break;
case IPOPT_RA:
+ if (option_len < 4) {
+ printf(" [bad length %u]", option_len);
+ break;
+ }
TCHECK(cp[3]);
if (EXTRACT_16BITS(&cp[2]) != 0)
- printf("value %u", EXTRACT_16BITS(&cp[2]));
+ printf(" value %u", EXTRACT_16BITS(&cp[2]));
break;
case IPOPT_NOP: /* nothing to print - fall through */
return shouldbe;
}
-#ifndef IP_MF
-#define IP_MF 0x2000
-#endif /* IP_MF */
-#ifndef IP_DF
-#define IP_DF 0x4000
-#endif /* IP_DF */
#define IP_RES 0x8000
static struct tok ip_frag_values[] = {
(void)printf(", length: %u", EXTRACT_16BITS(&ipds->ip->ip_len));
if ((hlen - sizeof(struct ip)) > 0) {
- printf(", options ( ");
+ printf(", options (");
ip_optprint((u_char *)(ipds->ip + 1), hlen - sizeof(struct ip));
- printf(" )");
+ printf(")");
}
if ((u_char *)ipds->ip + hlen <= snapend) {