diff options
author | etxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7> | 2008-03-18 20:10:50 +0000 |
---|---|---|
committer | etxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7> | 2008-03-18 20:10:50 +0000 |
commit | c08d989706e395a3ce9651c31e248757466c79cc (patch) | |
tree | e27c15f07e0f3e477aa4d59dbc0e8d9526cb760a | |
parent | 72fb4ca2faabd1ae25af6cc38cc04cb41211fd21 (diff) |
Handle the case where length is > remaining tvb
trace in:
http://bugs.wireshark.org/bugzilla/show_bug.cgi?id=1809
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@24691 f5534014-38df-0310-8fa8-9805f1628bb7
-rw-r--r-- | epan/dissectors/packet-per.c | 18 | ||||
-rw-r--r-- | epan/dissectors/packet-per.h | 2 |
2 files changed, 12 insertions, 8 deletions
diff --git a/epan/dissectors/packet-per.c b/epan/dissectors/packet-per.c index 7302facbe3..54676d4575 100644 --- a/epan/dissectors/packet-per.c +++ b/epan/dissectors/packet-per.c @@ -123,21 +123,26 @@ static tvbuff_t *new_octet_aligned_subset(tvbuff_t *tvb, guint32 offset, guint32 guint32 boffset = offset >> 3; unsigned int i, shift0, shift1; guint8 octet0, octet1, *buf; + guint32 actual_length; + + actual_length = tvb_length_remaining(tvb,offset); + if (length <= actual_length) + actual_length = length; if (offset & 0x07) { /* unaligned */ shift1 = offset & 0x07; shift0 = 8 - shift1; - buf = ep_alloc(length); + buf = ep_alloc(actual_length); octet0 = tvb_get_guint8(tvb, boffset); - for (i=0; i<length; i++) { + for (i=0; i<actual_length; i++) { octet1 = octet0; octet0 = tvb_get_guint8(tvb, boffset + i + 1); buf[i] = (octet1 << shift1) | (octet0 >> shift0); } - sub_tvb = tvb_new_real_data(buf, length, length); + sub_tvb = tvb_new_real_data(buf, actual_length, length); tvb_set_child_real_data_tvbuff(tvb, sub_tvb); } else { /* aligned */ - sub_tvb = tvb_new_subset(tvb, boffset, length, length); + sub_tvb = tvb_new_subset(tvb, boffset, actual_length, length); } return sub_tvb; } @@ -206,9 +211,6 @@ static tvbuff_t *new_octet_aligned_subset_bits(tvbuff_t *tvb, guint32 offset, gu /* 10 Encoding procedures -------------------------------------------------- */ -static guint32 -dissect_per_length_determinant(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index, guint32 *length); - /* 10.2 Open type fields --------------------------------------------------- */ static guint32 dissect_per_open_type_internal(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, void* type_cb, asn1_cb_variant variant) @@ -305,7 +307,7 @@ dissect_per_open_type_pdu_new(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, p field in the manner described above in Note 2. */ -static guint32 +guint32 dissect_per_length_determinant(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index, guint32 *length) { guint8 byte; diff --git a/epan/dissectors/packet-per.h b/epan/dissectors/packet-per.h index b4142e75d2..6dd9ab72bd 100644 --- a/epan/dissectors/packet-per.h +++ b/epan/dissectors/packet-per.h @@ -129,4 +129,6 @@ extern guint32 dissect_per_external_type(tvbuff_t *tvb, guint32 offset, asn1_ctx extern guint32 dissect_per_size_constrained_type(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, per_type_fn type_cb, const gchar *name, int min_len, int max_len, gboolean has_extension); extern gboolean get_size_constraint_from_stack(asn1_ctx_t *actx, const gchar *name, int *pmin_len, int *pmax_len, gboolean *phas_extension); +extern guint32 dissect_per_length_determinant(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index, guint32 *length); + #endif /* __PACKET_PER_H__ */ |