#ifdef SEGSIZE
#undef SEGSIZE
#endif
-#include <arpa/tftp.h>
#include <stdio.h>
#include <string.h>
else
ip6 = NULL;
#endif /*INET6*/
- cp = (u_char *)(up + 1);
if (!TTEST(up->uh_dport)) {
udpipaddr_print(ip, -1, -1);
(void)printf("[|udp]");
(void)printf("truncated-udp %d", length);
return;
}
- length -= sizeof(struct udphdr);
-
- if (cp > snapend) {
+ ulen = EXTRACT_16BITS(&up->uh_ulen);
+ if (ulen < sizeof(struct udphdr)) {
udpipaddr_print(ip, sport, dport);
- (void)printf("[|udp]");
+ printf("truncated-udplength %d", ulen);
return;
}
+ ulen -= sizeof(struct udphdr);
+ length -= sizeof(struct udphdr);
+ if (ulen < length)
+ length = ulen;
- ulen = EXTRACT_16BITS(&up->uh_ulen);
- if (ulen < 8) {
+ cp = (u_char *)(up + 1);
+ if (cp > snapend) {
udpipaddr_print(ip, sport, dport);
- (void)printf("truncated-udplength %d", ulen);
+ printf("[|udp]");
return;
}
+
if (packettype) {
register struct sunrpc_msg *rp;
enum sunrpc_msg_type direction;
hsrp_print((const u_char *)(up + 1), length);
else if (ISPORT(LWRES_PORT))
lwres_print((const u_char *)(up + 1), length);
- else if (ISPORT(LDP_PORT))
+ else if (ISPORT(LDP_PORT))
ldp_print((const u_char *)(up + 1), length);
- else if (ISPORT(OLSR_PORT))
- olsr_print((const u_char *)(up + 1), length);
- else if (ISPORT(MPLS_LSP_PING_PORT))
+ else if (ISPORT(OLSR_PORT))
+ olsr_print((const u_char *)(up + 1), length,
+#if INET6
+ (IP_V(ip) == 6) ? 1 : 0);
+#else
+ 0);
+#endif
+ else if (ISPORT(MPLS_LSP_PING_PORT))
lspping_print((const u_char *)(up + 1), length);
else if (dport == BFD_CONTROL_PORT ||
dport == BFD_ECHO_PORT )
sip_print((const u_char *)(up + 1), length);
else if (ISPORT(SYSLOG_PORT))
syslog_print((const u_char *)(up + 1), length);
- else
- (void)printf("UDP, length %u",
- (u_int32_t)(ulen - sizeof(*up)));
+ else {
+ if (ulen > length)
+ printf("UDP, bad length %u > %u",
+ ulen, length);
+ else
+ printf("UDP, length %u", ulen);
+ }
#undef ISPORT
- } else
- (void)printf("UDP, length %u", (u_int32_t)(ulen - sizeof(*up)));
+ } else {
+ if (ulen > length)
+ printf("UDP, bad length %u > %u",
+ ulen, length);
+ else
+ printf("UDP, length %u", ulen);
+ }
}