aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-dcom.c
diff options
context:
space:
mode:
authorMartin Kaiser <wireshark@kaiser.cx>2016-01-06 23:00:36 +0100
committerAnders Broman <a.broman58@gmail.com>2016-01-07 11:46:17 +0000
commit0c7eb4a4f4d351aa99adefb798eec90293aac131 (patch)
treeebc7b1ac8d81bc26501e0bf561a59569da79e8d0 /epan/dissectors/packet-dcom.c
parentccdb8be0e9dee49ada24d44c2ee1b454d93bb526 (diff)
[dcom] don't THROW() an exception from a dissector
try to clean up the use of signed vs unsigned data types in dissect_dcom_BSTR without affecting any other function: offsets are gint if we have to add a guint32 to an offset, do a range check before adding if we see an overflow, return the number of bytes consumed up to that point Change-Id: Ib06c19fee8e3477e07b190ca26743891a5b24c3d Reviewed-on: https://code.wireshark.org/review/13082 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-dcom.c')
-rw-r--r--epan/dissectors/packet-dcom.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/epan/dissectors/packet-dcom.c b/epan/dissectors/packet-dcom.c
index 57c15c7ffe..df4b729e49 100644
--- a/epan/dissectors/packet-dcom.c
+++ b/epan/dissectors/packet-dcom.c
@@ -1725,12 +1725,10 @@ dissect_dcom_BSTR(tvbuff_t *tvb, gint offset, packet_info *pinfo,
{
guint32 u32MaxCount;
guint32 u32ArraySize;
- guint32 u32StrStart;
+ gint strStart, subStart, realOffset;
proto_item *sub_item;
proto_tree *sub_tree;
- guint32 u32SubStart;
guint32 u32ByteLength;
- guint32 u32RealOffset;
gboolean isPrintable;
/* alignment of 4 needed */
@@ -1741,7 +1739,7 @@ dissect_dcom_BSTR(tvbuff_t *tvb, gint offset, packet_info *pinfo,
/* add subtree item */
sub_item = proto_tree_add_string(tree, hfindex, tvb, offset, 0, "");
sub_tree = proto_item_add_subtree(sub_item, ett_dcom_lpwstr);
- u32SubStart = offset;
+ subStart = offset;
offset = dissect_dcom_DWORD(tvb, offset, pinfo, sub_tree, di, drep,
hf_dcom_max_count, &u32MaxCount);
@@ -1750,21 +1748,26 @@ dissect_dcom_BSTR(tvbuff_t *tvb, gint offset, packet_info *pinfo,
offset = dissect_dcom_dcerpc_array_size(tvb, offset, pinfo, sub_tree, di, drep,
&u32ArraySize);
- u32RealOffset = offset + u32ArraySize*2;
+ if ((guint32)offset + u32ArraySize*2 > G_MAXINT)
+ return offset;
- u32StrStart = offset;
+ realOffset = offset + u32ArraySize*2;
+
+ strStart = offset;
offset = dcom_tvb_get_nwstringz0(tvb, offset, u32ArraySize*2, pszStr, u32MaxStr, &isPrintable);
- proto_tree_add_string(sub_tree, hfindex, tvb, u32StrStart, offset - u32StrStart, pszStr);
+ proto_tree_add_string(sub_tree, hfindex, tvb, strStart, offset - strStart, pszStr);
/* update subtree header */
proto_item_append_text(sub_item, "%s%s%s",
isPrintable ? "\"" : "", pszStr, isPrintable ? "\"" : "");
- if ((int) (u32RealOffset - u32SubStart) <= 0)
- THROW(ReportedBoundsError);
- proto_item_set_len(sub_item, u32RealOffset - u32SubStart);
+ if (realOffset <= subStart) {
+ /* XXX - expert info */
+ return offset;
+ }
+ proto_item_set_len(sub_item, realOffset - subStart);
- return u32RealOffset;
+ return realOffset;
}