diff options
Diffstat (limited to 'epan/dissectors/packet-per.c')
-rw-r--r-- | epan/dissectors/packet-per.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/epan/dissectors/packet-per.c b/epan/dissectors/packet-per.c index c5d6568a28..89d9bf5912 100644 --- a/epan/dissectors/packet-per.c +++ b/epan/dissectors/packet-per.c @@ -538,7 +538,7 @@ DEBUG_ENTRY("dissect_per_sequence_of"); guint32 dissect_per_IA5String(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, int min_len, int max_len) { - offset=dissect_per_octet_string(tvb, offset, actx, tree, hf_index, min_len, max_len, NULL); + offset=dissect_per_octet_string(tvb, offset, actx, tree, hf_index, min_len, max_len, FALSE, NULL); return offset; } @@ -779,7 +779,7 @@ dissect_per_BMPString(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tre guint32 dissect_per_object_descriptor(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, tvbuff_t **value_tvb) { - offset=dissect_per_octet_string(tvb, offset, actx, tree, hf_index, -1, -1, value_tvb); + offset=dissect_per_octet_string(tvb, offset, actx, tree, hf_index, -1, -1, FALSE, value_tvb); return offset; } @@ -1759,7 +1759,7 @@ guint32 dissect_per_bit_string_containing_pdu_new(tvbuff_t *tvb, guint32 offset, hf_index can either be a FT_BYTES or an FT_STRING */ guint32 -dissect_per_octet_string(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, int min_len, int max_len, tvbuff_t **value_tvb) +dissect_per_octet_string(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, int min_len, int max_len, gboolean has_extension, tvbuff_t **value_tvb) { gint val_start = 0, val_length; guint32 length; @@ -1770,6 +1770,13 @@ dissect_per_octet_string(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_ DEBUG_ENTRY("dissect_per_octet_string"); + if (has_extension) { /* 16.3 an extension marker is present */ + gboolean extension_present; + offset = dissect_per_boolean(tvb, offset, actx, tree, hf_per_extension_present_bit, &extension_present); + if (!display_internal_per_fields) PROTO_ITEM_SET_HIDDEN(actx->created_item); + if (extension_present) max_len = NO_BOUND; /* skip to 16.8 */ + } + if (min_len == NO_BOUND) { min_len = 0; } @@ -1847,12 +1854,12 @@ DEBUG_ENTRY("dissect_per_octet_string"); return offset; } -guint32 dissect_per_octet_string_containing_pdu(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, int min_len, int max_len, dissector_t type_cb) +guint32 dissect_per_octet_string_containing_pdu(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, int min_len, int max_len, gboolean has_extension, dissector_t type_cb) { tvbuff_t *val_tvb = NULL; proto_tree *subtree = tree; - offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index, min_len, max_len, &val_tvb); + offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index, min_len, max_len, has_extension, &val_tvb); if (type_cb && val_tvb) { subtree = proto_item_add_subtree(actx->created_item, ett_per_containing); @@ -1862,12 +1869,12 @@ guint32 dissect_per_octet_string_containing_pdu(tvbuff_t *tvb, guint32 offset, a return offset; } -guint32 dissect_per_octet_string_containing_pdu_new(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, int min_len, int max_len, new_dissector_t type_cb) +guint32 dissect_per_octet_string_containing_pdu_new(tvbuff_t *tvb, guint32 offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index, int min_len, int max_len, gboolean has_extension, new_dissector_t type_cb) { tvbuff_t *val_tvb = NULL; proto_tree *subtree = tree; - offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index, min_len, max_len, &val_tvb); + offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index, min_len, max_len, has_extension, &val_tvb); if (type_cb && val_tvb) { subtree = proto_item_add_subtree(actx->created_item, ett_per_containing); @@ -1937,7 +1944,7 @@ dissect_per_T_single_ASN1_type(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *ac static int dissect_per_T_octet_aligned(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index, - NO_BOUND, NO_BOUND, &actx->external.octet_aligned); + NO_BOUND, NO_BOUND, FALSE, &actx->external.octet_aligned); if (actx->external.u.per.type_cb) { actx->external.u.per.type_cb(actx->external.octet_aligned, 0, actx, tree, actx->external.hf_index); |