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; +}