On Mon, Oct 16, 2017 at 10:15:28AM +0200, Martin Pieuchot wrote:
> Hrvoje Popovski reported the following panic:
> 
>   panic: kernel diagnostic assertion "sc->sc_carpdev != NULL" failed
>   panic() at panic+0x128
>   __assert() at __assert+0x24
>   carp_output() at carp_output+0xde
>   ip_output() at ip_output+0x948
>   ipsp_process_done() at ipsp_process_done+0x254
>   esp_output_cb() at esp_output_cb+0xe6
>   taskq_thread(0) at taskq_thread+0x67
> 
> 
> The KASSERT() in carp_output() is triggered when he deletes a trunk(4)
> interface sitting under a carp(4) while IPsec packets are being
> process/sent over the carp(4) interface.  The problem here is that the
> carp(4) interface still exists but has no parent.  So as soon as
> carp_output() is called we should drop the packets.
> 
> He confirmed the diff below works for him.
> 
> ok?
> 
> Index: netinet/ip_carp.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_carp.c,v
> retrieving revision 1.316
> diff -u -p -r1.316 ip_carp.c
> --- netinet/ip_carp.c 9 Oct 2017 08:35:38 -0000       1.316
> +++ netinet/ip_carp.c 12 Oct 2017 09:44:30 -0000
> @@ -2359,7 +2359,14 @@ carp_output(struct ifnet *ifp, struct mb
>       struct srp_ref sr;
>       int ismaster;
>  
> -     KASSERT(sc->sc_carpdev != NULL);
> +     /*
> +      * If the parent this carp(4) got destroyed while a
> +      * packet was being processed, silently drop it.

Please adjust the comment: ... the parent of this ...

> +      */
> +     if (sc->sc_carpdev == NULL) {
> +             m_freem(m);
> +             return (0);
> +     }
>  
>       if (sc->cur_vhe == NULL) {
>               vhe = SRPL_FIRST(&sr, &sc->carp_vhosts);
> 

With thay OK claudio. I guess we have more such problems hiding in the
stack when IPsec is involved since there is more queuing happening in the
middle of the stack.

-- 
:wq Claudio

  • carp(4) fix Martin Pieuchot
    • Re: carp(4) fix Claudio Jeker

Reply via email to