Hi,

This fixes a panic mtx locking against myself I have introduced in
my previous commit.

ok?

bluhm

Index: net/pfkeyv2.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net/pfkeyv2.c,v
retrieving revision 1.220
diff -u -p -r1.220 pfkeyv2.c
--- net/pfkeyv2.c       22 Oct 2021 12:30:53 -0000      1.220
+++ net/pfkeyv2.c       25 Oct 2021 17:49:21 -0000
@@ -1042,8 +1042,10 @@ int
 pfkeyv2_sa_flush(struct tdb *tdb, void *satype_vp, int last)
 {
        if (!(*((u_int8_t *) satype_vp)) ||
-           tdb->tdb_satype == *((u_int8_t *) satype_vp))
-               tdb_delete(tdb);
+           tdb->tdb_satype == *((u_int8_t *) satype_vp)) {
+               tdb_unlink_locked(tdb);
+               tdb_free(tdb);
+       }
        return (0);
 }
 
Index: netinet/ip_ipsp.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_ipsp.c,v
retrieving revision 1.247
diff -u -p -r1.247 ip_ipsp.c
--- netinet/ip_ipsp.c   25 Oct 2021 16:00:12 -0000      1.247
+++ netinet/ip_ipsp.c   25 Oct 2021 17:50:58 -0000
@@ -733,10 +733,19 @@ puttdb(struct tdb *tdbp)
 void
 tdb_unlink(struct tdb *tdbp)
 {
+       mtx_enter(&tdb_sadb_mtx);
+       tdb_unlink_locked(tdbp);
+       mtx_leave(&tdb_sadb_mtx);
+}
+
+void
+tdb_unlink_locked(struct tdb *tdbp)
+{
        struct tdb *tdbpp;
        u_int32_t hashval;
 
-       mtx_enter(&tdb_sadb_mtx);
+       MUTEX_ASSERT_LOCKED(&tdb_sadb_mtx);
+
        hashval = tdb_hash(tdbp->tdb_spi, &tdbp->tdb_dst, tdbp->tdb_sproto);
 
        if (tdbh[hashval] == tdbp) {
@@ -793,7 +802,6 @@ tdb_unlink(struct tdb *tdbp)
                ipsecstat_inc(ipsec_prevtunnels);
        }
 #endif /* IPSEC */
-       mtx_leave(&tdb_sadb_mtx);
 }
 
 void
Index: netinet/ip_ipsp.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_ipsp.h,v
retrieving revision 1.218
diff -u -p -r1.218 ip_ipsp.h
--- netinet/ip_ipsp.h   24 Oct 2021 23:33:37 -0000      1.218
+++ netinet/ip_ipsp.h   25 Oct 2021 17:50:57 -0000
@@ -558,6 +558,7 @@ struct      tdb *tdb_alloc(u_int);
 void   tdb_free(struct tdb *);
 int    tdb_init(struct tdb *, u_int16_t, struct ipsecinit *);
 void   tdb_unlink(struct tdb *);
+void   tdb_unlink_locked(struct tdb *);
 int    tdb_walk(u_int, int (*)(struct tdb *, void *, int), void *);
 
 /* XF_IP4 */

Reply via email to