aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-per.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/packet-per.c')
-rw-r--r--epan/dissectors/packet-per.c54
1 files changed, 40 insertions, 14 deletions
diff --git a/epan/dissectors/packet-per.c b/epan/dissectors/packet-per.c
index bdc98a08e6..06f35d3ec4 100644
--- a/epan/dissectors/packet-per.c
+++ b/epan/dissectors/packet-per.c
@@ -203,7 +203,6 @@ dissect_per_GeneralString(tvbuff_t *tvb, guint32 offset, packet_info *pinfo, pro
offset=dissect_per_length_determinant(tvb, offset, pinfo, tree, hf_per_GeneralString_length, &length);
-
proto_tree_add_item(tree, hf_index, tvb, offset>>3, length, FALSE);
offset+=length*8;
@@ -603,19 +602,32 @@ DEBUG_ENTRY("dissect_per_set_of");
/* 23 Encoding the object identifier type */
guint32
-dissect_per_object_identifier(tvbuff_t *tvb, guint32 offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index, char *value_string)
+dissect_per_object_identifier(tvbuff_t *tvb, guint32 offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index, tvbuff_t **value_tvb)
{
- guint length;
- char *str, *name;
- proto_item *item;
+ guint length;
+ char *str, *name;
+ proto_item *item;
+ header_field_info *hfi;
DEBUG_ENTRY("dissect_per_object_identifier");
- offset = dissect_per_length_determinant(tvb, offset, pinfo, tree, hf_per_object_identifier_length, &length);
+ offset = dissect_per_length_determinant(tvb, offset, pinfo, tree, hf_per_object_identifier_length, &length);
+
+ str = oid_to_str(tvb_get_ptr(tvb, offset>>3, length), length);
+
+ hfi = proto_registrar_get_nth(hf_index);
+ /*if (hfi->type == FT_OID) {
+ item = proto_tree_add_item(tree, hf_index, tvb, offset>>3, length, FALSE);
+ } else*/ if (IS_FT_STRING(hfi->type)) {
+ item = proto_tree_add_string(tree, hf_index, tvb, offset>>3, length, str);
+ } else {
+ DISSECTOR_ASSERT_NOT_REACHED();
+ }
+
+ if (value_tvb)
+ *value_tvb = tvb_new_subset(tvb, offset>>3, length, length);
- str = oid_to_str(tvb_get_ptr(tvb, offset>>3, length), length);
- item = proto_tree_add_string(tree, hf_index, tvb, offset>>3, length, str);
- offset += 8 * length;
+ offset += 8 * length;
/* see if we know the name of this oid */
if(item){
@@ -625,13 +637,27 @@ DEBUG_ENTRY("dissect_per_object_identifier");
}
}
- if (value_string) {
- strcpy(value_string, str);
- }
-
- return offset;
+ return offset;
}
+guint32
+dissect_per_object_identifier_str(tvbuff_t *tvb, guint32 offset, packet_info *pinfo, proto_tree *tree, int hf_index, const char **value_string)
+{
+ tvbuff_t *value_tvb = NULL;
+ guint length;
+
+ offset = dissect_per_object_identifier(tvb, offset, pinfo, tree, hf_index, (value_string) ? &value_tvb : NULL);
+
+ if (value_string) {
+ if (value_tvb && (length = tvb_length(value_tvb))) {
+ *value_string = oid_to_str(tvb_get_ptr(tvb, 0, length), length);
+ } else {
+ *value_string = "";
+ }
+ }
+
+ return offset;
+}