aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-aeron.c
diff options
context:
space:
mode:
authorMartin Kaiser <wireshark@kaiser.cx>2016-01-08 18:28:17 +0100
committerAnders Broman <a.broman58@gmail.com>2016-01-12 11:59:23 +0000
commit8cabf5be59bbc6074ffb4fe22e7c9933ae78db90 (patch)
tree3121ad1be6c2a89eac6dd99079fb57f430451494 /epan/dissectors/packet-aeron.c
parentd203beee3aa008bed765a7672c1da5bd351a808e (diff)
[aeron] don't THROW() an exception from a dissector
in the functions that dissect specific messages, we can just return 0 add a return value to aeron_frame_stream_analysis_setup() and pass it on to the callers to allow for a clean exit Change-Id: Iab4dee38112e32ca36822abc49d27dfe9e4c9ef7 Reviewed-on: https://code.wireshark.org/review/13147 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-aeron.c')
-rw-r--r--epan/dissectors/packet-aeron.c47
1 files changed, 30 insertions, 17 deletions
diff --git a/epan/dissectors/packet-aeron.c b/epan/dissectors/packet-aeron.c
index 33589c18b4..64a64a883a 100644
--- a/epan/dissectors/packet-aeron.c
+++ b/epan/dissectors/packet-aeron.c
@@ -1212,7 +1212,8 @@ static void aeron_frame_nak_analysis_setup(aeron_packet_info_t * info, aeron_fra
finfo->nak_analysis->unrecovered_length = info->nak_length;
}
-static void aeron_frame_stream_analysis_setup(packet_info * pinfo, aeron_packet_info_t * info, aeron_frame_info_t * finfo, aeron_stream_t * stream, aeron_term_t * term, gboolean new_term)
+/* return 0 for success and -1 for error */
+static int aeron_frame_stream_analysis_setup(packet_info * pinfo, aeron_packet_info_t * info, aeron_frame_info_t * finfo, aeron_stream_t * stream, aeron_term_t * term, gboolean new_term)
{
aeron_stream_rcv_t * rcv = NULL;
/* dp is the current data position (from this frame). */
@@ -1257,7 +1258,7 @@ static void aeron_frame_stream_analysis_setup(packet_info * pinfo, aeron_packet_
dp.term_id = info->term_id;
dp.term_offset = info->term_offset;
if (!aeron_pos_add_length(&dp, info->length, stream->term_length))
- THROW(ReportedBoundsError);
+ return -1;
if (pdpv)
{
if (dp.term_id > stream->high.term_id)
@@ -1386,7 +1387,7 @@ static void aeron_frame_stream_analysis_setup(packet_info * pinfo, aeron_packet_
expected_dp.term_id = pdp.term_id;
expected_dp.term_offset = pdp.term_offset;
if (!aeron_pos_add_length(&expected_dp, info->length, stream->term_length))
- THROW(ReportedBoundsError);
+ return -1;
erc = aeron_pos_compare(&expected_dp, &dp);
if (erc > 0)
{
@@ -1444,12 +1445,16 @@ static void aeron_frame_stream_analysis_setup(packet_info * pinfo, aeron_packet_
{
aeron_term_frame_add(term, finfo, frame_flags);
}
+
+ return 0;
}
-static void aeron_frame_info_setup(packet_info * pinfo, aeron_transport_t * transport, aeron_packet_info_t * info, aeron_frame_info_t * finfo)
+/* return 0 for success and -1 for error */
+static int aeron_frame_info_setup(packet_info * pinfo, aeron_transport_t * transport, aeron_packet_info_t * info, aeron_frame_info_t * finfo)
{
if (!transport || !aeron_sequence_analysis || !finfo || PINFO_FD_VISITED(pinfo))
- return;
+ /* XXX - is it an error if transport, aeron_sequence_analysis or finfo are NULL? */
+ return 0;
if ((info->info_flags & AERON_PACKET_INFO_FLAGS_STREAM_ID_VALID) != 0)
{
@@ -1473,7 +1478,8 @@ static void aeron_frame_info_setup(packet_info * pinfo, aeron_transport_t * tran
}
if ((info->info_flags & AERON_PACKET_INFO_FLAGS_TERM_OFFSET_VALID) != 0)
{
- aeron_frame_stream_analysis_setup(pinfo, info, finfo, stream, term, new_term);
+ if (aeron_frame_stream_analysis_setup(pinfo, info, finfo, stream, term, new_term) < 0)
+ return -1;
}
else
{
@@ -1493,6 +1499,8 @@ static void aeron_frame_info_setup(packet_info * pinfo, aeron_transport_t * tran
{
aeron_transport_frame_add(transport, finfo, 0);
}
+
+ return 0;
}
static void aeron_sequence_report_frame(tvbuff_t * tvb, proto_tree * tree, aeron_frame_info_t * finfo)
@@ -2190,7 +2198,7 @@ static int dissect_aeron_pad(tvbuff_t * tvb, int offset, packet_info * pinfo, pr
frame_length = tvb_get_letohl(tvb, offset + O_AERON_PAD_FRAME_LENGTH);
rounded_length = (int) aeron_pos_roundup(frame_length);
if (rounded_length < 0)
- THROW(ReportedBoundsError);
+ return 0;
term_offset = tvb_get_letohl(tvb, offset + O_AERON_PAD_TERM_OFFSET);
session_id = tvb_get_letohl(tvb, offset + O_AERON_PAD_SESSION_ID);
transport = aeron_transport_add(cinfo, session_id, pinfo->fd->num);
@@ -2206,7 +2214,8 @@ static int dissect_aeron_pad(tvbuff_t * tvb, int offset, packet_info * pinfo, pr
pktinfo.data_length = pad_length;
pktinfo.type = HDR_TYPE_PAD;
pktinfo.flags = tvb_get_guint8(tvb, offset + O_AERON_PAD_FLAGS);
- aeron_frame_info_setup(pinfo, transport, &pktinfo, finfo);
+ if (aeron_frame_info_setup(pinfo, transport, &pktinfo, finfo) < 0)
+ return 0;
aeron_info_stream_progress_report(pinfo, HDR_TYPE_PAD, pktinfo.flags, term_id, term_offset, finfo);
pad_item = proto_tree_add_none_format(tree, hf_aeron_pad, tvb, offset, -1, "Pad Frame: Term 0x%x, Ofs %" G_GUINT32_FORMAT ", Len %" G_GUINT32_FORMAT "(%d)",
@@ -2331,7 +2340,7 @@ static int dissect_aeron_data(tvbuff_t * tvb, int offset, packet_info * pinfo, p
offset_increment = aeron_pos_roundup(frame_length);
rounded_length = (int) offset_increment;
if (rounded_length < 0)
- THROW(ReportedBoundsError);
+ return 0;
data_length = frame_length - O_AERON_DATA_DATA;
}
term_offset = tvb_get_letohl(tvb, offset + O_AERON_DATA_TERM_OFFSET);
@@ -2348,7 +2357,8 @@ static int dissect_aeron_data(tvbuff_t * tvb, int offset, packet_info * pinfo, p
pktinfo.data_length = data_length;
pktinfo.type = HDR_TYPE_DATA;
pktinfo.flags = tvb_get_guint8(tvb, offset + O_AERON_DATA_FLAGS);
- aeron_frame_info_setup(pinfo, transport, &pktinfo, finfo);
+ if (aeron_frame_info_setup(pinfo, transport, &pktinfo, finfo) < 0)
+ return 0;
aeron_info_stream_progress_report(pinfo, HDR_TYPE_DATA, pktinfo.flags, term_id, term_offset, finfo);
data_item = proto_tree_add_none_format(tree, hf_aeron_data, tvb, offset, -1, "Data Frame: Term 0x%x, Ofs %" G_GUINT32_FORMAT ", Len %" G_GUINT32_FORMAT "(%d)",
@@ -2437,7 +2447,7 @@ static int dissect_aeron_nak(tvbuff_t * tvb, int offset, packet_info * pinfo, pr
frame_length = tvb_get_letohl(tvb, offset + O_AERON_NAK_FRAME_LENGTH);
rounded_length = (int) aeron_pos_roundup(frame_length);
if (rounded_length < 0)
- THROW(ReportedBoundsError);
+ return 0;
session_id = tvb_get_letohl(tvb, offset + O_AERON_NAK_SESSION_ID);
transport = aeron_transport_add(cinfo, session_id, pinfo->fd->num);
stream_id = tvb_get_letohl(tvb, offset + O_AERON_NAK_STREAM_ID);
@@ -2452,7 +2462,8 @@ static int dissect_aeron_nak(tvbuff_t * tvb, int offset, packet_info * pinfo, pr
pktinfo.nak_length = nak_length;
pktinfo.type = HDR_TYPE_NAK;
pktinfo.flags = tvb_get_guint8(tvb, offset + O_AERON_NAK_FLAGS);
- aeron_frame_info_setup(pinfo, transport, &pktinfo, finfo);
+ if (aeron_frame_info_setup(pinfo, transport, &pktinfo, finfo) < 0)
+ return 0;
col_append_sep_str(pinfo->cinfo, COL_INFO, ", ", "NAK");
nak_item = proto_tree_add_none_format(tree, hf_aeron_nak, tvb, offset, -1, "NAK Frame: Term 0x%x, Ofs %" G_GUINT32_FORMAT ", Len %" G_GUINT32_FORMAT,
@@ -2521,7 +2532,7 @@ static int dissect_aeron_sm(tvbuff_t * tvb, int offset, packet_info * pinfo, pro
feedback_length = frame_length - O_AERON_SM_FEEDBACK;
rounded_length = (int) aeron_pos_roundup(frame_length);
if (rounded_length < 0)
- THROW(ReportedBoundsError);
+ return 0;
session_id = tvb_get_letohl(tvb, offset + O_AERON_SM_SESSION_ID);
transport = aeron_transport_add(cinfo, session_id, pinfo->fd->num);
stream_id = tvb_get_letohl(tvb, offset + O_AERON_SM_STREAM_ID);
@@ -2548,7 +2559,8 @@ static int dissect_aeron_sm(tvbuff_t * tvb, int offset, packet_info * pinfo, pro
pktinfo.length = 0;
pktinfo.data_length = 0;
pktinfo.type = HDR_TYPE_SM;
- aeron_frame_info_setup(pinfo, transport, &pktinfo, finfo);
+ if (aeron_frame_info_setup(pinfo, transport, &pktinfo, finfo) < 0)
+ return 0;
aeron_info_stream_progress_report(pinfo, HDR_TYPE_SM, pktinfo.flags, term_id, consumption_offset, finfo);
sm_item = proto_tree_add_none_format(tree, hf_aeron_sm, tvb, offset, -1, "Status Message: Term 0x%x, ConsumptionOfs %" G_GUINT32_FORMAT ", RcvWindow %" G_GUINT32_FORMAT,
@@ -2615,7 +2627,7 @@ static int dissect_aeron_err(tvbuff_t * tvb, int offset, packet_info * pinfo, pr
}
rounded_length = (int) aeron_pos_roundup(frame_length);
if (rounded_length < 0)
- THROW(ReportedBoundsError);
+ return 0;
proto_item_set_len(err_item, rounded_length);
if (frame_length < L_AERON_ERR_MIN)
{
@@ -2662,7 +2674,7 @@ static int dissect_aeron_setup(tvbuff_t * tvb, int offset, packet_info * pinfo,
frame_length = tvb_get_letohl(tvb, offset + O_AERON_SETUP_FRAME_LENGTH);
rounded_length = (int) aeron_pos_roundup(frame_length);
if (rounded_length < 0)
- THROW(ReportedBoundsError);
+ return 0;
term_offset = tvb_get_letohl(tvb, offset + O_AERON_SETUP_TERM_OFFSET);
session_id = tvb_get_letohl(tvb, offset + O_AERON_SETUP_SESSION_ID);
transport = aeron_transport_add(cinfo, session_id, pinfo->fd->num);
@@ -2679,7 +2691,8 @@ static int dissect_aeron_setup(tvbuff_t * tvb, int offset, packet_info * pinfo,
pktinfo.receiver_window = 0;
pktinfo.type = HDR_TYPE_SETUP;
pktinfo.flags = 0;
- aeron_frame_info_setup(pinfo, transport, &pktinfo, finfo);
+ if (aeron_frame_info_setup(pinfo, transport, &pktinfo, finfo) < 0)
+ return 0;
term_length = tvb_get_letohl(tvb, offset + O_AERON_SETUP_TERM_LENGTH);
mtu = tvb_get_letohl(tvb, offset + O_AERON_SETUP_MTU);
aeron_set_stream_mtu_term_length(pinfo, transport, stream_id, mtu, term_length);