On Mon, Nov 21, 2016 at 10:58:43AM +0100, Alexander Bluhm wrote:
> On Fri, Nov 18, 2016 at 11:33:33PM +0100, Alexandr Nedvedicky wrote:
> > how about using 'goto free_ipv6_frag' ? It better explains, what's
> > going to happen.
>
> makes sense
thanks a lot, I'm O.K. with it.
regards
sasha
>
> bluhm
>
> Index: net/pf_norm.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/net/pf_norm.c,v
> retrieving revision 1.195
> diff -u -p -r1.195 pf_norm.c
> --- net/pf_norm.c 26 Oct 2016 21:07:22 -0000 1.195
> +++ net/pf_norm.c 21 Nov 2016 09:55:36 -0000
> @@ -331,16 +331,16 @@ pf_fillup_fragment(struct pf_fragment_cm
>
> /* Non terminal fragments must have more fragments flag */
> if (frent->fe_off + frent->fe_len < total && !frent->fe_mff)
> - goto bad_fragment;
> + goto free_ipv6_fragment;
>
> /* Check if we saw the last fragment already */
> if (!TAILQ_LAST(&frag->fr_queue, pf_fragq)->fe_mff) {
> if (frent->fe_off + frent->fe_len > total ||
> (frent->fe_off + frent->fe_len == total && frent->fe_mff))
> - goto bad_fragment;
> + goto free_ipv6_fragment;
> } else {
> if (frent->fe_off + frent->fe_len == total && !frent->fe_mff)
> - goto bad_fragment;
> + goto free_ipv6_fragment;
> }
>
> /* Find a fragment after the current one */
> @@ -406,7 +406,10 @@ pf_fillup_fragment(struct pf_fragment_cm
>
> return (frag);
>
> +free_ipv6_fragment:
> #ifdef INET6
> + if (frag->fr_af == AF_INET)
> + goto bad_fragment;
> free_fragment:
> /*
> * RFC 5722, Errata 3089: When reassembling an IPv6 datagram, if one