aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorJoão Valverde <joao.valverde@tecnico.ulisboa.pt>2016-06-02 01:18:03 +0100
committerJoão Valverde <j@v6e.pt>2016-06-02 02:53:41 +0000
commita92c9cd4e1ad6be9bc6d43d9d569023f8aefbf8c (patch)
tree14a03c8b0dcfa84d0cc9c49c500f462e55cf064b /epan
parent987ff3ee1bed5fe17d3889411687283818cee29f (diff)
IPv6: Try to dissect routing exthdr even if length is not aligned.
Change-Id: Ic88a862559fcd1d4bd04747d3fb727bcd3a6138e Reviewed-on: https://code.wireshark.org/review/15693 Reviewed-by: João Valverde <j@v6e.pt>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-ipv6.c52
1 files changed, 25 insertions, 27 deletions
diff --git a/epan/dissectors/packet-ipv6.c b/epan/dissectors/packet-ipv6.c
index 6ffcd84414..8d18c092fd 100644
--- a/epan/dissectors/packet-ipv6.c
+++ b/epan/dissectors/packet-ipv6.c
@@ -836,24 +836,23 @@ dissect_routing6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
if (rt.ip6r_len % 2 != 0) {
expert_add_info_format(pinfo, ti_len, &ei_ipv6_routing_invalid_length,
- "IPv6 Routing Header extension header length must not be odd");
- } else {
- rt0_addr_count = rt.ip6r_len / 2;
- if (rt.ip6r_segleft > rt0_addr_count) {
- expert_add_info_format(pinfo, ti_seg, &ei_ipv6_routing_invalid_segleft,
+ "IPv6 Routing Header extension header length must not be odd");
+ }
+ rt0_addr_count = rt.ip6r_len / 2;
+ if (rt.ip6r_segleft > rt0_addr_count) {
+ expert_add_info_format(pinfo, ti_seg, &ei_ipv6_routing_invalid_segleft,
"IPv6 Type 0 Routing Header segments left field must not exceed address count (%u)", rt0_addr_count);
+ }
+ offlim = offset + rt0_addr_count * IPv6_ADDR_SIZE;
+ for (; offset < offlim; offset += IPv6_ADDR_SIZE) {
+ ti = proto_tree_add_item(rthdr_tree, hf_ipv6_routing_src_addr, tvb,
+ offset, IPv6_ADDR_SIZE, ENC_NA);
+ tvb_get_ipv6(tvb, offset, addr);
+ if (in6_is_addr_multicast(addr)) {
+ expert_add_info(pinfo, ti, &ei_ipv6_src_route_list_multicast_addr);
}
- offlim = offset + rt0_addr_count * IPv6_ADDR_SIZE;
- for (; offset < offlim; offset += IPv6_ADDR_SIZE) {
- ti = proto_tree_add_item(rthdr_tree, hf_ipv6_routing_src_addr, tvb,
- offset, IPv6_ADDR_SIZE, ENC_NA);
- tvb_get_ipv6(tvb, offset, addr);
- if (in6_is_addr_multicast(addr)) {
- expert_add_info(pinfo, ti, &ei_ipv6_src_route_list_multicast_addr);
- }
- }
- dst_addr = addr;
}
+ dst_addr = addr;
}
/* Mobile IPv6 Routing Header (Type 2) */
@@ -863,20 +862,19 @@ dissect_routing6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
if (rt.ip6r_len != 2) {
expert_add_info_format(pinfo, ti_len, &ei_ipv6_routing_invalid_length,
- "IPv6 Type 2 Routing Header extension header length must equal 2");
- } else {
- if (rt.ip6r_segleft != 1) {
- expert_add_info_format(pinfo, ti_seg, &ei_ipv6_routing_invalid_segleft,
+ "IPv6 Type 2 Routing Header extension header length must equal 2");
+ }
+ if (rt.ip6r_segleft != 1) {
+ expert_add_info_format(pinfo, ti_seg, &ei_ipv6_routing_invalid_segleft,
"IPv6 Type 2 Routing Header segments left field must equal 1");
- }
- ti = proto_tree_add_item(rthdr_tree, hf_ipv6_routing_mipv6_home_address, tvb,
- offset, IPv6_ADDR_SIZE, ENC_NA);
- tvb_get_ipv6(tvb, offset, addr);
- if (in6_is_addr_multicast(addr)) {
- expert_add_info(pinfo, ti, &ei_ipv6_src_route_list_multicast_addr);
- }
- dst_addr = addr;
}
+ ti = proto_tree_add_item(rthdr_tree, hf_ipv6_routing_mipv6_home_address, tvb,
+ offset, IPv6_ADDR_SIZE, ENC_NA);
+ tvb_get_ipv6(tvb, offset, addr);
+ if (in6_is_addr_multicast(addr)) {
+ expert_add_info(pinfo, ti, &ei_ipv6_src_route_list_multicast_addr);
+ }
+ dst_addr = addr;
}
/* RPL Source Routing Header (Type 3) */