Package: release.debian.org Severity: normal Tags: buster User: release.debian....@packages.debian.org Usertags: pu
* CVE-2021-22207: Excessive memory consumption in the MS-WSP dissector. (Closes: #987853) * CVE-2021-22235: Crash in the DNP dissector. * CVE-2021-39921: NULL pointer exception in the Modbus dissector. * CVE-2021-39922: Buffer overflow in the C12.22 dissector. * CVE-2021-39923: Large loop in the PNRP dissector. * CVE-2021-39924: Large loop in the Bluetooth DHT dissector. * CVE-2021-39928: NULL pointer exception in the IEEE 802.11 dissector. * CVE-2021-39929: Uncontrolled Recursion in the Bluetooth DHT dissector.
diff -Nru wireshark-2.6.20/debian/changelog wireshark-2.6.20/debian/changelog --- wireshark-2.6.20/debian/changelog 2021-12-09 15:35:23.000000000 +0200 +++ wireshark-2.6.20/debian/changelog 2022-01-16 14:46:43.000000000 +0200 @@ -1,3 +1,18 @@ +wireshark (2.6.20-0+deb10u3) buster; urgency=medium + + * Non-maintainer upload. + * CVE-2021-22207: Excessive memory consumption in the MS-WSP dissector. + (Closes: #987853) + * CVE-2021-22235: Crash in the DNP dissector. + * CVE-2021-39921: NULL pointer exception in the Modbus dissector. + * CVE-2021-39922: Buffer overflow in the C12.22 dissector. + * CVE-2021-39923: Large loop in the PNRP dissector. + * CVE-2021-39924: Large loop in the Bluetooth DHT dissector. + * CVE-2021-39928: NULL pointer exception in the IEEE 802.11 dissector. + * CVE-2021-39929: Uncontrolled Recursion in the Bluetooth DHT dissector. + + -- Adrian Bunk <b...@debian.org> Sun, 16 Jan 2022 14:46:43 +0200 + wireshark (2.6.20-0+deb10u2) buster-security; urgency=medium * debian/watch: Get upstream releases from gitlab diff -Nru wireshark-2.6.20/debian/patches/0001-MS-WSP-Don-t-allocate-huge-amounts-of-memory.patch wireshark-2.6.20/debian/patches/0001-MS-WSP-Don-t-allocate-huge-amounts-of-memory.patch --- wireshark-2.6.20/debian/patches/0001-MS-WSP-Don-t-allocate-huge-amounts-of-memory.patch 1970-01-01 02:00:00.000000000 +0200 +++ wireshark-2.6.20/debian/patches/0001-MS-WSP-Don-t-allocate-huge-amounts-of-memory.patch 2022-01-16 14:46:43.000000000 +0200 @@ -0,0 +1,70 @@ +From 8747a91cccb52f916a20e1d772dd58751a87ad0e Mon Sep 17 00:00:00 2001 +From: Gerald Combs <ger...@wireshark.org> +Date: Mon, 19 Apr 2021 10:39:01 -0700 +Subject: MS-WSP: Don't allocate huge amounts of memory. + +Add a couple of memory allocation sanity checks, one of which +fixes #17331. +--- + epan/dissectors/packet-mswsp.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/epan/dissectors/packet-mswsp.c b/epan/dissectors/packet-mswsp.c +index 295192a0ab..e6600e06b4 100644 +--- a/epan/dissectors/packet-mswsp.c ++++ b/epan/dissectors/packet-mswsp.c +@@ -313,8 +313,10 @@ struct CTableColumn { + guint16 lengthoffset; + char name[PROP_LENGTH]; + }; +-/* minimum size in bytes on the wire CTableColumn can be */ ++/* Minimum size in bytes on the wire CTableColumn can be */ + #define MIN_CTABLECOL_SIZE 32 ++/* Maximum sane size in bytes on the wire CTableColumn can be. Arbitrary. */ ++#define MAX_CTABLECOL_SIZE 5000 + + /* 2.2.3.10 */ + +@@ -3970,6 +3972,8 @@ static int vvalue_tvb_lpwstr(tvbuff_t *tvb, int offset, void *val) + return 4 + vvalue_tvb_lpwstr_len(tvb, offset + 4, 0, val); + } + ++/* Maximum sane vector size. Arbitrary. */ ++#define MAX_VT_VECTOR_SIZE 5000 + static int vvalue_tvb_vector_internal(tvbuff_t *tvb, int offset, struct vt_vector *val, struct vtype_data *type, guint num) + { + const int offset_in = offset; +@@ -3984,18 +3988,14 @@ static int vvalue_tvb_vector_internal(tvbuff_t *tvb, int offset, struct vt_vecto + * here, before making a possibly-doomed attempt to allocate + * memory for it. + * +- * First, check for an overflow. ++ * First, check for sane values. + */ +- if ((guint64)elsize * (guint64)num > G_MAXUINT) { +- /* +- * We never have more than G_MAXUINT bytes in a tvbuff, +- * so this will *definitely* fail. +- */ ++ if (num > MAX_VT_VECTOR_SIZE) { + THROW(ReportedBoundsError); + } + + /* +- * No overflow; now make sure we at least have that data. ++ * No huge numbers from the wire; now make sure we at least have that data. + */ + tvb_ensure_bytes_exist(tvb, offset, elsize * num); + +@@ -5851,7 +5851,7 @@ static int dissect_CPMSetBindings(tvbuff_t *tvb, packet_info *pinfo, proto_tree + + /* Sanity check size value */ + column_size = num*MIN_CTABLECOL_SIZE; +- if (column_size > tvb_reported_length_remaining(tvb, offset)) ++ if (num > MAX_CTABLECOL_SIZE || column_size > tvb_reported_length_remaining(tvb, offset)) + { + expert_add_info(pinfo, ti, &ei_mswsp_msg_cpmsetbinding_ccolumns); + return tvb_reported_length(tvb); +-- +2.20.1 + diff -Nru wireshark-2.6.20/debian/patches/0002-dnp-plug-a-memory-leak.patch wireshark-2.6.20/debian/patches/0002-dnp-plug-a-memory-leak.patch --- wireshark-2.6.20/debian/patches/0002-dnp-plug-a-memory-leak.patch 1970-01-01 02:00:00.000000000 +0200 +++ wireshark-2.6.20/debian/patches/0002-dnp-plug-a-memory-leak.patch 2022-01-16 14:46:43.000000000 +0200 @@ -0,0 +1,26 @@ +From ab0c151cfea07dfd3944802b013eee8a33c12798 Mon Sep 17 00:00:00 2001 +From: Guy Harris <ghar...@sonic.net> +Date: Sun, 23 May 2021 13:55:48 -0700 +Subject: dnp: plug a memory leak. + +If we're throwing away the data, *throw away the data* - free it, as +we're not using it as the backing data for a tvbuff. +--- + epan/dissectors/packet-dnp.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/epan/dissectors/packet-dnp.c b/epan/dissectors/packet-dnp.c +index d3c418168b..b517fb376c 100644 +--- a/epan/dissectors/packet-dnp.c ++++ b/epan/dissectors/packet-dnp.c +@@ -3428,6 +3428,7 @@ dissect_dnp3_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* + else + { + /* CRC error - throw away the data. */ ++ g_free(al_buffer); + next_tvb = NULL; + } + } +-- +2.20.1 + diff -Nru wireshark-2.6.20/debian/patches/0003-DNP-use-the-proper-free-function.patch wireshark-2.6.20/debian/patches/0003-DNP-use-the-proper-free-function.patch --- wireshark-2.6.20/debian/patches/0003-DNP-use-the-proper-free-function.patch 1970-01-01 02:00:00.000000000 +0200 +++ wireshark-2.6.20/debian/patches/0003-DNP-use-the-proper-free-function.patch 2022-01-16 14:46:43.000000000 +0200 @@ -0,0 +1,30 @@ +From b47a073499d51942364f1be853c9be9526916599 Mon Sep 17 00:00:00 2001 +From: Pascal Quantin <pas...@wireshark.org> +Date: Sat, 26 Jun 2021 10:31:59 +0200 +Subject: DNP: use the proper free function + +g618661b22e introduced a free for a so called memory leak (which wasn't +a real leak due to the pinfo->pool garbage collector) but used the wrong +free function. Let's keep the explicit free but use the right function. + +Closes #17462 +--- + epan/dissectors/packet-dnp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/epan/dissectors/packet-dnp.c b/epan/dissectors/packet-dnp.c +index b517fb376c..f2112f39d8 100644 +--- a/epan/dissectors/packet-dnp.c ++++ b/epan/dissectors/packet-dnp.c +@@ -3428,7 +3428,7 @@ dissect_dnp3_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* + else + { + /* CRC error - throw away the data. */ +- g_free(al_buffer); ++ wmem_free(pinfo->pool, al_buffer); + next_tvb = NULL; + } + } +-- +2.20.1 + diff -Nru wireshark-2.6.20/debian/patches/0004-Modbus-Add-null-pointer-checks.patch wireshark-2.6.20/debian/patches/0004-Modbus-Add-null-pointer-checks.patch --- wireshark-2.6.20/debian/patches/0004-Modbus-Add-null-pointer-checks.patch 1970-01-01 02:00:00.000000000 +0200 +++ wireshark-2.6.20/debian/patches/0004-Modbus-Add-null-pointer-checks.patch 2022-01-16 14:46:43.000000000 +0200 @@ -0,0 +1,39 @@ +From 6ed9d2068d054304d8f88851a7c906412f33a217 Mon Sep 17 00:00:00 2001 +From: Gerald Combs <ger...@wireshark.org> +Date: Mon, 1 Nov 2021 11:12:56 -0700 +Subject: Modbus: Add null pointer checks. + +Fixes #17703. +--- + epan/dissectors/packet-mbtcp.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/epan/dissectors/packet-mbtcp.c b/epan/dissectors/packet-mbtcp.c +index c142fecb3b..eca5243b3f 100644 +--- a/epan/dissectors/packet-mbtcp.c ++++ b/epan/dissectors/packet-mbtcp.c +@@ -1026,6 +1026,10 @@ dissect_modbus_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *modbus_tre + guint16 reg_base=0, diagnostic_code; + guint32 group_byte_cnt, group_word_cnt; + ++ if (!pkt_info) { ++ return 0; ++ } ++ + switch (function_code) { + + case READ_COILS: +@@ -1209,6 +1213,10 @@ dissect_modbus_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *modbus_tr + + proto_item *request_frame_item; + ++ if (!pkt_info) { ++ return 0; ++ } ++ + if (pkt_info->request_found == TRUE) { + request_frame_item = proto_tree_add_uint(modbus_tree, hf_modbus_request_frame, tvb, 0, 0, pkt_info->req_frame_num); + PROTO_ITEM_SET_GENERATED(request_frame_item); +-- +2.20.1 + diff -Nru wireshark-2.6.20/debian/patches/0005-C12.22-Track-our-allocation-sizes.patch wireshark-2.6.20/debian/patches/0005-C12.22-Track-our-allocation-sizes.patch --- wireshark-2.6.20/debian/patches/0005-C12.22-Track-our-allocation-sizes.patch 1970-01-01 02:00:00.000000000 +0200 +++ wireshark-2.6.20/debian/patches/0005-C12.22-Track-our-allocation-sizes.patch 2022-01-16 14:46:43.000000000 +0200 @@ -0,0 +1,288 @@ +From 992469ecbf1b8b4e86431fa77cc56813b60522d3 Mon Sep 17 00:00:00 2001 +From: Gerald Combs <ger...@wireshark.org> +Date: Tue, 26 Oct 2021 18:15:50 -0700 +Subject: C12.22: Track our allocation sizes. + +Add an allocated size element to the TOP_ELEMENT_CONTROL struct and use +it to make sure we're not trying to read past the end of a buffer in +canonify_unencrypted_header. Fixes #17636. +--- + .../asn1/c1222/packet-c1222-template.c | 55 +++++++++++----- + epan/dissectors/packet-c1222.c | 63 +++++++++++++------ + 2 files changed, 84 insertions(+), 34 deletions(-) + +diff --git a/epan/dissectors/asn1/c1222/packet-c1222-template.c b/epan/dissectors/asn1/c1222/packet-c1222-template.c +index 795ab84ea6..81001b1d1d 100644 +--- a/epan/dissectors/asn1/c1222/packet-c1222-template.c ++++ b/epan/dissectors/asn1/c1222/packet-c1222-template.c +@@ -160,6 +160,19 @@ static guint32 calling_AP_title_len = 0; + static guint32 key_id_element_len = 0; + static guint32 iv_element_len = 0; + ++/* these are the related allocation sizes (which might be different from the lengths) */ ++static guint32 aSO_context_allocated = 0; ++static guint32 called_AP_title_allocated = 0; ++static guint32 called_AP_invocation_id_allocated = 0; ++static guint32 calling_AE_qualifier_allocated = 0; ++static guint32 calling_AP_invocation_id_allocated = 0; ++static guint32 mechanism_name_allocated = 0; ++static guint32 calling_authentication_value_allocated = 0; ++static guint32 user_information_allocated = 0; ++static guint32 calling_AP_title_allocated = 0; ++static guint32 key_id_element_allocated = 0; ++static guint32 iv_element_allocated = 0; ++ + #include "packet-c1222-ett.c" + + static expert_field ei_c1222_command_truncated = EI_INIT; +@@ -282,11 +295,13 @@ static uat_t *c1222_uat; + #define FILL_TABLE(fieldname) \ + length = offset - start_offset; \ + fieldname = (guint8 *)tvb_memdup(wmem_packet_scope(), tvb, start_offset, length); \ +- fieldname##_len = length; ++ fieldname##_len = length; \ ++ fieldname##_allocated = length; + #define FILL_TABLE_TRUNCATE(fieldname, len) \ + length = 1 + 2*(offset - start_offset); \ + fieldname = (guint8 *)tvb_memdup(wmem_packet_scope(), tvb, start_offset, length); \ +- fieldname##_len = len; ++ fieldname##_len = len; \ ++ fieldname##_allocated = length; + #define FILL_TABLE_APTITLE(fieldname) \ + length = offset - start_offset; \ + switch (tvb_get_guint8(tvb, start_offset)) { \ +@@ -294,6 +309,7 @@ static uat_t *c1222_uat; + tvb_ensure_bytes_exist(tvb, start_offset, length); \ + fieldname##_len = length + c1222_baseoid_len; \ + fieldname = (guint8 *)wmem_alloc(wmem_packet_scope(), fieldname##_len); \ ++ fieldname##_allocated = fieldname##_len; \ + fieldname[0] = 0x06; /* create absolute OID tag */ \ + fieldname[1] = (fieldname##_len - 2) & 0xff; \ + memcpy(&(fieldname[2]), c1222_baseoid, c1222_baseoid_len); \ +@@ -303,6 +319,7 @@ static uat_t *c1222_uat; + default: \ + fieldname = (guint8 *)tvb_memdup(wmem_packet_scope(), tvb, start_offset, length); \ + fieldname##_len = length; \ ++ fieldname##_allocated = length; \ + break; \ + } + +@@ -616,21 +633,23 @@ typedef struct tagTOP_ELEMENT_CONTROL + guint8 **element; + /* pointer to element length */ + guint32 *length; ++ /* pointer to element allocated size */ ++ guint32 *allocated; + } TOP_ELEMENT_CONTROL; + + static const TOP_ELEMENT_CONTROL canonifyTable[] = { +- { FALSE, FALSE, 0xA1, TRUE, &aSO_context, &aSO_context_len }, +- { TRUE , FALSE, 0xA2, TRUE, &called_AP_title, &called_AP_title_len }, +- { FALSE, FALSE, 0xA4, TRUE, &called_AP_invocation_id, &called_AP_invocation_id_len }, +- { FALSE, FALSE, 0xA7, TRUE, &calling_AE_qualifier, &calling_AE_qualifier_len }, +- { TRUE, FALSE, 0xA8, TRUE, &calling_AP_invocation_id, &calling_AP_invocation_id_len }, +- { FALSE, FALSE, 0x8B, TRUE, &mechanism_name, &mechanism_name_len }, +- { FALSE, FALSE, 0xAC, TRUE, &calling_authentication_value, &calling_authentication_value_len }, +- { TRUE , TRUE , 0xBE, TRUE, &user_information, &user_information_len }, +- { FALSE, FALSE, 0xA6, TRUE, &calling_AP_title, &calling_AP_title_len }, +- { FALSE, FALSE, 0xAC, FALSE, &key_id_element, &key_id_element_len }, +- { FALSE, FALSE, 0xAC, FALSE, &iv_element, &iv_element_len }, +- { FALSE, FALSE, 0x0, TRUE, NULL, NULL } ++ { FALSE, FALSE, 0xA1, TRUE, &aSO_context, &aSO_context_len, &aSO_context_allocated }, ++ { TRUE , FALSE, 0xA2, TRUE, &called_AP_title, &called_AP_title_len, &called_AP_title_allocated }, ++ { FALSE, FALSE, 0xA4, TRUE, &called_AP_invocation_id, &called_AP_invocation_id_len, &called_AP_invocation_id_allocated }, ++ { FALSE, FALSE, 0xA7, TRUE, &calling_AE_qualifier, &calling_AE_qualifier_len, &calling_AE_qualifier_allocated }, ++ { TRUE, FALSE, 0xA8, TRUE, &calling_AP_invocation_id, &calling_AP_invocation_id_len, &calling_AP_invocation_id_allocated }, ++ { FALSE, FALSE, 0x8B, TRUE, &mechanism_name, &mechanism_name_len, &mechanism_name_allocated }, ++ { FALSE, FALSE, 0xAC, TRUE, &calling_authentication_value, &calling_authentication_value_len, &calling_authentication_value_allocated }, ++ { TRUE , TRUE , 0xBE, TRUE, &user_information, &user_information_len, &user_information_allocated }, ++ { FALSE, FALSE, 0xA6, TRUE, &calling_AP_title, &calling_AP_title_len, &calling_AP_title_allocated }, ++ { FALSE, FALSE, 0xAC, FALSE, &key_id_element, &key_id_element_len, &key_id_element_allocated }, ++ { FALSE, FALSE, 0xAC, FALSE, &iv_element, &iv_element_len, &iv_element_allocated }, ++ { FALSE, FALSE, 0x0, TRUE, NULL, NULL, NULL } + }; + + static void +@@ -720,11 +739,12 @@ static gboolean + canonify_unencrypted_header(guchar *buff, guint32 *offset, guint32 buffsize) + { + const TOP_ELEMENT_CONTROL *t = canonifyTable; +- guint32 len; ++ guint32 len, allocated; + + for (t = canonifyTable; t->element != NULL; t++) + { + len = *(t->length); ++ allocated = *(t->allocated); + if (t->required && *(t->element) == NULL) + return FALSE; + if (*(t->element) != NULL) { +@@ -741,6 +761,11 @@ canonify_unencrypted_header(guchar *buff, guint32 *offset, guint32 buffsize) + if (buffsize < *offset + len) { + return FALSE; + } ++ /* bail out if our we're trying to read past the end of our element */ ++ /* the network is always hostile */ ++ if (allocated < len) { ++ return FALSE; ++ } + memcpy(&buff[*offset], *(t->element), len); + (*offset) += len; + if (t->addtag) { +diff --git a/epan/dissectors/packet-c1222.c b/epan/dissectors/packet-c1222.c +index b7213dfdcd..d7f3953da7 100644 +--- a/epan/dissectors/packet-c1222.c ++++ b/epan/dissectors/packet-c1222.c +@@ -198,6 +198,19 @@ static guint32 calling_AP_title_len = 0; + static guint32 key_id_element_len = 0; + static guint32 iv_element_len = 0; + ++/* these are the related allocation sizes (which might be different from the lengths) */ ++static guint32 aSO_context_allocated = 0; ++static guint32 called_AP_title_allocated = 0; ++static guint32 called_AP_invocation_id_allocated = 0; ++static guint32 calling_AE_qualifier_allocated = 0; ++static guint32 calling_AP_invocation_id_allocated = 0; ++static guint32 mechanism_name_allocated = 0; ++static guint32 calling_authentication_value_allocated = 0; ++static guint32 user_information_allocated = 0; ++static guint32 calling_AP_title_allocated = 0; ++static guint32 key_id_element_allocated = 0; ++static guint32 iv_element_allocated = 0; ++ + + /*--- Included file: packet-c1222-ett.c ---*/ + #line 1 "./asn1/c1222/packet-c1222-ett.c" +@@ -211,7 +224,7 @@ static gint ett_c1222_Calling_authentication_value_c1222_U = -1; + static gint ett_c1222_Calling_authentication_value_c1221_U = -1; + + /*--- End of included file: packet-c1222-ett.c ---*/ +-#line 164 "./asn1/c1222/packet-c1222-template.c" ++#line 177 "./asn1/c1222/packet-c1222-template.c" + + static expert_field ei_c1222_command_truncated = EI_INIT; + static expert_field ei_c1222_bad_checksum = EI_INIT; +@@ -333,11 +346,13 @@ static uat_t *c1222_uat; + #define FILL_TABLE(fieldname) \ + length = offset - start_offset; \ + fieldname = (guint8 *)tvb_memdup(wmem_packet_scope(), tvb, start_offset, length); \ +- fieldname##_len = length; ++ fieldname##_len = length; \ ++ fieldname##_allocated = length; + #define FILL_TABLE_TRUNCATE(fieldname, len) \ + length = 1 + 2*(offset - start_offset); \ + fieldname = (guint8 *)tvb_memdup(wmem_packet_scope(), tvb, start_offset, length); \ +- fieldname##_len = len; ++ fieldname##_len = len; \ ++ fieldname##_allocated = length; + #define FILL_TABLE_APTITLE(fieldname) \ + length = offset - start_offset; \ + switch (tvb_get_guint8(tvb, start_offset)) { \ +@@ -345,6 +360,7 @@ static uat_t *c1222_uat; + tvb_ensure_bytes_exist(tvb, start_offset, length); \ + fieldname##_len = length + c1222_baseoid_len; \ + fieldname = (guint8 *)wmem_alloc(wmem_packet_scope(), fieldname##_len); \ ++ fieldname##_allocated = fieldname##_len; \ + fieldname[0] = 0x06; /* create absolute OID tag */ \ + fieldname[1] = (fieldname##_len - 2) & 0xff; \ + memcpy(&(fieldname[2]), c1222_baseoid, c1222_baseoid_len); \ +@@ -354,6 +370,7 @@ static uat_t *c1222_uat; + default: \ + fieldname = (guint8 *)tvb_memdup(wmem_packet_scope(), tvb, start_offset, length); \ + fieldname##_len = length; \ ++ fieldname##_allocated = length; \ + break; \ + } + +@@ -667,21 +684,23 @@ typedef struct tagTOP_ELEMENT_CONTROL + guint8 **element; + /* pointer to element length */ + guint32 *length; ++ /* pointer to element allocated size */ ++ guint32 *allocated; + } TOP_ELEMENT_CONTROL; + + static const TOP_ELEMENT_CONTROL canonifyTable[] = { +- { FALSE, FALSE, 0xA1, TRUE, &aSO_context, &aSO_context_len }, +- { TRUE , FALSE, 0xA2, TRUE, &called_AP_title, &called_AP_title_len }, +- { FALSE, FALSE, 0xA4, TRUE, &called_AP_invocation_id, &called_AP_invocation_id_len }, +- { FALSE, FALSE, 0xA7, TRUE, &calling_AE_qualifier, &calling_AE_qualifier_len }, +- { TRUE, FALSE, 0xA8, TRUE, &calling_AP_invocation_id, &calling_AP_invocation_id_len }, +- { FALSE, FALSE, 0x8B, TRUE, &mechanism_name, &mechanism_name_len }, +- { FALSE, FALSE, 0xAC, TRUE, &calling_authentication_value, &calling_authentication_value_len }, +- { TRUE , TRUE , 0xBE, TRUE, &user_information, &user_information_len }, +- { FALSE, FALSE, 0xA6, TRUE, &calling_AP_title, &calling_AP_title_len }, +- { FALSE, FALSE, 0xAC, FALSE, &key_id_element, &key_id_element_len }, +- { FALSE, FALSE, 0xAC, FALSE, &iv_element, &iv_element_len }, +- { FALSE, FALSE, 0x0, TRUE, NULL, NULL } ++ { FALSE, FALSE, 0xA1, TRUE, &aSO_context, &aSO_context_len, &aSO_context_allocated }, ++ { TRUE , FALSE, 0xA2, TRUE, &called_AP_title, &called_AP_title_len, &called_AP_title_allocated }, ++ { FALSE, FALSE, 0xA4, TRUE, &called_AP_invocation_id, &called_AP_invocation_id_len, &called_AP_invocation_id_allocated }, ++ { FALSE, FALSE, 0xA7, TRUE, &calling_AE_qualifier, &calling_AE_qualifier_len, &calling_AE_qualifier_allocated }, ++ { TRUE, FALSE, 0xA8, TRUE, &calling_AP_invocation_id, &calling_AP_invocation_id_len, &calling_AP_invocation_id_allocated }, ++ { FALSE, FALSE, 0x8B, TRUE, &mechanism_name, &mechanism_name_len, &mechanism_name_allocated }, ++ { FALSE, FALSE, 0xAC, TRUE, &calling_authentication_value, &calling_authentication_value_len, &calling_authentication_value_allocated }, ++ { TRUE , TRUE , 0xBE, TRUE, &user_information, &user_information_len, &user_information_allocated }, ++ { FALSE, FALSE, 0xA6, TRUE, &calling_AP_title, &calling_AP_title_len, &calling_AP_title_allocated }, ++ { FALSE, FALSE, 0xAC, FALSE, &key_id_element, &key_id_element_len, &key_id_element_allocated }, ++ { FALSE, FALSE, 0xAC, FALSE, &iv_element, &iv_element_len, &iv_element_allocated }, ++ { FALSE, FALSE, 0x0, TRUE, NULL, NULL, NULL } + }; + + static void +@@ -771,11 +790,12 @@ static gboolean + canonify_unencrypted_header(guchar *buff, guint32 *offset, guint32 buffsize) + { + const TOP_ELEMENT_CONTROL *t = canonifyTable; +- guint32 len; ++ guint32 len, allocated; + + for (t = canonifyTable; t->element != NULL; t++) + { + len = *(t->length); ++ allocated = *(t->allocated); + if (t->required && *(t->element) == NULL) + return FALSE; + if (*(t->element) != NULL) { +@@ -792,6 +812,11 @@ canonify_unencrypted_header(guchar *buff, guint32 *offset, guint32 buffsize) + if (buffsize < *offset + len) { + return FALSE; + } ++ /* bail out if our we're trying to read past the end of our element */ ++ /* the network is always hostile */ ++ if (allocated < len) { ++ return FALSE; ++ } + memcpy(&buff[*offset], *(t->element), len); + (*offset) += len; + if (t->addtag) { +@@ -1520,7 +1545,7 @@ static int dissect_MESSAGE_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_ + + + /*--- End of included file: packet-c1222-fn.c ---*/ +-#line 1004 "./asn1/c1222/packet-c1222-template.c" ++#line 1029 "./asn1/c1222/packet-c1222-template.c" + + /** + * Dissects a a full (reassembled) C12.22 message. +@@ -1912,7 +1937,7 @@ void proto_register_c1222(void) { + "OCTET_STRING_SIZE_CONSTR002", HFILL }}, + + /*--- End of included file: packet-c1222-hfarr.c ---*/ +-#line 1291 "./asn1/c1222/packet-c1222-template.c" ++#line 1316 "./asn1/c1222/packet-c1222-template.c" + }; + + /* List of subtrees */ +@@ -1935,7 +1960,7 @@ void proto_register_c1222(void) { + &ett_c1222_Calling_authentication_value_c1221_U, + + /*--- End of included file: packet-c1222-ettarr.c ---*/ +-#line 1301 "./asn1/c1222/packet-c1222-template.c" ++#line 1326 "./asn1/c1222/packet-c1222-template.c" + }; + + static ei_register_info ei[] = { +-- +2.20.1 + diff -Nru wireshark-2.6.20/debian/patches/0006-PNRP-Exit-our-main-loop.patch wireshark-2.6.20/debian/patches/0006-PNRP-Exit-our-main-loop.patch --- wireshark-2.6.20/debian/patches/0006-PNRP-Exit-our-main-loop.patch 1970-01-01 02:00:00.000000000 +0200 +++ wireshark-2.6.20/debian/patches/0006-PNRP-Exit-our-main-loop.patch 2022-01-16 14:46:43.000000000 +0200 @@ -0,0 +1,66 @@ +From f61c6c711fcaf7af5c1d843ec4bba1749e857d89 Mon Sep 17 00:00:00 2001 +From: Gerald Combs <ger...@wireshark.org> +Date: Tue, 26 Oct 2021 09:57:23 -0700 +Subject: PNRP: Exit our main loop. + +Make sure our main loop offset advances. Fixes #17684. +--- + epan/dissectors/packet-pnrp.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/epan/dissectors/packet-pnrp.c b/epan/dissectors/packet-pnrp.c +index 56a274eedb..c9da1e02f1 100644 +--- a/epan/dissectors/packet-pnrp.c ++++ b/epan/dissectors/packet-pnrp.c +@@ -21,6 +21,7 @@ + #include "config.h" + + #include <epan/packet.h> ++#include <epan/exceptions.h> + #include <epan/reassemble.h> + + #define PROTONAME "Peer Name Resolution Protocol" +@@ -388,11 +389,11 @@ static const fragment_items pnrp_frag_items = { + static int dissect_pnrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) + { + /* Variable declaration */ +- gint offset; ++ int offset, start_offset; + gint padding_bytes; + guint8 message_type; + guint16 field_type; +- guint16 data_length; ++ unsigned data_length; + proto_item *ti; + proto_tree *pnrp_tree; + proto_item *pnrp_header_item; +@@ -484,6 +485,7 @@ static int dissect_pnrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi + *------------------------------*/ + + /* The following part has dynamic length depending on message type */ ++ start_offset = offset; + while (tvb_reported_length_remaining(tvb, offset) > 0) { + /* Determine the Field Type */ + field_type = tvb_get_ntohs(tvb,offset ); +@@ -568,7 +570,6 @@ static int dissect_pnrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi + } + break; + +- + default: + proto_tree_add_item(pnrp_message_tree, hf_pnrp_message_flags, tvb, offset + 4, data_length -4, ENC_BIG_ENDIAN); + offset += data_length; +@@ -869,6 +870,10 @@ static int dissect_pnrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi + offset += data_length; + break; + } ++ // SPLIT_CONTROLS might reset our offset. ++ if (start_offset <= offset) { ++ THROW(ReportedBoundsError); ++ } + } + return offset; + +-- +2.20.1 + diff -Nru wireshark-2.6.20/debian/patches/0007-BT-DHT-Fix-another-loop-and-add-NULL-checks.patch wireshark-2.6.20/debian/patches/0007-BT-DHT-Fix-another-loop-and-add-NULL-checks.patch --- wireshark-2.6.20/debian/patches/0007-BT-DHT-Fix-another-loop-and-add-NULL-checks.patch 1970-01-01 02:00:00.000000000 +0200 +++ wireshark-2.6.20/debian/patches/0007-BT-DHT-Fix-another-loop-and-add-NULL-checks.patch 2022-01-16 14:46:43.000000000 +0200 @@ -0,0 +1,63 @@ +From 3f4d95b877f67cfc9ae29d992d4d817a0b2b131b Mon Sep 17 00:00:00 2001 +From: Gerald Combs <ger...@wireshark.org> +Date: Mon, 25 Oct 2021 18:29:08 -0700 +Subject: BT-DHT: Fix another loop and add NULL checks. + +Make sure dissect_bt_dht_values even when we have a zero-length string. +Add a couple of NULL checks. Fixes #17677. +--- + epan/dissectors/packet-bt-dht.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +diff --git a/epan/dissectors/packet-bt-dht.c b/epan/dissectors/packet-bt-dht.c +index 78ee7261e8..5c308f91f0 100644 +--- a/epan/dissectors/packet-bt-dht.c ++++ b/epan/dissectors/packet-bt-dht.c +@@ -55,6 +55,7 @@ static int hf_port = -1; + static int hf_truncated_data = -1; + + static expert_field ei_int_string = EI_INIT; ++static expert_field ei_invalid_len = EI_INIT; + + /* tree types */ + static gint ett_bt_dht = -1; +@@ -264,6 +265,13 @@ dissect_bt_dht_values(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint + { + string_len = bencoded_string_length(tvb, &offset); + ++ if (string_len == 0) ++ { ++ expert_add_info(pinfo, ti, &ei_invalid_len); ++ // Fail hard here rather than potentially looping excessively. ++ return tvb_reported_length_remaining(tvb, offset); ++ } ++ + /* 4 bytes ip, 2 bytes port */ + for( ; string_len>=6; string_len-=6, offset+=6 ) + { +@@ -460,9 +468,9 @@ dissect_bencoded_dict_entry(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + return 0; + } + +- if( strlen(key)==1 ) ++ if(key && strlen(key)==1 ) + key = val_to_str_const( key[0], short_key_name_value_string, key ); +- if( strlen(val)==1 ) ++ if(val && strlen(val)==1 ) + val = val_to_str_const( val[0], short_val_name_value_string, val ); + + proto_item_set_text( ti, "%s: %s", key, val ); +@@ -622,7 +630,9 @@ proto_register_bt_dht(void) + + static ei_register_info ei[] = { + { &ei_int_string, { "bt-dht.invalid_string", PI_MALFORMED, PI_ERROR, +- "String must contain an integer", EXPFILL }} ++ "String must contain an integer", EXPFILL }}, ++ { &ei_invalid_len, { "bt-dht.invalid_length", PI_MALFORMED, PI_ERROR, ++ "Invalid length", EXPFILL }}, + }; + + /* Setup protocol subtree array */ +-- +2.20.1 + diff -Nru wireshark-2.6.20/debian/patches/0008-802.11-Radio-Add-null-pointer-checks.patch wireshark-2.6.20/debian/patches/0008-802.11-Radio-Add-null-pointer-checks.patch --- wireshark-2.6.20/debian/patches/0008-802.11-Radio-Add-null-pointer-checks.patch 1970-01-01 02:00:00.000000000 +0200 +++ wireshark-2.6.20/debian/patches/0008-802.11-Radio-Add-null-pointer-checks.patch 2022-01-16 14:46:43.000000000 +0200 @@ -0,0 +1,75 @@ +From ef25de9f6575b43ba34eaac68073471fe446beab Mon Sep 17 00:00:00 2001 +From: Gerald Combs <ger...@wireshark.org> +Date: Mon, 1 Nov 2021 10:57:16 -0700 +Subject: 802.11 Radio: Add null pointer checks. + +Fixes #17704. +--- + epan/dissectors/packet-ieee80211-radio.c | 30 +++++++++++++----------- + 1 file changed, 16 insertions(+), 14 deletions(-) + +diff --git a/epan/dissectors/packet-ieee80211-radio.c b/epan/dissectors/packet-ieee80211-radio.c +index 8b80c5b920..ad81f79a6e 100644 +--- a/epan/dissectors/packet-ieee80211-radio.c ++++ b/epan/dissectors/packet-ieee80211-radio.c +@@ -576,7 +576,7 @@ dissect_wlan_radio_phdr (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, + /* this frame has already been seen, so get its info structure */ + wlan_radio_info = (struct wlan_radio *) p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan_radio, 0); + +- if (wlan_radio_info->aggregate) { ++ if (wlan_radio_info && wlan_radio_info->aggregate) { + phy = wlan_radio_info->aggregate->phy; + phy_info = &wlan_radio_info->aggregate->phy_info; + } +@@ -1042,7 +1042,7 @@ dissect_wlan_radio_phdr (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, + } + + /* data field calculation */ +- if (wlan_radio_info->aggregate) { ++ if (wlan_radio_info && wlan_radio_info->aggregate) { + agg_preamble = preamble; + if (wlan_radio_info->prior_aggregate_data != 0) { + preamble = 0; +@@ -1068,7 +1068,7 @@ dissect_wlan_radio_phdr (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, + } + preamble = 32 + 4 * info_ac->nss[0] * (info_ac->has_stbc ? info_ac->stbc+1 : 1); + +- if (wlan_radio_info->aggregate) { ++ if (wlan_radio_info && wlan_radio_info->aggregate) { + agg_preamble = preamble; + if (wlan_radio_info->prior_aggregate_data != 0) { + preamble = 0; +@@ -1154,17 +1154,19 @@ dissect_wlan_radio_phdr (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, + p_item = proto_tree_add_uint(d_tree, hf_wlan_radio_preamble, tvb, 0, 0, preamble); + PROTO_ITEM_SET_GENERATED(p_item); + } +- if (wlan_radio_info->aggregate) { +- proto_tree *agg_tree; +- +- p_item = proto_tree_add_none_format(d_tree, hf_wlan_radio_aggregate, tvb, 0, 0, +- "This MPDU is part of an A-MPDU"); +- agg_tree = proto_item_add_subtree(item, ett_wlan_radio_aggregate); +- PROTO_ITEM_SET_GENERATED(p_item); +- if (wlan_radio_info->aggregate->duration) { +- proto_item *aitem = proto_tree_add_uint(agg_tree, hf_wlan_radio_aggregate_duration, tvb, 0, 0, +- wlan_radio_info->aggregate->duration); +- PROTO_ITEM_SET_GENERATED(aitem); ++ if (wlan_radio_info) { ++ if (wlan_radio_info->aggregate) { ++ proto_tree *agg_tree; ++ ++ p_item = proto_tree_add_none_format(d_tree, hf_wlan_radio_aggregate, tvb, 0, 0, ++ "This MPDU is part of an A-MPDU"); ++ agg_tree = proto_item_add_subtree(item, ett_wlan_radio_aggregate); ++ PROTO_ITEM_SET_GENERATED(p_item); ++ if (wlan_radio_info->aggregate->duration) { ++ proto_item *aitem = proto_tree_add_uint(agg_tree, hf_wlan_radio_aggregate_duration, tvb, 0, 0, ++ wlan_radio_info->aggregate->duration); ++ PROTO_ITEM_SET_GENERATED(aitem); ++ } + } + } + if (wlan_radio_info->ifs) { +-- +2.20.1 + diff -Nru wireshark-2.6.20/debian/patches/0009-BT-DHT-Exit-a-loop.patch wireshark-2.6.20/debian/patches/0009-BT-DHT-Exit-a-loop.patch --- wireshark-2.6.20/debian/patches/0009-BT-DHT-Exit-a-loop.patch 1970-01-01 02:00:00.000000000 +0200 +++ wireshark-2.6.20/debian/patches/0009-BT-DHT-Exit-a-loop.patch 2022-01-16 14:46:43.000000000 +0200 @@ -0,0 +1,47 @@ +From 1b41369210bb53a0645bf4c4612fac3e3f3e3b0f Mon Sep 17 00:00:00 2001 +From: Gerald Combs <ger...@wireshark.org> +Date: Mon, 11 Oct 2021 13:00:50 -0700 +Subject: BT-DHT: Exit a loop. + +Always make sure our offset advances in dissect_bencoded_list. +Fixes #17651. +--- + epan/dissectors/packet-bt-dht.c | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +diff --git a/epan/dissectors/packet-bt-dht.c b/epan/dissectors/packet-bt-dht.c +index 5c308f91f0..69c38532b2 100644 +--- a/epan/dissectors/packet-bt-dht.c ++++ b/epan/dissectors/packet-bt-dht.c +@@ -182,6 +182,7 @@ dissect_bencoded_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint + offset += 1; + while( (one_byte=tvb_get_guint8(tvb,offset)) != 'e' ) + { ++ guint start_offset = offset; + switch( one_byte ) + { + /* a integer */ +@@ -199,14 +200,14 @@ dissect_bencoded_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint + /* a string */ + default: + offset = dissect_bencoded_string( tvb, pinfo, sub_tree, offset, &result, FALSE, "String" ); +- if (offset == 0) +- { +- proto_tree_add_expert(sub_tree, pinfo, &ei_int_string, tvb, offset, -1); +- /* if offset is not going on, there is no chance to exit the loop, then return*/ +- return 0; +- } + break; + } ++ if (offset <= start_offset) ++ { ++ proto_tree_add_expert(sub_tree, pinfo, &ei_int_string, tvb, offset, -1); ++ /* if offset is not going on, there is no chance to exit the loop, then return*/ ++ return 0; ++ } + } + proto_tree_add_item(sub_tree, hf_bencoded_list_terminator, tvb, offset, 1, ENC_ASCII|ENC_NA); + offset += 1; +-- +2.20.1 + diff -Nru wireshark-2.6.20/debian/patches/series wireshark-2.6.20/debian/patches/series --- wireshark-2.6.20/debian/patches/series 2021-12-09 15:35:23.000000000 +0200 +++ wireshark-2.6.20/debian/patches/series 2022-01-16 14:46:43.000000000 +0200 @@ -10,3 +10,12 @@ 0002-Kafka-Limit-our-decompression-size.patch 0003-Kafka-Decrease-our-maximum-decompression-buffer-size.patch 0004-BT-SDP-Don-t-overrun-our-continuation-state-buffer.patch +0001-MS-WSP-Don-t-allocate-huge-amounts-of-memory.patch +0002-dnp-plug-a-memory-leak.patch +0003-DNP-use-the-proper-free-function.patch +0004-Modbus-Add-null-pointer-checks.patch +0005-C12.22-Track-our-allocation-sizes.patch +0006-PNRP-Exit-our-main-loop.patch +0007-BT-DHT-Fix-another-loop-and-add-NULL-checks.patch +0008-802.11-Radio-Add-null-pointer-checks.patch +0009-BT-DHT-Exit-a-loop.patch