diff options
author | João Valverde <joao.valverde@tecnico.ulisboa.pt> | 2016-06-02 01:18:03 +0100 |
---|---|---|
committer | João Valverde <j@v6e.pt> | 2016-06-02 02:53:41 +0000 |
commit | a92c9cd4e1ad6be9bc6d43d9d569023f8aefbf8c (patch) | |
tree | 14a03c8b0dcfa84d0cc9c49c500f462e55cf064b /epan | |
parent | 987ff3ee1bed5fe17d3889411687283818cee29f (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.c | 52 |
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) */ |