OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Michael Schloh
Root: /e/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-src Date: 06-Apr-2004 17:39:44
Branch: OPENPKG_2_0_SOLID Handle: 2004040616394400
Modified files: (Branch: OPENPKG_2_0_SOLID)
openpkg-src/tcpdump tcpdump.patch tcpdump.spec
Log:
OpenPKG-SA-2004.010-tcpdump (CAN-2004-0183 und CAN-2004-0184): Add patch
code from a hand crafted 'diff tcpdump-3.8.1 tcpdump-3.8.2' to avoid denial
of service from reading ISAKMP packets with malformed delete payloads and
identification payloads
Summary:
Revision Changes Path
1.4.2.1 +692 -19 openpkg-src/tcpdump/tcpdump.patch
1.37.2.2 +1 -1 openpkg-src/tcpdump/tcpdump.spec
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: openpkg-src/tcpdump/tcpdump.patch
============================================================================
$ cvs diff -u -r1.4 -r1.4.2.1 tcpdump.patch
--- openpkg-src/tcpdump/tcpdump.patch 16 Jan 2004 12:37:39 -0000 1.4
+++ openpkg-src/tcpdump/tcpdump.patch 6 Apr 2004 15:39:44 -0000 1.4.2.1
@@ -1,17 +1,19 @@
- tcpdump patch patrix; [EMAIL PROTECTED]
+ tcpdump patch matrix; [EMAIL PROTECTED]
- tcpdump 371 371 372 381
- OpenPKG 120 121 130 20020822
- --- --- --- ---
- CAN-2002-0380 nfs y n n n see past OpenPKG-SA-2003.014-tcpdump
- CAN-2002-1350 bgp y n n n see past OpenPKG-SA-2003.014-tcpdump
- CAN-2003-0108 isakmp y n n n see past OpenPKG-SA-2003.014-tcpdump
- depth y y y n (*)
- CAN-2003-0989 isakmp y y y n updates CAN-2003-0108-isakmp
- CAN-2003-1029 l2tp y y n n
- CAN-2004-0055 radius y y y y
- CAN-2004-0057 isakmp y y y y
+ tcpdump 371 371 372 381 381
+ OpenPKG 120 121 130 200 20040207
+ --- --- --- --- --------
+ CAN-2002-0380 nfs y n n n n see past
OpenPKG-SA-2003.014-tcpdump
+ CAN-2002-1350 bgp y n n n n see past
OpenPKG-SA-2003.014-tcpdump
+ CAN-2003-0108 isakmp y n n n n see past
OpenPKG-SA-2003.014-tcpdump
+ depth y y y n n (*)
+ CAN-2003-0989 isakmp y y y n n updates CAN-2003-0108-isakmp
+ CAN-2003-1029 l2tp y y n n n see past
OpenPKG-SA-2004.002-tcpdump
+ CAN-2004-0055 radius y y y y y see past
OpenPKG-SA-2004.002-tcpdump
+ CAN-2004-0057 isakmp y y y y y see past
OpenPKG-SA-2004.002-tcpdump
+ CAN-2004-0183 isakmp y y y y y
+ CAN-2004-0184 isakmp y y y y y
(*) the vendor code fix for CAN-2003-0108 had two other unrelated code
changes piggybacked. We removed the cosmetics (constify) and
@@ -56,7 +58,70 @@
diff -u -d -u -d -r1.41 -r1.42
--- print-isakmp.c.CAN-2004-0057 20 Dec 2003 10:03:19 -0000 1.41
+++ print-isakmp.c 7 Jan 2004 08:00:51 -0000 1.42
-@@ -327,9 +327,13 @@
+@@ -60,31 +60,31 @@
+ #endif
+
+ static const u_char *isakmp_sa_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_p_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_t_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_ke_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_id_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_cert_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_cr_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_sig_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_hash_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_nonce_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_n_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_d_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_vid_print(const struct isakmp_gen *,
+- const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
++ u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_sub0_print(u_char, const struct isakmp_gen *,
+ const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
+ static const u_char *isakmp_sub_print(u_char, const struct isakmp_gen *,
+@@ -112,8 +112,8 @@
+ };
+
+ /* isakmp->np */
+-static const u_char *(*npfunc[])(const struct isakmp_gen *, const u_char *,
+- u_int32_t, u_int32_t, u_int32_t, int) = {
++static const u_char *(*npfunc[])(const struct isakmp_gen *, u_int,
++ const u_char *, u_int32_t, u_int32_t, u_int32_t, int) = {
+ NULL,
+ isakmp_sa_print,
+ isakmp_p_print,
+@@ -321,15 +321,20 @@
+ return 0;
+ }
+
+-static void
++static int
+ rawprint(caddr_t loc, size_t len)
+ {
static u_char *p;
size_t i;
@@ -65,27 +130,635 @@
p = (u_char *)loc;
for (i = 0; i < len; i++)
printf("%02x", p[i] & 0xff);
++ return 1;
+trunc:
-+ return;
++ return 0;
}
struct attrmap {
-@@ -1111,6 +1115,8 @@
+@@ -410,8 +415,10 @@
+ }
+
+ static const u_char *
+-isakmp_sa_print(const struct isakmp_gen *ext, const u_char *ep, u_int32_t phase,
+- u_int32_t doi0 _U_, u_int32_t proto0, int depth)
++isakmp_sa_print(const struct isakmp_gen *ext,
++ u_int item_len _U_,
++ const u_char *ep, u_int32_t phase, u_int32_t doi0 _U_,
++ u_int32_t proto0, int depth)
+ {
+ const struct isakmp_pl_sa *p;
+ struct isakmp_pl_sa sa;
+@@ -423,6 +430,7 @@
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_SA));
+
+ p = (struct isakmp_pl_sa *)ext;
++ TCHECK(*p);
+ safememcpy(&sa, ext, sizeof(sa));
+ doi = ntohl(sa.doi);
+ sit = ntohl(sa.sit);
+@@ -449,22 +457,28 @@
+
+ np = (u_char *)ext + sizeof(sa);
+ if (sit != 0x01) {
++ TCHECK2(*(ext + 1), sizeof(ident));
+ safememcpy(&ident, ext + 1, sizeof(ident));
+ printf(" ident=%u", (u_int32_t)ntohl(ident));
+ np += sizeof(ident);
+ }
+
+ ext = (struct isakmp_gen *)np;
++ TCHECK(*ext);
+
+ cp = isakmp_sub_print(ISAKMP_NPTYPE_P, ext, ep, phase, doi, proto0,
+ depth);
+
+ return cp;
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_SA));
++ return NULL;
+ }
+
+ static const u_char *
+-isakmp_p_print(const struct isakmp_gen *ext, const u_char *ep, u_int32_t phase,
+- u_int32_t doi0, u_int32_t proto0 _U_, int depth)
++isakmp_p_print(const struct isakmp_gen *ext, u_int item_len _U_,
++ const u_char *ep, u_int32_t phase, u_int32_t doi0,
++ u_int32_t proto0 _U_, int depth)
+ {
+ const struct isakmp_pl_p *p;
+ struct isakmp_pl_p prop;
+@@ -473,20 +487,26 @@
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_P));
+
+ p = (struct isakmp_pl_p *)ext;
++ TCHECK(*p);
+ safememcpy(&prop, ext, sizeof(prop));
+ printf(" #%d protoid=%s transform=%d",
+ prop.p_no, PROTOIDSTR(prop.prot_id), prop.num_t);
+ if (prop.spi_size) {
+ printf(" spi=");
+- rawprint((caddr_t)(p + 1), prop.spi_size);
++ if (!rawprint((caddr_t)(p + 1), prop.spi_size))
++ goto trunc;
+ }
+
+ ext = (struct isakmp_gen *)((u_char *)(p + 1) + prop.spi_size);
++ TCHECK(*ext);
+
+ cp = isakmp_sub_print(ISAKMP_NPTYPE_T, ext, ep, phase, doi0,
+ prop.prot_id, depth);
+
+ return cp;
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_P));
++ return NULL;
+ }
+
+ static const char *isakmp_p_map[] = {
+@@ -546,9 +566,9 @@
+ };
+
+ static const u_char *
+-isakmp_t_print(const struct isakmp_gen *ext, const u_char *ep,
+- u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto,
+- int depth _U_)
++isakmp_t_print(const struct isakmp_gen *ext, u_int item_len,
++ const u_char *ep, u_int32_t phase _U_, u_int32_t doi _U_,
++ u_int32_t proto, int depth _U_)
+ {
+ const struct isakmp_pl_t *p;
+ struct isakmp_pl_t t;
+@@ -561,6 +581,7 @@
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_T));
+
+ p = (struct isakmp_pl_t *)ext;
++ TCHECK(*p);
+ safememcpy(&t, ext, sizeof(t));
+
+ switch (proto) {
+@@ -596,7 +617,7 @@
+ else
+ printf(" #%d id=%d ", t.t_no, t.t_id);
+ cp = (u_char *)(p + 1);
+- ep2 = (u_char *)p + ntohs(t.h.len);
++ ep2 = (u_char *)p + item_len;
+ while (cp < ep && cp < ep2) {
+ if (map && nmap) {
+ cp = isakmp_attrmap_print(cp, (ep < ep2) ? ep : ep2,
+@@ -607,30 +628,38 @@
+ if (ep < ep2)
+ printf("...");
+ return cp;
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_T));
++ return NULL;
+ }
+
+ static const u_char *
+-isakmp_ke_print(const struct isakmp_gen *ext, const u_char *ep _U_,
+- u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto _U_,
+- int depth _U_)
++isakmp_ke_print(const struct isakmp_gen *ext, u_int item_len _U_,
++ const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_,
++ u_int32_t proto _U_, int depth _U_)
+ {
+ struct isakmp_gen e;
+
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_KE));
+
++ TCHECK(*ext);
+ safememcpy(&e, ext, sizeof(e));
+ printf(" key len=%d", ntohs(e.len) - 4);
+ if (2 < vflag && 4 < ntohs(e.len)) {
+ printf(" ");
+- rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
++ if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
++ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_KE));
++ return NULL;
+ }
+
+ static const u_char *
+-isakmp_id_print(const struct isakmp_gen *ext, const u_char *ep _U_,
+- u_int32_t phase, u_int32_t doi _U_, u_int32_t proto _U_,
+- int depth _U_)
++isakmp_id_print(const struct isakmp_gen *ext, u_int item_len _U_,
++ const u_char *ep _U_, u_int32_t phase, u_int32_t doi _U_,
++ u_int32_t proto _U_, int depth _U_)
+ {
+ #define USE_IPSECDOI_IN_PHASE1 1
+ const struct isakmp_pl_id *p;
+@@ -649,12 +678,15 @@
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_ID));
+
+ p = (struct isakmp_pl_id *)ext;
++ TCHECK(*p);
+ safememcpy(&id, ext, sizeof(id));
+- if (sizeof(*p) < id.h.len)
++ if (sizeof(*p) < item_len) {
+ data = (u_char *)(p + 1);
+- else
++ len = item_len - sizeof(*p);
++ } else {
+ data = NULL;
+- len = ntohs(id.h.len) - sizeof(*p);
++ len = 0;
++ }
+
+ #if 0 /*debug*/
+ printf(" [phase=%d doi=%d proto=%d]", phase, doi, proto);
+@@ -679,6 +711,7 @@
+ struct protoent *pe;
+
+ p = (struct ipsecdoi_id *)ext;
++ TCHECK(*p);
+ safememcpy(&id, ext, sizeof(id));
+ printf(" idtype=%s", STR_OR_ID(id.type, ipsecidtypestr));
+ if (id.proto_id) {
+@@ -698,9 +731,15 @@
+ printf(" port=%d", ntohs(id.port));
+ if (!len)
+ break;
++ if (data == NULL)
++ goto trunc;
++ TCHECK2(*data, len);
+ switch (id.type) {
+ case IPSECDOI_ID_IPV4_ADDR:
+- printf(" len=%d %s", len, ipaddr_string(data));
++ if (len < 4)
++ printf(" len=%d [bad: < 4]", len);
++ else
++ printf(" len=%d %s", len, ipaddr_string(data));
+ len = 0;
+ break;
+ case IPSECDOI_ID_FQDN:
+@@ -716,39 +755,60 @@
+ case IPSECDOI_ID_IPV4_ADDR_SUBNET:
+ {
+ const u_char *mask;
+- mask = data + sizeof(struct in_addr);
+- printf(" len=%d %s/%u.%u.%u.%u", len,
+- ipaddr_string(data),
+- mask[0], mask[1], mask[2], mask[3]);
++ if (len < 8)
++ printf(" len=%d [bad: < 8]", len);
++ else {
++ mask = data + sizeof(struct in_addr);
++ printf(" len=%d %s/%u.%u.%u.%u", len,
++ ipaddr_string(data),
++ mask[0], mask[1], mask[2], mask[3]);
++ }
+ len = 0;
+ break;
+ }
+ #ifdef INET6
+ case IPSECDOI_ID_IPV6_ADDR:
+- printf(" len=%d %s", len, ip6addr_string(data));
++ if (len < 16)
++ printf(" len=%d [bad: < 16]", len);
++ else
++ printf(" len=%d %s", len, ip6addr_string(data));
+ len = 0;
+ break;
+ case IPSECDOI_ID_IPV6_ADDR_SUBNET:
+ {
+ const u_int32_t *mask;
+- mask = (u_int32_t *)(data + sizeof(struct in6_addr));
+- /*XXX*/
+- printf(" len=%d %s/0x%08x%08x%08x%08x", len,
+- ip6addr_string(data),
+- mask[0], mask[1], mask[2], mask[3]);
++ if (len < 20)
++ printf(" len=%d [bad: < 20]", len);
++ else {
++ mask = (u_int32_t *)(data + sizeof(struct in6_addr));
++ /*XXX*/
++ printf(" len=%d %s/0x%08x%08x%08x%08x", len,
++ ip6addr_string(data),
++ mask[0], mask[1], mask[2], mask[3]);
++ }
+ len = 0;
+ break;
+ }
+ #endif /*INET6*/
+ case IPSECDOI_ID_IPV4_ADDR_RANGE:
+- printf(" len=%d %s-%s", len, ipaddr_string(data),
+- ipaddr_string(data + sizeof(struct in_addr)));
++ if (len < 8)
++ printf(" len=%d [bad: < 8]", len);
++ else {
++ printf(" len=%d %s-%s", len,
++ ipaddr_string(data),
++ ipaddr_string(data + sizeof(struct in_addr)));
++ }
+ len = 0;
+ break;
+ #ifdef INET6
+ case IPSECDOI_ID_IPV6_ADDR_RANGE:
+- printf(" len=%d %s-%s", len, ip6addr_string(data),
+- ip6addr_string(data + sizeof(struct in6_addr)));
++ if (len < 32)
++ printf(" len=%d [bad: < 32]", len);
++ else {
++ printf(" len=%d %s-%s", len,
++ ip6addr_string(data),
++ ip6addr_string(data + sizeof(struct
in6_addr)));
++ }
+ len = 0;
+ break;
+ #endif /*INET6*/
+@@ -764,16 +824,21 @@
+ printf(" len=%d", len);
+ if (2 < vflag) {
+ printf(" ");
+- rawprint((caddr_t)data, len);
++ if (!rawprint((caddr_t)data, len))
++ goto trunc;
+ }
+ }
+- return (u_char *)ext + ntohs(id.h.len);
++ return (u_char *)ext + item_len;
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_ID));
++ return NULL;
+ }
+
+ static const u_char *
+-isakmp_cert_print(const struct isakmp_gen *ext, const u_char *ep _U_,
+- u_int32_t phase _U_, u_int32_t doi0 _U_, u_int32_t proto0 _U_,
+- int depth _U_)
++isakmp_cert_print(const struct isakmp_gen *ext, u_int item_len _U_,
++ const u_char *ep _U_, u_int32_t phase _U_,
++ u_int32_t doi0 _U_,
++ u_int32_t proto0 _U_, int depth _U_)
+ {
+ const struct isakmp_pl_cert *p;
+ struct isakmp_pl_cert cert;
+@@ -786,20 +851,25 @@
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_CERT));
+
+ p = (struct isakmp_pl_cert *)ext;
++ TCHECK(*p);
+ safememcpy(&cert, ext, sizeof(cert));
+- printf(" len=%d", ntohs(cert.h.len) - 4);
++ printf(" len=%d", item_len - 4);
+ printf(" type=%s", STR_OR_ID((cert.encode), certstr));
+- if (2 < vflag && 4 < ntohs(cert.h.len)) {
++ if (2 < vflag && 4 < item_len) {
+ printf(" ");
+- rawprint((caddr_t)(ext + 1), ntohs(cert.h.len) - 4);
++ if (!rawprint((caddr_t)(ext + 1), item_len - 4))
++ goto trunc;
+ }
+- return (u_char *)ext + ntohs(cert.h.len);
++ return (u_char *)ext + item_len;
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_CERT));
++ return NULL;
+ }
+
+ static const u_char *
+-isakmp_cr_print(const struct isakmp_gen *ext, const u_char *ep _U_,
+- u_int32_t phase _U_, u_int32_t doi0 _U_, u_int32_t proto0 _U_,
+- int depth _U_)
++isakmp_cr_print(const struct isakmp_gen *ext, u_int item_len _U_,
++ const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi0 _U_,
++ u_int32_t proto0 _U_, int depth _U_)
+ {
+ const struct isakmp_pl_cert *p;
+ struct isakmp_pl_cert cert;
+@@ -812,73 +882,96 @@
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_CR));
+
+ p = (struct isakmp_pl_cert *)ext;
++ TCHECK(*p);
+ safememcpy(&cert, ext, sizeof(cert));
+- printf(" len=%d", ntohs(cert.h.len) - 4);
++ printf(" len=%d", item_len - 4);
+ printf(" type=%s", STR_OR_ID((cert.encode), certstr));
+- if (2 < vflag && 4 < ntohs(cert.h.len)) {
++ if (2 < vflag && 4 < item_len) {
+ printf(" ");
+- rawprint((caddr_t)(ext + 1), ntohs(cert.h.len) - 4);
++ if (!rawprint((caddr_t)(ext + 1), item_len - 4))
++ goto trunc;
+ }
+- return (u_char *)ext + ntohs(cert.h.len);
++ return (u_char *)ext + item_len;
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_CR));
++ return NULL;
+ }
+
+ static const u_char *
+-isakmp_hash_print(const struct isakmp_gen *ext, const u_char *ep _U_,
+- u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto _U_,
+- int depth _U_)
++isakmp_hash_print(const struct isakmp_gen *ext, u_int item_len _U_,
++ const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_,
++ u_int32_t proto _U_, int depth _U_)
+ {
+ struct isakmp_gen e;
+
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_HASH));
+
++ TCHECK(*ext);
+ safememcpy(&e, ext, sizeof(e));
+ printf(" len=%d", ntohs(e.len) - 4);
+ if (2 < vflag && 4 < ntohs(e.len)) {
+ printf(" ");
+- rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
++ if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
++ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_HASH));
++ return NULL;
+ }
+
+ static const u_char *
+-isakmp_sig_print(const struct isakmp_gen *ext, const u_char *ep _U_,
+- u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto _U_,
+- int depth _U_)
++isakmp_sig_print(const struct isakmp_gen *ext, u_int item_len _U_,
++ const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_,
++ u_int32_t proto _U_, int depth _U_)
+ {
+ struct isakmp_gen e;
+
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_SIG));
+
++ TCHECK(*ext);
+ safememcpy(&e, ext, sizeof(e));
+ printf(" len=%d", ntohs(e.len) - 4);
+ if (2 < vflag && 4 < ntohs(e.len)) {
+ printf(" ");
+- rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
++ if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
++ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_SIG));
++ return NULL;
+ }
+
+ static const u_char *
+-isakmp_nonce_print(const struct isakmp_gen *ext, const u_char *ep _U_,
+- u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto _U_,
+- int depth _U_)
++isakmp_nonce_print(const struct isakmp_gen *ext,
++ u_int item_len _U_,
++ const u_char *ep _U_,
++ u_int32_t phase _U_, u_int32_t doi _U_,
++ u_int32_t proto _U_, int depth _U_)
+ {
+ struct isakmp_gen e;
+
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_NONCE));
+
++ TCHECK(*ext);
+ safememcpy(&e, ext, sizeof(e));
+ printf(" n len=%d", ntohs(e.len) - 4);
+ if (2 < vflag && 4 < ntohs(e.len)) {
+ printf(" ");
+- rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
++ if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
++ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE));
++ return NULL;
+ }
+
+ static const u_char *
+-isakmp_n_print(const struct isakmp_gen *ext, const u_char *ep, u_int32_t phase,
+- u_int32_t doi0 _U_, u_int32_t proto0 _U_, int depth)
++isakmp_n_print(const struct isakmp_gen *ext, u_int item_len,
++ const u_char *ep, u_int32_t phase, u_int32_t doi0 _U_,
++ u_int32_t proto0 _U_, int depth)
+ {
+ struct isakmp_pl_n *p, n;
+ const u_char *cp;
+@@ -934,6 +1027,7 @@
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_N));
+
+ p = (struct isakmp_pl_n *)ext;
++ TCHECK(*p);
+ safememcpy(&n, ext, sizeof(n));
+ doi = ntohl(n.doi);
+ proto = n.prot_id;
+@@ -950,7 +1044,8 @@
+ printf(" type=%s", numstr(ntohs(n.type)));
+ if (n.spi_size) {
+ printf(" spi=");
+- rawprint((caddr_t)(p + 1), n.spi_size);
++ if (!rawprint((caddr_t)(p + 1), n.spi_size))
++ goto trunc;
+ }
+ return (u_char *)(p + 1) + n.spi_size;
+ }
+@@ -969,11 +1064,12 @@
+ printf(" type=%s", numstr(ntohs(n.type)));
+ if (n.spi_size) {
+ printf(" spi=");
+- rawprint((caddr_t)(p + 1), n.spi_size);
++ if (!rawprint((caddr_t)(p + 1), n.spi_size))
++ goto trunc;
+ }
+
+ cp = (u_char *)(p + 1) + n.spi_size;
+- ep2 = (u_char *)p + ntohs(n.h.len);
++ ep2 = (u_char *)p + item_len;
+
+ if (cp < ep) {
+ printf(" orig=(");
+@@ -1000,19 +1096,21 @@
+ break;
+ default:
+ /* NULL is dummy */
+- isakmp_print(cp,
+- ntohs(n.h.len) - sizeof(*p) - n.spi_size,
++ isakmp_print(cp, item_len - sizeof(*p) - n.spi_size,
+ NULL);
+ }
+ printf(")");
+ }
+- return (u_char *)ext + ntohs(n.h.len);
++ return (u_char *)ext + item_len;
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_N));
++ return NULL;
+ }
+
+ static const u_char *
+-isakmp_d_print(const struct isakmp_gen *ext, const u_char *ep _U_,
+- u_int32_t phase _U_, u_int32_t doi0 _U_, u_int32_t proto0 _U_,
+- int depth _U_)
++isakmp_d_print(const struct isakmp_gen *ext, u_int item_len _U_,
++ const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi0 _U_,
++ u_int32_t proto0 _U_, int depth _U_)
+ {
+ const struct isakmp_pl_d *p;
+ struct isakmp_pl_d d;
+@@ -1024,6 +1122,7 @@
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_D));
+
+ p = (struct isakmp_pl_d *)ext;
++ TCHECK(*p);
+ safememcpy(&d, ext, sizeof(d));
+ doi = ntohl(d.doi);
+ proto = d.prot_id;
+@@ -1041,28 +1140,38 @@
+ for (i = 0; i < ntohs(d.num_spi); i++) {
+ if (i != 0)
+ printf(",");
+- rawprint((caddr_t)q, d.spi_size);
++ if (!rawprint((caddr_t)q, d.spi_size))
++ goto trunc;
+ q += d.spi_size;
+ }
+ return q;
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_D));
++ return NULL;
+ }
+
+ static const u_char *
+-isakmp_vid_print(const struct isakmp_gen *ext, const u_char *ep _U_,
+- u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto _U_,
+- int depth _U_)
++isakmp_vid_print(const struct isakmp_gen *ext,
++ u_int item_len _U_, const u_char *ep _U_,
++ u_int32_t phase _U_, u_int32_t doi _U_,
++ u_int32_t proto _U_, int depth _U_)
+ {
+ struct isakmp_gen e;
+
+ printf("%s:", NPSTR(ISAKMP_NPTYPE_VID));
+
++ TCHECK(*ext);
+ safememcpy(&e, ext, sizeof(e));
+ printf(" len=%d", ntohs(e.len) - 4);
+ if (2 < vflag && 4 < ntohs(e.len)) {
+ printf(" ");
+- rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
++ if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
++ goto trunc;
+ }
+ return (u_char *)ext + ntohs(e.len);
++trunc:
++ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_VID));
++ return NULL;
+ }
+
+ static const u_char *
+@@ -1074,6 +1183,7 @@
+ u_int item_len;
+
+ cp = (u_char *)ext;
++ TCHECK(*ext);
+ safememcpy(&e, ext, sizeof(e));
+
+ /*
+@@ -1091,13 +1201,16 @@
+ * XXX - what if item_len is too short, or too long,
+ * for this payload type?
+ */
+- cp = (*NPFUNC(np))(ext, ep, phase, doi, proto, depth);
++ cp = (*NPFUNC(np))(ext, item_len, ep, phase, doi, proto, depth);
+ } else {
+ printf("%s", NPSTR(np));
+ cp += item_len;
+ }
+
+ return cp;
++trunc:
++ printf(" [|isakmp]");
++ return NULL;
+ }
+
+ static const u_char *
+@@ -1111,13 +1224,12 @@
cp = (const u_char *)ext;
while (np) {
-+ TCHECK2(*ext, sizeof(e));
++ TCHECK(*ext);
+
safememcpy(&e, ext, sizeof(e));
- if (ep < (u_char *)ext + ntohs(e.len)) {
-@@ -1136,6 +1142,8 @@
+- if (ep < (u_char *)ext + ntohs(e.len)) {
+- printf(" [|%s]", NPSTR(np));
+- cp = ep + 1;
+- break;
+- }
++ TCHECK2(*ext, ntohs(e.len));
++
+ depth++;
+ printf("\n");
+ for (i = 0; i < depth; i++)
+@@ -1136,6 +1248,9 @@
ext = (struct isakmp_gen *)cp;
}
return cp;
+trunc:
++ printf(" [|%s]", NPSTR(np));
+ return NULL;
}
static char *
-
+@@ -1263,7 +1378,7 @@
+ done:
+ if (vflag) {
+ if (ntohl(base.len) != length) {
+- printf(" (len mismatch: isakmp %u/ip %d)",
++ printf(" (len mismatch: isakmp %u/ip %u)",
+ (u_int32_t)ntohl(base.len), length);
+ }
+ }
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/tcpdump/tcpdump.spec
============================================================================
$ cvs diff -u -r1.37.2.1 -r1.37.2.2 tcpdump.spec
--- openpkg-src/tcpdump/tcpdump.spec 18 Feb 2004 14:51:59 -0000 1.37.2.1
+++ openpkg-src/tcpdump/tcpdump.spec 6 Apr 2004 15:39:44 -0000 1.37.2.2
@@ -34,7 +34,7 @@
Group: Network
License: GPL
Version: 3.8.1
-Release: 2.0.0
+Release: 2.0.1
# list of sources
Source0: http://www.tcpdump.org/release/tcpdump-%{version}.tar.gz
@@ .
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [EMAIL PROTECTED]