ok mvs@

> On 22 Jul 2022, at 22:43, Alexander Bluhm <[email protected]> wrote:
> 
> Hi,
> 
> During regress testing I found this bug.
> 
> splassert: rip6_input: want 1 have 2
> Starting stack trace...
> rip6_input(1,2,d0c6b7ad,f57ff9fc) at rip6_input+0x166
> rip6_input(f57ffbfc,f57ffbe8,3a,18) at rip6_input+0x166
> icmp6_input(f57ffbfc,f57ffbe8,3a,18) at icmp6_input+0x66d
> ip_deliver(f57ffbfc,f57ffbe8,3a,18) at ip_deliver+0xf4
> ip6_input_if(f57ffbfc,f57ffbe8,29,0,d7066830) at ip6_input_if+0x88a
> ipv6_input(d7066830,dafe5400) at ipv6_input+0x2b
> ether_input(d7066830,dafe5400) at ether_input+0x3a9
> if_input_process(d7066830,f57ffc54) at if_input_process+0x5d
> ifiq_process(d7066ae0) at ifiq_process+0x57
> taskq_thread(d6ff1040) at taskq_thread+0x69
> End of stack trace.
> 
> ip6_input() has shared net lock.  ip_deliver() needs exclusive net
> lock.  Use ip6_ours() to queue the packet.  Move the write lock
> assertion into ip_deliver() to catch such bugs earlier.
> 
> The assertion is only triggered with IPv6 multicast forwarding or
> router alert hop by hop option.  So nobody noticed it.
> 
> ok?
> 
> bluhm
> 
> Index: netinet/ip_input.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_input.c,v
> retrieving revision 1.372
> diff -u -p -r1.372 ip_input.c
> --- netinet/ip_input.c        29 Jun 2022 09:01:48 -0000      1.372
> +++ netinet/ip_input.c        22 Jul 2022 19:23:47 -0000
> @@ -556,8 +556,6 @@ ip_local(struct mbuf **mp, int *offp, in
>       struct ipqent *ipqe;
>       int mff, hlen;
> 
> -     NET_ASSERT_WLOCKED();
> -
>       hlen = ip->ip_hl << 2;
> 
>       /*
> @@ -673,6 +671,8 @@ ip_deliver(struct mbuf **mp, int *offp, 
> #ifdef INET6
>       int nest = 0;
> #endif /* INET6 */
> +
> +     NET_ASSERT_WLOCKED();
> 
>       /* pf might have modified stuff, might have to chksum */
>       switch (af) {
> Index: netinet6/ip6_input.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_input.c,v
> retrieving revision 1.248
> diff -u -p -r1.248 ip6_input.c
> --- netinet6/ip6_input.c      29 Jun 2022 22:45:24 -0000      1.248
> +++ netinet6/ip6_input.c      22 Jul 2022 19:23:17 -0000
> @@ -448,8 +448,7 @@ ip6_input_if(struct mbuf **mp, int *offp
> 
>                       if (ours) {
>                               if (af == AF_UNSPEC)
> -                                     nxt = ip_deliver(mp, offp, nxt,
> -                                         AF_INET6);
> +                                     nxt = ip6_ours(mp, offp, nxt, af);
>                               goto out;
>                       }
>                       goto bad;
> @@ -550,7 +549,7 @@ ip6_input_if(struct mbuf **mp, int *offp
> 
>       if (ours) {
>               if (af == AF_UNSPEC)
> -                     nxt = ip_deliver(mp, offp, nxt, AF_INET6);
> +                     nxt = ip6_ours(mp, offp, nxt, af);
>               goto out;
>       }
> 
> @@ -584,8 +583,6 @@ ip6_input_if(struct mbuf **mp, int *offp
> int
> ip6_local(struct mbuf **mp, int *offp, int nxt, int af)
> {
> -     NET_ASSERT_WLOCKED();
> -
>       nxt = ip6_hbhchcheck(mp, offp, NULL);
>       if (nxt == IPPROTO_DONE)
>               return IPPROTO_DONE;
> 

Reply via email to