On Mon, Jul 19, 2021 at 06:40:07PM +0200, Alexander Bluhm wrote:
> On Fri, Jul 09, 2021 at 10:47:49PM +0300, Vitaliy Makkoveev wrote:
> > If I understood your diff right, pipex(4) is also affected through:
> >
> > ip_local()
> >    -> ip_deliver()
> >      -> (*pr_input)()
> >        -> gre_input()
> >          -> gre_input_key()
> >            -> gre_input_1()
> >              -> pipex_pptp_input()
> 
> I am not a pipex user.  But ip_local() is called with exclusive netlock.
> 
> if_netisr() -> NET_LOCK() -> ipintr() -> ip_local()
> 
> This should be fine.  Or did I miss something?

I mean the case when ip_local() called by ip_ours(). Unfortunately, I'm
not familiar with PPTP but it looks affected because it don't use tcp or
udp as transport but encapsulates them into ip frames. Sorry for noise
if I'm wrong.

 +ip_ours(struct mbuf **mp, int *offp, int nxt, int af)
 +{
 +      /* We are already in a IPv4/IPv6 local deliver loop. */
 +      if (af != AF_UNSPEC)
 +              return ip_local(mp, offp, nxt, af);
 +
 +      niq_enqueue(&ipintrq, *mp);
 +      *mp = NULL;
 +      return IPPROTO_DONE;
 +}

Reply via email to