aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-rsvp.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2013-08-24 07:50:46 +0000
committerAnders Broman <anders.broman@ericsson.com>2013-08-24 07:50:46 +0000
commited2d4bc375a70be5a907803465d75f1ec18566e7 (patch)
treea3a05fd8e20c2b09bda11f8146a0ff601778bfdf /epan/dissectors/packet-rsvp.c
parentdf309c6c27c7765125e0756ea942d7f45c7e5aab (diff)
From Tommy Wu:
Handle ERROR-SPEC: mandatory object, with an empty value. svn path=/trunk/; revision=51507
Diffstat (limited to 'epan/dissectors/packet-rsvp.c')
-rw-r--r--epan/dissectors/packet-rsvp.c107
1 files changed, 61 insertions, 46 deletions
diff --git a/epan/dissectors/packet-rsvp.c b/epan/dissectors/packet-rsvp.c
index bb1f8f6617..1899f36d93 100644
--- a/epan/dissectors/packet-rsvp.c
+++ b/epan/dissectors/packet-rsvp.c
@@ -2634,76 +2634,91 @@ dissect_rsvp_error(proto_item *ti, proto_tree *rsvp_object_tree,
case 1: {
proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
"C-type: 1 - IPv4");
- proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
- "Error node: %s",
+ if(obj_length>4) {
+ proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
+ "Error node: %s",
tvb_ip_to_str(tvb, offset2));
+
offset3 = offset2+4;
- break;
+ }
+ break;
}
case 2: {
proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
"C-type: 2 - IPv6");
- proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
+ if(obj_length>4) {
+ proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
"Error node: %s",
tvb_ip6_to_str(tvb, offset2));
- offset3 = offset2+16;
- break;
+
+ offset3 = offset2+16;
+ }
+ break;
}
case 3: {
proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
"C-type: 3 - IPv4 IF-ID");
- proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
+ if(obj_length>4) {
+ proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
"Error node: %s",
tvb_ip_to_str(tvb, offset2));
- offset3 = offset2+4;
- break;
+
+ offset3 = offset2+4;
+ }
+ break;
}
default:
proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
"C-type: Unknown (%u)",
type);
- proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4,
+ if(obj_length>4) {
+ proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4,
"Data (%d bytes)", obj_length - 4);
- return;
- }
-
- error_flags = tvb_get_guint8(tvb, offset3);
- ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_error_flags,
- tvb, offset3, 1, ENC_BIG_ENDIAN);
- rsvp_error_subtree = proto_item_add_subtree(ti2, TREE(TT_ERROR_FLAGS));
- proto_tree_add_item(rsvp_error_subtree, hf_rsvp_error_flags_path_state_removed,
- tvb, offset3, 1, ENC_BIG_ENDIAN);
- proto_tree_add_item(rsvp_error_subtree, hf_rsvp_error_flags_not_guilty,
- tvb, offset3, 1, ENC_BIG_ENDIAN);
- proto_tree_add_item(rsvp_error_subtree, hf_rsvp_error_flags_in_place,
- tvb, offset3, 1, ENC_BIG_ENDIAN);
- proto_item_append_text(ti2, " %s %s %s",
- (error_flags & (1<<2)) ? "Path-State-Removed" : "",
- (error_flags & (1<<1)) ? "NotGuilty" : "",
- (error_flags & (1<<0)) ? "InPlace" : "");
- error_code = tvb_get_guint8(tvb, offset3+1);
- proto_tree_add_text(rsvp_object_tree, tvb, offset3+1, 1,
- "Error code: %u - %s", error_code,
- val_to_str_ext(error_code, &rsvp_error_codes_ext, "Unknown (%d)"));
- error_val = dissect_rsvp_error_value(rsvp_object_tree, tvb, offset3+2, error_code);
-
- switch (type) {
- case 1:
- proto_item_set_text(ti, "ERROR: IPv4, Error code: %s, Value: %d, Error Node: %s",
- val_to_str_ext(error_code, &rsvp_error_codes_ext, "Unknown (%d)"),
- error_val, tvb_ip_to_str(tvb, offset2));
- break;
- case 3:
- proto_item_set_text(ti, "ERROR: IPv4 IF-ID, Error code: %s, Value: %d, Control Node: %s. ",
- val_to_str_ext(error_code, &rsvp_error_codes_ext, "Unknown (%d)"),
- error_val, tvb_ip_to_str(tvb, offset2));
- dissect_rsvp_ifid_tlv(ti, rsvp_object_tree, tvb, offset+12, obj_length-12,
- TREE(TT_ERROR_SUBOBJ));
- break;
+ }
+ return;
}
+
+ if(obj_length>4) {
+ error_flags = tvb_get_guint8(tvb, offset3);
+ ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_error_flags,
+ tvb, offset3, 1, ENC_BIG_ENDIAN);
+ rsvp_error_subtree = proto_item_add_subtree(ti2, TREE(TT_ERROR_FLAGS));
+ proto_tree_add_item(rsvp_error_subtree, hf_rsvp_error_flags_path_state_removed,
+ tvb, offset3, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(rsvp_error_subtree, hf_rsvp_error_flags_not_guilty,
+ tvb, offset3, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(rsvp_error_subtree, hf_rsvp_error_flags_in_place,
+ tvb, offset3, 1, ENC_BIG_ENDIAN);
+ proto_item_append_text(ti2, " %s %s %s",
+ (error_flags & (1<<2)) ? "Path-State-Removed" : "",
+ (error_flags & (1<<1)) ? "NotGuilty" : "",
+ (error_flags & (1<<0)) ? "InPlace" : "");
+ error_code = tvb_get_guint8(tvb, offset3+1);
+ proto_tree_add_text(rsvp_object_tree, tvb, offset3+1, 1,
+ "Error code: %u - %s", error_code,
+ val_to_str_ext(error_code, &rsvp_error_codes_ext, "Unknown (%d)"));
+ error_val = dissect_rsvp_error_value(rsvp_object_tree, tvb, offset3+2, error_code);
+
+
+
+ switch (type) {
+ case 1:
+ proto_item_set_text(ti, "ERROR: IPv4, Error code: %s, Value: %d, Error Node: %s",
+ val_to_str_ext(error_code, &rsvp_error_codes_ext, "Unknown (%d)"),
+ error_val, tvb_ip_to_str(tvb, offset2));
+ break;
+ case 3:
+ proto_item_set_text(ti, "ERROR: IPv4 IF-ID, Error code: %s, Value: %d, Control Node: %s. ",
+ val_to_str_ext(error_code, &rsvp_error_codes_ext, "Unknown (%d)"),
+ error_val, tvb_ip_to_str(tvb, offset2));
+ dissect_rsvp_ifid_tlv(ti, rsvp_object_tree, tvb, offset+12, obj_length-12,
+ TREE(TT_ERROR_SUBOBJ));
+ break;
+ }
+ }
}
/*------------------------------------------------------------------------------