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