Forget please about previous diff.

Except ppppac_ioctl() the only function which can have race with
pppacclose() is pppacopen(), but since `sc' is still linked to
`pppac_devs' list we can't reopen dying `sc'. So the only race is
pppacopen() vs pppacopen().

We only need to malloc(9) before pppac_lookup() to fix this race.

Index: sys/net/if_pppx.c
===================================================================
RCS file: /cvs/src/sys/net/if_pppx.c,v
retrieving revision 1.95
diff -u -p -r1.95 if_pppx.c
--- sys/net/if_pppx.c   10 Jul 2020 13:26:42 -0000      1.95
+++ sys/net/if_pppx.c   13 Jul 2020 23:35:20 -0000
@@ -1062,11 +1062,12 @@ pppacopen(dev_t dev, int flags, int mode
        struct pppac_softc *sc;
        struct ifnet *ifp;
 
-       sc = pppac_lookup(dev);
-       if (sc != NULL)
+       sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO);
+       if (pppac_lookup(dev) != NULL) {
+               free(sc, M_DEVBUF, sizeof(*sc));
                return (EBUSY);
+       }
 
-       sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO);
        sc->sc_dev = dev;
 
        mtx_init(&sc->sc_rsel_mtx, IPL_SOFTNET);

Reply via email to