diff options
author | Gerald Combs <gerald@wireshark.org> | 2021-10-26 09:57:23 -0700 |
---|---|---|
committer | Wireshark GitLab Utility <gerald+gitlab-utility@wireshark.org> | 2021-10-26 17:34:29 +0000 |
commit | f21b94476e08086fb58e8a2d5a0a785fc5f732bf (patch) | |
tree | c975b06140175f2944a30a41e21c1d3b2444e89a | |
parent | 1fbe71fe2bb90ae8f597165bebc386353747718d (diff) | |
download | wireshark-f21b94476e08086fb58e8a2d5a0a785fc5f732bf.tar.gz wireshark-f21b94476e08086fb58e8a2d5a0a785fc5f732bf.tar.bz2 wireshark-f21b94476e08086fb58e8a2d5a0a785fc5f732bf.zip |
PNRP: Exit our main loop.
Make sure our main loop offset advances. Fixes #17684.
(cherry picked from commit 9104a3744e63b54b2cff3152aedeea340976355b)
-rw-r--r-- | epan/dissectors/packet-pnrp.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/epan/dissectors/packet-pnrp.c b/epan/dissectors/packet-pnrp.c index 68db863047..cca1f8afdb 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; |