Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=frugalware-current.git;a=commitdiff;h=6bc9853f93cbcc1ec24c0b720772b0c0d2d8a6b8
commit 6bc9853f93cbcc1ec24c0b720772b0c0d2d8a6b8 Author: kikadf <[email protected]> Date: Mon Nov 24 09:15:59 2014 +0100 tcpdump-4.5.1-2-x86_64 * Fix CVE-2014-8767, CVE-2014-8768, CVE-2014-8769 diff --git a/source/network-extra/tcpdump/CVE-2014-8767.patch b/source/network-extra/tcpdump/CVE-2014-8767.patch new file mode 100644 index 0000000..e0eab74 --- /dev/null +++ b/source/network-extra/tcpdump/CVE-2014-8767.patch @@ -0,0 +1,178 @@ +From d8b4852e45a94fcde141ae28a2d5e36368ca92ae Mon Sep 17 00:00:00 2001 +From: Michal Sekletar <[email protected]> +Date: Thu, 20 Nov 2014 11:38:46 +0100 +Subject: [PATCH] Do more bounds checking and length checking. + +Don't run past the end of the captured data, and don't run past the end +of the packet (i.e., don't make the length variable go negative). + +Also, stop dissecting if the message length isn't valid. + +(cherry picked from commit 4038f83ebf654804829b258dde5e0a508c1c2003) +--- + print-olsr.c | 56 +++++++++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 43 insertions(+), 13 deletions(-) + +diff --git a/print-olsr.c b/print-olsr.c +index d8619d4..f586d80 100644 +--- a/print-olsr.c ++++ b/print-olsr.c +@@ -181,7 +181,7 @@ struct olsr_lq_neighbor6 { + /* + * print a neighbor list with LQ extensions. + */ +-static void ++static int + olsr_print_lq_neighbor4 (const u_char *msg_data, u_int hello_len) + { + struct olsr_lq_neighbor4 *lq_neighbor; +@@ -189,6 +189,8 @@ olsr_print_lq_neighbor4 (const u_char *msg_data, u_int hello_len) + while (hello_len >= sizeof(struct olsr_lq_neighbor4)) { + + lq_neighbor = (struct olsr_lq_neighbor4 *)msg_data; ++ if (!TTEST(*lq_neighbor)) ++ return (-1); + + printf("\n\t neighbor %s, link-quality %.2lf%%" + ", neighbor-link-quality %.2lf%%", +@@ -199,10 +201,11 @@ olsr_print_lq_neighbor4 (const u_char *msg_data, u_int hello_len) + msg_data += sizeof(struct olsr_lq_neighbor4); + hello_len -= sizeof(struct olsr_lq_neighbor4); + } ++ return (0); + } + + #if INET6 +-static void ++static int + olsr_print_lq_neighbor6 (const u_char *msg_data, u_int hello_len) + { + struct olsr_lq_neighbor6 *lq_neighbor; +@@ -210,6 +213,8 @@ olsr_print_lq_neighbor6 (const u_char *msg_data, u_int hello_len) + while (hello_len >= sizeof(struct olsr_lq_neighbor6)) { + + lq_neighbor = (struct olsr_lq_neighbor6 *)msg_data; ++ if (!TTEST(*lq_neighbor)) ++ return (-1); + + printf("\n\t neighbor %s, link-quality %.2lf%%" + ", neighbor-link-quality %.2lf%%", +@@ -220,13 +225,14 @@ olsr_print_lq_neighbor6 (const u_char *msg_data, u_int hello_len) + msg_data += sizeof(struct olsr_lq_neighbor6); + hello_len -= sizeof(struct olsr_lq_neighbor6); + } ++ return (0); + } + #endif /* INET6 */ + + /* + * print a neighbor list. + */ +-static void ++static int + olsr_print_neighbor (const u_char *msg_data, u_int hello_len) + { + int neighbor; +@@ -236,6 +242,9 @@ olsr_print_neighbor (const u_char *msg_data, u_int hello_len) + + while (hello_len >= sizeof(struct in_addr)) { + ++ if (!TTEST2(*msg_data, sizeof(struct in_addr))) ++ return (-1); ++ + /* print 4 neighbors per line */ + + printf("%s%s", ipaddr_string(msg_data), +@@ -329,6 +338,9 @@ olsr_print (const u_char *pptr, u_int length, int is_ipv6) + ME_TO_DOUBLE(msgptr.v6->vtime), + EXTRACT_16BITS(msgptr.v6->msg_seq), + msg_len, (msg_len_valid == 0) ? " (invalid)" : ""); ++ if (!msg_len_valid) { ++ return; ++ } + + msg_tlen = msg_len - sizeof(struct olsr_msg6); + msg_data = tptr + sizeof(struct olsr_msg6); +@@ -357,6 +369,9 @@ olsr_print (const u_char *pptr, u_int length, int is_ipv6) + ME_TO_DOUBLE(msgptr.v4->vtime), + EXTRACT_16BITS(msgptr.v4->msg_seq), + msg_len, (msg_len_valid == 0) ? " (invalid)" : ""); ++ if (!msg_len_valid) { ++ return; ++ } + + msg_tlen = msg_len - sizeof(struct olsr_msg4); + msg_data = tptr + sizeof(struct olsr_msg4); +@@ -365,6 +380,8 @@ olsr_print (const u_char *pptr, u_int length, int is_ipv6) + switch (msg_type) { + case OLSR_HELLO_MSG: + case OLSR_HELLO_LQ_MSG: ++ if (msg_tlen < sizeof(struct olsr_hello)) ++ goto trunc; + if (!TTEST2(*msg_data, sizeof(struct olsr_hello))) + goto trunc; + +@@ -406,15 +423,21 @@ olsr_print (const u_char *pptr, u_int length, int is_ipv6) + msg_tlen -= sizeof(struct olsr_hello_link); + hello_len -= sizeof(struct olsr_hello_link); + ++ TCHECK2(*msg_data, hello_len); + if (msg_type == OLSR_HELLO_MSG) { +- olsr_print_neighbor(msg_data, hello_len); ++ if (olsr_print_neighbor(msg_data, hello_len) == -1) ++ goto trunc; + } else { + #if INET6 +- if (is_ipv6) +- olsr_print_lq_neighbor6(msg_data, hello_len); +- else ++ if (is_ipv6) { ++ if (olsr_print_lq_neighbor6(msg_data, hello_len) == -1) ++ goto trunc; ++ } else + #endif +- olsr_print_lq_neighbor4(msg_data, hello_len); ++ { ++ if (olsr_print_lq_neighbor4(msg_data, hello_len) == -1) ++ goto trunc; ++ } + } + + msg_data += hello_len; +@@ -424,6 +447,8 @@ olsr_print (const u_char *pptr, u_int length, int is_ipv6) + + case OLSR_TC_MSG: + case OLSR_TC_LQ_MSG: ++ if (msg_tlen < sizeof(struct olsr_tc)) ++ goto trunc; + if (!TTEST2(*msg_data, sizeof(struct olsr_tc))) + goto trunc; + +@@ -434,14 +459,19 @@ olsr_print (const u_char *pptr, u_int length, int is_ipv6) + msg_tlen -= sizeof(struct olsr_tc); + + if (msg_type == OLSR_TC_MSG) { +- olsr_print_neighbor(msg_data, msg_tlen); ++ if (olsr_print_neighbor(msg_data, msg_tlen) == -1) ++ goto trunc; + } else { + #if INET6 +- if (is_ipv6) +- olsr_print_lq_neighbor6(msg_data, msg_tlen); +- else ++ if (is_ipv6) { ++ if (olsr_print_lq_neighbor6(msg_data, msg_tlen) == -1) ++ goto trunc; ++ } else + #endif +- olsr_print_lq_neighbor4(msg_data, msg_tlen); ++ { ++ if (olsr_print_lq_neighbor4(msg_data, msg_tlen) == -1) ++ goto trunc; ++ } + } + break; + +-- +1.8.3.1 + diff --git a/source/network-extra/tcpdump/CVE-2014-8768.patch b/source/network-extra/tcpdump/CVE-2014-8768.patch new file mode 100644 index 0000000..02ddd99 --- /dev/null +++ b/source/network-extra/tcpdump/CVE-2014-8768.patch @@ -0,0 +1,335 @@ +diff -up tcpdump-4.5.1/print-geonet.c.cve-2014-8768 tcpdump-4.5.1/print-geonet.c +--- tcpdump-4.5.1/print-geonet.c.cve-2014-8768 2014-11-20 15:38:53.183794306 +0100 ++++ tcpdump-4.5.1/print-geonet.c 2014-11-20 15:59:06.832860093 +0100 +@@ -56,16 +56,12 @@ static const struct tok msg_type_values[ + }; + + static void +-print_btp_body(const u_char *bp, u_int length) ++print_btp_body(const u_char *bp) + { + int version; + int msg_type; + const char *msg_type_str; + +- if (length <= 2) { +- return; +- } +- + /* Assuming ItsDpuHeader */ + version = bp[0]; + msg_type = bp[1]; +@@ -82,7 +78,7 @@ print_btp(const u_char *bp) + printf("; BTP Dst:%u Src:%u", dest, src); + } + +-static void ++static int + print_long_pos_vector(const u_char *bp) + { + int i; +@@ -95,10 +91,14 @@ print_long_pos_vector(const u_char *bp) + } + printf(" "); + ++ if (!TTEST2(*(bp+12), 8)) ++ return (-1); ++ + lat = EXTRACT_32BITS(bp+12); + printf("lat:%d ", lat); + lon = EXTRACT_32BITS(bp+16); + printf("lon:%d", lon); ++ return (0); + } + + +@@ -109,140 +109,159 @@ print_long_pos_vector(const u_char *bp) + void + geonet_print(netdissect_options *ndo, const u_char *eth, const u_char *bp, u_int length) + { +- printf("GeoNet src:%s; ", etheraddr_string(eth+6)); ++ int version; ++ int next_hdr; ++ int hdr_type; ++ int hdr_subtype; ++ uint16_t payload_length; ++ int hop_limit; ++ const char *next_hdr_txt = "Unknown"; ++ const char *hdr_type_txt = "Unknown"; ++ int hdr_size = -1; + +- if (length >= 36) { +- /* Process Common Header */ +- int version = bp[0] >> 4; +- int next_hdr = bp[0] & 0x0f; +- int hdr_type = bp[1] >> 4; +- int hdr_subtype = bp[1] & 0x0f; +- u_int16_t payload_length = EXTRACT_16BITS(bp+4); +- int hop_limit = bp[7]; +- const char *next_hdr_txt = "Unknown"; +- const char *hdr_type_txt = "Unknown"; +- int hdr_size = -1; +- +- switch (next_hdr) { +- case 0: next_hdr_txt = "Any"; break; +- case 1: next_hdr_txt = "BTP-A"; break; +- case 2: next_hdr_txt = "BTP-B"; break; +- case 3: next_hdr_txt = "IPv6"; break; +- } +- +- switch (hdr_type) { +- case 0: hdr_type_txt = "Any"; break; +- case 1: hdr_type_txt = "Beacon"; break; +- case 2: hdr_type_txt = "GeoUnicast"; break; +- case 3: switch (hdr_subtype) { +- case 0: hdr_type_txt = "GeoAnycastCircle"; break; +- case 1: hdr_type_txt = "GeoAnycastRect"; break; +- case 2: hdr_type_txt = "GeoAnycastElipse"; break; +- } +- break; +- case 4: switch (hdr_subtype) { +- case 0: hdr_type_txt = "GeoBroadcastCircle"; break; +- case 1: hdr_type_txt = "GeoBroadcastRect"; break; +- case 2: hdr_type_txt = "GeoBroadcastElipse"; break; +- } +- break; +- case 5: switch (hdr_subtype) { +- case 0: hdr_type_txt = "TopoScopeBcast-SH"; break; +- case 1: hdr_type_txt = "TopoScopeBcast-MH"; break; +- } +- break; +- case 6: switch (hdr_subtype) { +- case 0: hdr_type_txt = "LocService-Request"; break; +- case 1: hdr_type_txt = "LocService-Reply"; break; +- } +- break; +- } +- +- printf("v:%d ", version); +- printf("NH:%d-%s ", next_hdr, next_hdr_txt); +- printf("HT:%d-%d-%s ", hdr_type, hdr_subtype, hdr_type_txt); +- printf("HopLim:%d ", hop_limit); +- printf("Payload:%d ", payload_length); +- print_long_pos_vector(bp + 8); +- +- /* Skip Common Header */ +- length -= 36; +- bp += 36; +- +- /* Process Extended Headers */ +- switch (hdr_type) { +- case 0: /* Any */ +- hdr_size = 0; +- break; +- case 1: /* Beacon */ +- hdr_size = 0; +- break; +- case 2: /* GeoUnicast */ +- break; +- case 3: switch (hdr_subtype) { +- case 0: /* GeoAnycastCircle */ +- break; +- case 1: /* GeoAnycastRect */ +- break; +- case 2: /* GeoAnycastElipse */ +- break; +- } +- break; +- case 4: switch (hdr_subtype) { +- case 0: /* GeoBroadcastCircle */ +- break; +- case 1: /* GeoBroadcastRect */ +- break; +- case 2: /* GeoBroadcastElipse */ +- break; +- } +- break; +- case 5: switch (hdr_subtype) { +- case 0: /* TopoScopeBcast-SH */ +- hdr_size = 0; +- break; +- case 1: /* TopoScopeBcast-MH */ +- hdr_size = 68 - 36; +- break; +- } +- break; +- case 6: switch (hdr_subtype) { +- case 0: /* LocService-Request */ +- break; +- case 1: /* LocService-Reply */ +- break; +- } +- break; +- } +- +- /* Skip Extended headers */ +- if (hdr_size >= 0) { +- length -= hdr_size; +- bp += hdr_size; +- switch (next_hdr) { +- case 0: /* Any */ +- break; +- case 1: +- case 2: /* BTP A/B */ +- print_btp(bp); +- length -= 4; +- bp += 4; +- print_btp_body(bp, length); +- break; +- case 3: /* IPv6 */ +- break; +- } +- } +- } else { +- printf("Malformed (small) "); +- } ++ printf("GeoNet src:%s; ", etheraddr_string(eth+6)); + +- /* Print user data part */ +- if (ndo->ndo_vflag) +- default_print(bp, length); +-} ++ /* Process Common Header */ ++ if (length < 36) ++ goto malformed; ++ ++ ND_TCHECK2(*bp, 7); ++ version = bp[0] >> 4; ++ next_hdr = bp[0] & 0x0f; ++ hdr_type = bp[1] >> 4; ++ hdr_subtype = bp[1] & 0x0f; ++ payload_length = EXTRACT_16BITS(bp+4); ++ hop_limit = bp[7]; ++ ++ switch (next_hdr) { ++ case 0: next_hdr_txt = "Any"; break; ++ case 1: next_hdr_txt = "BTP-A"; break; ++ case 2: next_hdr_txt = "BTP-B"; break; ++ case 3: next_hdr_txt = "IPv6"; break; ++ } ++ ++ switch (hdr_type) { ++ case 0: hdr_type_txt = "Any"; break; ++ case 1: hdr_type_txt = "Beacon"; break; ++ case 2: hdr_type_txt = "GeoUnicast"; break; ++ case 3: switch (hdr_subtype) { ++ case 0: hdr_type_txt = "GeoAnycastCircle"; break; ++ case 1: hdr_type_txt = "GeoAnycastRect"; break; ++ case 2: hdr_type_txt = "GeoAnycastElipse"; break; ++ } ++ break; ++ case 4: switch (hdr_subtype) { ++ case 0: hdr_type_txt = "GeoBroadcastCircle"; break; ++ case 1: hdr_type_txt = "GeoBroadcastRect"; break; ++ case 2: hdr_type_txt = "GeoBroadcastElipse"; break; ++ } ++ break; ++ case 5: switch (hdr_subtype) { ++ case 0: hdr_type_txt = "TopoScopeBcast-SH"; break; ++ case 1: hdr_type_txt = "TopoScopeBcast-MH"; break; ++ } ++ break; ++ case 6: switch (hdr_subtype) { ++ case 0: hdr_type_txt = "LocService-Request"; break; ++ case 1: hdr_type_txt = "LocService-Reply"; break; ++ } ++ break; ++ } ++ ++ printf("v:%d ", version); ++ printf("NH:%d-%s ", next_hdr, next_hdr_txt); ++ printf("HT:%d-%d-%s ", hdr_type, hdr_subtype, hdr_type_txt); ++ printf("HopLim:%d ", hop_limit); ++ printf("Payload:%d ", payload_length); ++ print_long_pos_vector(bp + 8); ++ ++ /* Skip Common Header */ ++ length -= 36; ++ bp += 36; ++ ++ /* Process Extended Headers */ ++ switch (hdr_type) { ++ case 0: /* Any */ ++ hdr_size = 0; ++ break; ++ case 1: /* Beacon */ ++ hdr_size = 0; ++ break; ++ case 2: /* GeoUnicast */ ++ break; ++ case 3: switch (hdr_subtype) { ++ case 0: /* GeoAnycastCircle */ ++ break; ++ case 1: /* GeoAnycastRect */ ++ break; ++ case 2: /* GeoAnycastElipse */ ++ break; ++ } ++ break; ++ case 4: switch (hdr_subtype) { ++ case 0: /* GeoBroadcastCircle */ ++ break; ++ case 1: /* GeoBroadcastRect */ ++ break; ++ case 2: /* GeoBroadcastElipse */ ++ break; ++ } ++ break; ++ case 5: switch (hdr_subtype) { ++ case 0: /* TopoScopeBcast-SH */ ++ hdr_size = 0; ++ break; ++ case 1: /* TopoScopeBcast-MH */ ++ hdr_size = 68 - 36; ++ break; ++ } ++ break; ++ case 6: switch (hdr_subtype) { ++ case 0: /* LocService-Request */ ++ break; ++ case 1: /* LocService-Reply */ ++ break; ++ } ++ break; ++ } ++ ++ /* Skip Extended headers */ ++ if (hdr_size >= 0) { ++ if (length < (u_int)hdr_size) ++ goto malformed; ++ ND_TCHECK2(*bp, hdr_size); ++ ++ length -= hdr_size; ++ bp += hdr_size; ++ switch (next_hdr) { ++ case 0: /* Any */ ++ break; ++ case 1: ++ case 2: /* BTP A/B */ ++ print_btp(bp); ++ length -= 4; ++ bp += 4; ++ print_btp_body(bp); ++ break; ++ case 3: /* IPv6 */ ++ break; ++ } ++ } ++ ++ /* Print user data part */ ++ if (ndo->ndo_vflag) ++ default_print(bp, length); ++ return; ++ ++malformed: ++ ND_PRINT((ndo, " Malformed (small) ")); ++ /* XXX - print the remaining data as hex? */ ++ return; + ++trunc: ++ ND_PRINT((ndo, "[|geonet]")); + ++} + /* + * Local Variables: + * c-style: whitesmith diff --git a/source/network-extra/tcpdump/CVE-2014-8769.patch b/source/network-extra/tcpdump/CVE-2014-8769.patch new file mode 100644 index 0000000..30d694a --- /dev/null +++ b/source/network-extra/tcpdump/CVE-2014-8769.patch @@ -0,0 +1,581 @@ +From 357525b6942eef3ef9696f1fe92ba7fe2ed68ac2 Mon Sep 17 00:00:00 2001 +From: Michal Sekletar <[email protected]> +Date: Fri, 21 Nov 2014 12:19:32 +0100 +Subject: [PATCH] Fix for CVE-2014-8769 + +(cherry picked from ab4e52b94aac6cb729a5a695aa612d5ebda2ec3a + 3e8a443c3671baa37ae7870f08fb9b4bf386fd24) +--- + aodv.h | 20 ---- + print-aodv.c | 315 +++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 168 insertions(+), 167 deletions(-) + +diff --git a/aodv.h b/aodv.h +index 456ec8b..18467d5 100644 +--- a/aodv.h ++++ b/aodv.h +@@ -134,13 +134,6 @@ struct aodv_rerr { + u_int8_t rerr_flags; /* various flags */ + u_int8_t rerr_zero0; /* reserved, set to zero */ + u_int8_t rerr_dc; /* destination count */ +- union { +- struct rerr_unreach dest[1]; +-#ifdef INET6 +- struct rerr_unreach6 dest6[1]; +- struct rerr_unreach6_draft_01 dest6_draft_01[1]; +-#endif +- } r; + }; + + #define RERR_NODELETE 0x80 /* don't delete the link */ +@@ -151,19 +144,6 @@ struct aodv_rrep_ack { + u_int8_t ra_zero0; + }; + +-union aodv { +- struct aodv_rreq rreq; +- struct aodv_rrep rrep; +- struct aodv_rerr rerr; +- struct aodv_rrep_ack rrep_ack; +-#ifdef INET6 +- struct aodv_rreq6 rreq6; +- struct aodv_rreq6_draft_01 rreq6_draft_01; +- struct aodv_rrep6 rrep6; +- struct aodv_rrep6_draft_01 rrep6_draft_01; +-#endif +-}; +- + #define AODV_RREQ 1 /* route request */ + #define AODV_RREP 2 /* route response */ + #define AODV_RERR 3 /* error report */ +diff --git a/print-aodv.c b/print-aodv.c +index c5f6622..b4f7989 100644 +--- a/print-aodv.c ++++ b/print-aodv.c +@@ -82,7 +82,7 @@ aodv_extension(const struct aodv_ext *ep, u_int length) + } + + static void +-aodv_rreq(const union aodv *ap, const u_char *dat, u_int length) ++aodv_rreq(const struct aodv_rreq *ap, const u_char *dat, u_int length) + { + u_int i; + +@@ -91,30 +91,31 @@ aodv_rreq(const union aodv *ap, const u_char *dat, u_int length) + return; + } + i = min(length, (u_int)(snapend - dat)); +- if (i < sizeof(ap->rreq)) { ++ if (i < sizeof(*ap)) { + printf(" [|rreq]"); + return; + } +- i -= sizeof(ap->rreq); ++ i -= sizeof(*ap); + printf(" rreq %u %s%s%s%s%shops %u id 0x%08lx\n" + "\tdst %s seq %lu src %s seq %lu", length, +- ap->rreq.rreq_type & RREQ_JOIN ? "[J]" : "", +- ap->rreq.rreq_type & RREQ_REPAIR ? "[R]" : "", +- ap->rreq.rreq_type & RREQ_GRAT ? "[G]" : "", +- ap->rreq.rreq_type & RREQ_DEST ? "[D]" : "", +- ap->rreq.rreq_type & RREQ_UNKNOWN ? "[U] " : " ", +- ap->rreq.rreq_hops, +- (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_id), +- ipaddr_string(&ap->rreq.rreq_da), +- (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_ds), +- ipaddr_string(&ap->rreq.rreq_oa), +- (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_os)); ++ ap->rreq_type & RREQ_JOIN ? "[J]" : "", ++ ap->rreq_type & RREQ_REPAIR ? "[R]" : "", ++ ap->rreq_type & RREQ_GRAT ? "[G]" : "", ++ ap->rreq_type & RREQ_DEST ? "[D]" : "", ++ ap->rreq_type & RREQ_UNKNOWN ? "[U] " : " ", ++ ap->rreq_hops, ++ (unsigned long)EXTRACT_32BITS(&ap->rreq_id), ++ ipaddr_string(&ap->rreq_da), ++ (unsigned long)EXTRACT_32BITS(&ap->rreq_ds), ++ ipaddr_string(&ap->rreq_oa), ++ (unsigned long)EXTRACT_32BITS(&ap->rreq_os)); ++ + if (i >= sizeof(struct aodv_ext)) +- aodv_extension((void *)(&ap->rreq + 1), i); ++ aodv_extension((void *)(ap + 1), i); + } + + static void +-aodv_rrep(const union aodv *ap, const u_char *dat, u_int length) ++aodv_rrep(const struct aodv_rrep *ap, const u_char *dat, u_int length) + { + u_int i; + +@@ -123,62 +124,60 @@ aodv_rrep(const union aodv *ap, const u_char *dat, u_int length) + return; + } + i = min(length, (u_int)(snapend - dat)); +- if (i < sizeof(ap->rrep)) { ++ if (i < sizeof(*ap)) { + printf(" [|rrep]"); + return; + } +- i -= sizeof(ap->rrep); ++ i -= sizeof(*ap); + printf(" rrep %u %s%sprefix %u hops %u\n" + "\tdst %s dseq %lu src %s %lu ms", length, +- ap->rrep.rrep_type & RREP_REPAIR ? "[R]" : "", +- ap->rrep.rrep_type & RREP_ACK ? "[A] " : " ", +- ap->rrep.rrep_ps & RREP_PREFIX_MASK, +- ap->rrep.rrep_hops, +- ipaddr_string(&ap->rrep.rrep_da), +- (unsigned long)EXTRACT_32BITS(&ap->rrep.rrep_ds), +- ipaddr_string(&ap->rrep.rrep_oa), +- (unsigned long)EXTRACT_32BITS(&ap->rrep.rrep_life)); +- if (i >= sizeof(struct aodv_ext)) +- aodv_extension((void *)(&ap->rrep + 1), i); ++ ap->rrep_type & RREP_REPAIR ? "[R]" : "", ++ ap->rrep_type & RREP_ACK ? "[A] " : " ", ++ ap->rrep_ps & RREP_PREFIX_MASK, ++ ap->rrep_hops, ++ ipaddr_string(&ap->rrep_da), ++ (unsigned long)EXTRACT_32BITS(&ap->rrep_ds), ++ ipaddr_string(&ap->rrep_oa), ++ (unsigned long)EXTRACT_32BITS(&ap->rrep_life)); ++ ++ if (i >= sizeof(struct aodv_ext)) ++ aodv_extension((void *)(ap + 1), i); + } + + static void +-aodv_rerr(const union aodv *ap, const u_char *dat, u_int length) ++aodv_rerr(const struct aodv_rerr *ap, const u_char *dat, u_int length) + { +- u_int i; +- const struct rerr_unreach *dp = NULL; +- int n, trunc; ++ u_int i, dc; ++ const struct rerr_unreach *dp; + + if (snapend < dat) { + printf(" [|aodv]"); + return; + } + i = min(length, (u_int)(snapend - dat)); +- if (i < offsetof(struct aodv_rerr, r)) { ++ if (i < sizeof(*ap)) { + printf(" [|rerr]"); + return; + } +- i -= offsetof(struct aodv_rerr, r); +- dp = &ap->rerr.r.dest[0]; +- n = ap->rerr.rerr_dc * sizeof(ap->rerr.r.dest[0]); ++ i -= sizeof(*ap); + printf(" rerr %s [items %u] [%u]:", +- ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "", +- ap->rerr.rerr_dc, length); +- trunc = n - (i/sizeof(ap->rerr.r.dest[0])); +- for (; i >= sizeof(ap->rerr.r.dest[0]); +- ++dp, i -= sizeof(ap->rerr.r.dest[0])) { ++ ap->rerr_flags & RERR_NODELETE ? "[D]" : "", ++ ap->rerr_dc, length); ++ dp = (struct rerr_unreach *)(void *)(ap + 1); ++ for (dc = ap->rerr_dc; dc != 0 && i >= sizeof(*dp); ++ ++dp, --dc, i -= sizeof(*dp)) { + printf(" {%s}(%ld)", ipaddr_string(&dp->u_da), + (unsigned long)EXTRACT_32BITS(&dp->u_ds)); + } +- if (trunc) ++ if ((i % sizeof(*dp)) != 0) + printf("[|rerr]"); + } + + static void + #ifdef INET6 +-aodv_v6_rreq(const union aodv *ap, const u_char *dat, u_int length) ++aodv_v6_rreq(const struct aodv_rreq6 *ap, const u_char *dat, u_int length) + #else +-aodv_v6_rreq(const union aodv *ap _U_, const u_char *dat _U_, u_int length) ++aodv_v6_rreq(const struct aodv_rreq6 *ap _U_, const u_char *dat _U_, u_int length) + #endif + { + #ifdef INET6 +@@ -189,26 +188,27 @@ aodv_v6_rreq(const union aodv *ap _U_, const u_char *dat _U_, u_int length) + return; + } + i = min(length, (u_int)(snapend - dat)); +- if (i < sizeof(ap->rreq6)) { ++ if (i < sizeof(*ap)) { + printf(" [|rreq6]"); + return; + } +- i -= sizeof(ap->rreq6); ++ i -= sizeof(*ap); + printf(" v6 rreq %u %s%s%s%s%shops %u id 0x%08lx\n" + "\tdst %s seq %lu src %s seq %lu", length, +- ap->rreq6.rreq_type & RREQ_JOIN ? "[J]" : "", +- ap->rreq6.rreq_type & RREQ_REPAIR ? "[R]" : "", +- ap->rreq6.rreq_type & RREQ_GRAT ? "[G]" : "", +- ap->rreq6.rreq_type & RREQ_DEST ? "[D]" : "", +- ap->rreq6.rreq_type & RREQ_UNKNOWN ? "[U] " : " ", +- ap->rreq6.rreq_hops, +- (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_id), +- ip6addr_string(&ap->rreq6.rreq_da), +- (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_ds), +- ip6addr_string(&ap->rreq6.rreq_oa), +- (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_os)); ++ ap->rreq_type & RREQ_JOIN ? "[J]" : "", ++ ap->rreq_type & RREQ_REPAIR ? "[R]" : "", ++ ap->rreq_type & RREQ_GRAT ? "[G]" : "", ++ ap->rreq_type & RREQ_DEST ? "[D]" : "", ++ ap->rreq_type & RREQ_UNKNOWN ? "[U] " : " ", ++ ap->rreq_hops, ++ (unsigned long)EXTRACT_32BITS(&ap->rreq_id), ++ ip6addr_string(&ap->rreq_da), ++ (unsigned long)EXTRACT_32BITS(&ap->rreq_ds), ++ ip6addr_string(&ap->rreq_oa), ++ (unsigned long)EXTRACT_32BITS(&ap->rreq_os)); ++ + if (i >= sizeof(struct aodv_ext)) +- aodv_extension((void *)(&ap->rreq6 + 1), i); ++ aodv_extension((void *)(ap + 1), i); + #else + printf(" v6 rreq %u", length); + #endif +@@ -216,9 +216,9 @@ aodv_v6_rreq(const union aodv *ap _U_, const u_char *dat _U_, u_int length) + + static void + #ifdef INET6 +-aodv_v6_rrep(const union aodv *ap, const u_char *dat, u_int length) ++aodv_v6_rrep(const struct aodv_rrep6 *ap, const u_char *dat, u_int length) + #else +-aodv_v6_rrep(const union aodv *ap _U_, const u_char *dat _U_, u_int length) ++aodv_v6_rrep(const struct aodv_rrep6 *ap _U_, const u_char *dat _U_, u_int length) + #endif + { + #ifdef INET6 +@@ -229,23 +229,24 @@ aodv_v6_rrep(const union aodv *ap _U_, const u_char *dat _U_, u_int length) + return; + } + i = min(length, (u_int)(snapend - dat)); +- if (i < sizeof(ap->rrep6)) { ++ if (i < sizeof(*ap)) { + printf(" [|rrep6]"); + return; + } +- i -= sizeof(ap->rrep6); ++ i -= sizeof(*ap); + printf(" rrep %u %s%sprefix %u hops %u\n" + "\tdst %s dseq %lu src %s %lu ms", length, +- ap->rrep6.rrep_type & RREP_REPAIR ? "[R]" : "", +- ap->rrep6.rrep_type & RREP_ACK ? "[A] " : " ", +- ap->rrep6.rrep_ps & RREP_PREFIX_MASK, +- ap->rrep6.rrep_hops, +- ip6addr_string(&ap->rrep6.rrep_da), +- (unsigned long)EXTRACT_32BITS(&ap->rrep6.rrep_ds), +- ip6addr_string(&ap->rrep6.rrep_oa), +- (unsigned long)EXTRACT_32BITS(&ap->rrep6.rrep_life)); ++ ap->rrep_type & RREP_REPAIR ? "[R]" : "", ++ ap->rrep_type & RREP_ACK ? "[A] " : " ", ++ ap->rrep_ps & RREP_PREFIX_MASK, ++ ap->rrep_hops, ++ ip6addr_string(&ap->rrep_da), ++ (unsigned long)EXTRACT_32BITS(&ap->rrep_ds), ++ ip6addr_string(&ap->rrep_oa), ++ (unsigned long)EXTRACT_32BITS(&ap->rrep_life)); ++ + if (i >= sizeof(struct aodv_ext)) +- aodv_extension((void *)(&ap->rrep6 + 1), i); ++ aodv_extension((void *)(ap + 1), i); + #else + printf(" rrep %u", length); + #endif +@@ -253,28 +254,36 @@ aodv_v6_rrep(const union aodv *ap _U_, const u_char *dat _U_, u_int length) + + static void + #ifdef INET6 +-aodv_v6_rerr(const union aodv *ap, u_int length) ++aodv_v6_rerr(const struct aodv_rerr *ap, const u_char *dat, u_int length) + #else +-aodv_v6_rerr(const union aodv *ap _U_, u_int length) ++aodv_v6_rerr(const struct aodv_rerr *ap _U_, const u_char *dat, u_int length) + #endif + { + #ifdef INET6 +- const struct rerr_unreach6 *dp6 = NULL; +- int i, j, n, trunc; ++ u_int i, dc; ++ const struct rerr_unreach6 *dp6; ++ ++ if (snapend < dat) { ++ printf(" [|aodv]"); ++ return; ++ } ++ i = min(length, (u_int)(snapend - dat)); ++ if (i < sizeof(*ap)) { ++ printf(" [|rerr]"); ++ return; ++ } ++ i -= sizeof(*ap); + +- i = length - offsetof(struct aodv_rerr, r); +- j = sizeof(ap->rerr.r.dest6[0]); +- dp6 = &ap->rerr.r.dest6[0]; +- n = ap->rerr.rerr_dc * j; + printf(" rerr %s [items %u] [%u]:", +- ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "", +- ap->rerr.rerr_dc, length); +- trunc = n - (i/j); +- for (; i -= j >= 0; ++dp6) { ++ ap->rerr_flags & RERR_NODELETE ? "[D]" : "", ++ ap->rerr_dc, length); ++ dp6 = (struct rerr_unreach6 *)(void *)(ap + 1); ++ for (dc = ap->rerr_dc; dc != 0 && i >= sizeof(*dp6); ++ ++dp6, --dc, i -= sizeof(*dp6)) { + printf(" {%s}(%ld)", ip6addr_string(&dp6->u_da), + (unsigned long)EXTRACT_32BITS(&dp6->u_ds)); + } +- if (trunc) ++ if ((i % sizeof(*dp6)) != 0) + printf("[|rerr]"); + #else + printf(" rerr %u", length); +@@ -283,9 +292,9 @@ aodv_v6_rerr(const union aodv *ap _U_, u_int length) + + static void + #ifdef INET6 +-aodv_v6_draft_01_rreq(const union aodv *ap, const u_char *dat, u_int length) ++aodv_v6_draft_01_rreq(const struct aodv_rreq6_draft_01 *ap, const u_char *dat, u_int length) + #else +-aodv_v6_draft_01_rreq(const union aodv *ap _U_, const u_char *dat _U_, ++aodv_v6_draft_01_rreq(const struct aodv_rreq6_draft_01 *ap _U_, const u_char *dat _U_, + u_int length) + #endif + { +@@ -297,26 +306,27 @@ aodv_v6_draft_01_rreq(const union aodv *ap _U_, const u_char *dat _U_, + return; + } + i = min(length, (u_int)(snapend - dat)); +- if (i < sizeof(ap->rreq6_draft_01)) { ++ if (i < sizeof(*ap)) { + printf(" [|rreq6]"); + return; + } +- i -= sizeof(ap->rreq6_draft_01); ++ i -= sizeof(*ap); + printf(" rreq %u %s%s%s%s%shops %u id 0x%08lx\n" + "\tdst %s seq %lu src %s seq %lu", length, +- ap->rreq6_draft_01.rreq_type & RREQ_JOIN ? "[J]" : "", +- ap->rreq6_draft_01.rreq_type & RREQ_REPAIR ? "[R]" : "", +- ap->rreq6_draft_01.rreq_type & RREQ_GRAT ? "[G]" : "", +- ap->rreq6_draft_01.rreq_type & RREQ_DEST ? "[D]" : "", +- ap->rreq6_draft_01.rreq_type & RREQ_UNKNOWN ? "[U] " : " ", +- ap->rreq6_draft_01.rreq_hops, +- (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_id), +- ip6addr_string(&ap->rreq6_draft_01.rreq_da), +- (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_ds), +- ip6addr_string(&ap->rreq6_draft_01.rreq_oa), +- (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_os)); ++ ap->rreq_type & RREQ_JOIN ? "[J]" : "", ++ ap->rreq_type & RREQ_REPAIR ? "[R]" : "", ++ ap->rreq_type & RREQ_GRAT ? "[G]" : "", ++ ap->rreq_type & RREQ_DEST ? "[D]" : "", ++ ap->rreq_type & RREQ_UNKNOWN ? "[U] " : " ", ++ ap->rreq_hops, ++ (unsigned long)EXTRACT_32BITS(&ap->rreq_id), ++ ip6addr_string(&ap->rreq_da), ++ (unsigned long)EXTRACT_32BITS(&ap->rreq_ds), ++ ip6addr_string(&ap->rreq_oa), ++ (unsigned long)EXTRACT_32BITS(&ap->rreq_os)); ++ + if (i >= sizeof(struct aodv_ext)) +- aodv_extension((void *)(&ap->rreq6_draft_01 + 1), i); ++ aodv_extension((void *)(ap + 1), i); + #else + printf(" rreq %u", length); + #endif +@@ -324,9 +334,9 @@ aodv_v6_draft_01_rreq(const union aodv *ap _U_, const u_char *dat _U_, + + static void + #ifdef INET6 +-aodv_v6_draft_01_rrep(const union aodv *ap, const u_char *dat, u_int length) ++aodv_v6_draft_01_rrep(const struct aodv_rrep6_draft_01 *ap, const u_char *dat, u_int length) + #else +-aodv_v6_draft_01_rrep(const union aodv *ap _U_, const u_char *dat _U_, ++aodv_v6_draft_01_rrep(const struct aodv_rrep6_draft_01 *ap _U_, const u_char *dat _U_, + u_int length) + #endif + { +@@ -338,23 +348,24 @@ aodv_v6_draft_01_rrep(const union aodv *ap _U_, const u_char *dat _U_, + return; + } + i = min(length, (u_int)(snapend - dat)); +- if (i < sizeof(ap->rrep6_draft_01)) { ++ if (i < sizeof(*ap)) { + printf(" [|rrep6]"); + return; + } +- i -= sizeof(ap->rrep6_draft_01); ++ i -= sizeof(*ap); + printf(" rrep %u %s%sprefix %u hops %u\n" + "\tdst %s dseq %lu src %s %lu ms", length, +- ap->rrep6_draft_01.rrep_type & RREP_REPAIR ? "[R]" : "", +- ap->rrep6_draft_01.rrep_type & RREP_ACK ? "[A] " : " ", +- ap->rrep6_draft_01.rrep_ps & RREP_PREFIX_MASK, +- ap->rrep6_draft_01.rrep_hops, +- ip6addr_string(&ap->rrep6_draft_01.rrep_da), +- (unsigned long)EXTRACT_32BITS(&ap->rrep6_draft_01.rrep_ds), +- ip6addr_string(&ap->rrep6_draft_01.rrep_oa), +- (unsigned long)EXTRACT_32BITS(&ap->rrep6_draft_01.rrep_life)); ++ ap->rrep_type & RREP_REPAIR ? "[R]" : "", ++ ap->rrep_type & RREP_ACK ? "[A] " : " ", ++ ap->rrep_ps & RREP_PREFIX_MASK, ++ ap->rrep_hops, ++ ip6addr_string(&ap->rrep_da), ++ (unsigned long)EXTRACT_32BITS(&ap->rrep_ds), ++ ip6addr_string(&ap->rrep_oa), ++ (unsigned long)EXTRACT_32BITS(&ap->rrep_life)); ++ + if (i >= sizeof(struct aodv_ext)) +- aodv_extension((void *)(&ap->rrep6_draft_01 + 1), i); ++ aodv_extension((void *)(ap + 1), i); + #else + printf(" rrep %u", length); + #endif +@@ -362,28 +373,36 @@ aodv_v6_draft_01_rrep(const union aodv *ap _U_, const u_char *dat _U_, + + static void + #ifdef INET6 +-aodv_v6_draft_01_rerr(const union aodv *ap, u_int length) ++aodv_v6_draft_01_rerr(const struct aodv_rerr *ap, const u_char *dat, u_int length) + #else +-aodv_v6_draft_01_rerr(const union aodv *ap _U_, u_int length) ++aodv_v6_draft_01_rerr(const struct aodv_rerr *ap _U_, const u_char *dat, u_int length) + #endif + { + #ifdef INET6 +- const struct rerr_unreach6_draft_01 *dp6 = NULL; +- int i, j, n, trunc; ++ u_int i, dc; ++ const struct rerr_unreach6_draft_01 *dp6; ++ ++ if (snapend < dat) { ++ printf(" [|aodv]"); ++ return; ++ } ++ i = min(length, (u_int)(snapend - dat)); ++ if (i < sizeof(*ap)) { ++ printf(" [|rerr]"); ++ return; ++ } ++ i -= sizeof(*ap); + +- i = length - offsetof(struct aodv_rerr, r); +- j = sizeof(ap->rerr.r.dest6_draft_01[0]); +- dp6 = &ap->rerr.r.dest6_draft_01[0]; +- n = ap->rerr.rerr_dc * j; + printf(" rerr %s [items %u] [%u]:", +- ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "", +- ap->rerr.rerr_dc, length); +- trunc = n - (i/j); +- for (; i -= j >= 0; ++dp6) { ++ ap->rerr_flags & RERR_NODELETE ? "[D]" : "", ++ ap->rerr_dc, length); ++ dp6 = (struct rerr_unreach6_draft_01 *)(void *)(ap + 1); ++ for (dc = ap->rerr_dc; dc != 0 && i >= sizeof(*dp6); ++ ++dp6, --dc, i -= sizeof(*dp6)) { + printf(" {%s}(%ld)", ip6addr_string(&dp6->u_da), + (unsigned long)EXTRACT_32BITS(&dp6->u_ds)); + } +- if (trunc) ++ if ((i % sizeof(*dp6)) != 0) + printf("[|rerr]"); + #else + printf(" rerr %u", length); +@@ -393,40 +412,38 @@ aodv_v6_draft_01_rerr(const union aodv *ap _U_, u_int length) + void + aodv_print(const u_char *dat, u_int length, int is_ip6) + { +- const union aodv *ap; ++ uint8_t msg_type; ++ ++ /* ++ * The message type is the first byte; make sure we have it ++ * and then fetch it. ++ */ ++ TCHECK(*dat); ++ msg_type = *dat; + +- ap = (union aodv *)dat; +- if (snapend < dat) { +- printf(" [|aodv]"); +- return; +- } +- if (min(length, (u_int)(snapend - dat)) < sizeof(ap->rrep_ack)) { +- printf(" [|aodv]"); +- return; +- } + printf(" aodv"); + +- switch (ap->rerr.rerr_type) { ++ switch (msg_type) { + + case AODV_RREQ: + if (is_ip6) +- aodv_v6_rreq(ap, dat, length); ++ aodv_v6_rreq((const struct aodv_rreq6 *) dat, dat, length); + else +- aodv_rreq(ap, dat, length); ++ aodv_rreq((const struct aodv_rreq *) dat, dat, length); + break; + + case AODV_RREP: + if (is_ip6) +- aodv_v6_rrep(ap, dat, length); ++ aodv_v6_rrep((const struct aodv_rrep6 *) dat, dat, length); + else +- aodv_rrep(ap, dat, length); ++ aodv_rrep((const struct aodv_rrep *) dat, dat, length); + break; + + case AODV_RERR: + if (is_ip6) +- aodv_v6_rerr(ap, length); ++ aodv_v6_rerr((const struct aodv_rerr *) dat, dat, length); + else +- aodv_rerr(ap, dat, length); ++ aodv_rerr((const struct aodv_rerr *) dat, dat, length); + break; + + case AODV_RREP_ACK: +@@ -434,15 +451,15 @@ aodv_print(const u_char *dat, u_int length, int is_ip6) + break; + + case AODV_V6_DRAFT_01_RREQ: +- aodv_v6_draft_01_rreq(ap, dat, length); ++ aodv_v6_draft_01_rreq((const struct aodv_rreq6_draft_01 *) dat, dat, length); + break; + + case AODV_V6_DRAFT_01_RREP: +- aodv_v6_draft_01_rrep(ap, dat, length); ++ aodv_v6_draft_01_rrep((const struct aodv_rrep6_draft_01 *) dat, dat, length); + break; + + case AODV_V6_DRAFT_01_RERR: +- aodv_v6_draft_01_rerr(ap, length); ++ aodv_v6_draft_01_rerr((const struct aodv_rerr *) dat, dat, length); + break; + + case AODV_V6_DRAFT_01_RREP_ACK: +@@ -450,6 +467,10 @@ aodv_print(const u_char *dat, u_int length, int is_ip6) + break; + + default: +- printf(" %u %u", ap->rreq.rreq_type, length); ++ printf(" %u %u", msg_type, length); + } ++ return; ++ ++trunc: ++ printf(" [|aodv]"); + } +-- +1.8.3.1 + diff --git a/source/network-extra/tcpdump/FrugalBuild b/source/network-extra/tcpdump/FrugalBuild index 1257aee..38db564 100644 --- a/source/network-extra/tcpdump/FrugalBuild +++ b/source/network-extra/tcpdump/FrugalBuild @@ -6,7 +6,7 @@ options+=('asneeded') pkgname=tcpdump pkgver=4.5.1 -pkgrel=1 +pkgrel=2 pkgdesc="Tcpdump is for dumping traffic on a network" url="http://www.tcpdump.org" depends=('openssl' 'libpcap>=1.2.0') @@ -16,4 +16,12 @@ source=($url/release/$pkgname-$pkgver.tar.gz) up2date="lynx -dump $url/release/|grep 'tcpdump-\(.*\).tar.gz'|Flasttar" Fconfopts+=" --enable-ipv6" sha1sums=('46d5ec107c6a1b262ad8da799f74c5d01cce8815') + +# FSA fix *** +source=(${source[@]} CVE-2014-8767.patch CVE-2014-8768.patch CVE-2014-8769.patch) +sha1sums=(${sha1sums[@]} '30dd3775306db5c2c6aca958997e37ec002cfe32' \ + 'cc27d8dc1967013ed33cd49e6a83da2cc0f9b6d1' \ + 'c0ce0f81c300fd3f94f014d9eb9b52528d374e67') +# *********** + # optimization OK _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
