.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * IPv6 library code, needed by static components when full IPv6 support is |
---|
3 | 4 | * not configured or static. |
---|
.. | .. |
---|
142 | 143 | optlen = 1; |
---|
143 | 144 | break; |
---|
144 | 145 | default: |
---|
| 146 | + if (len < 2) |
---|
| 147 | + goto bad; |
---|
145 | 148 | optlen = nh[offset + 1] + 2; |
---|
146 | 149 | if (optlen > len) |
---|
147 | 150 | goto bad; |
---|
.. | .. |
---|
196 | 199 | struct ipv6hdr _ip6, *ip6; |
---|
197 | 200 | |
---|
198 | 201 | ip6 = skb_header_pointer(skb, *offset, sizeof(_ip6), &_ip6); |
---|
199 | | - if (!ip6 || (ip6->version != 6)) { |
---|
200 | | - printk(KERN_ERR "IPv6 header not found\n"); |
---|
| 202 | + if (!ip6 || (ip6->version != 6)) |
---|
201 | 203 | return -EBADMSG; |
---|
202 | | - } |
---|
203 | 204 | start = *offset + sizeof(struct ipv6hdr); |
---|
204 | 205 | nexthdr = ip6->nexthdr; |
---|
205 | 206 | } |
---|
.. | .. |
---|
265 | 266 | } else if (nexthdr == NEXTHDR_AUTH) { |
---|
266 | 267 | if (flags && (*flags & IP6_FH_F_AUTH) && (target < 0)) |
---|
267 | 268 | break; |
---|
268 | | - hdrlen = (hp->hdrlen + 2) << 2; |
---|
| 269 | + hdrlen = ipv6_authlen(hp); |
---|
269 | 270 | } else |
---|
270 | 271 | hdrlen = ipv6_optlen(hp); |
---|
271 | 272 | |
---|