aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/dissectors/packet-per.c18
-rw-r--r--epan/dissectors/packet-per.h2
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__ */