summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_rwlock.c
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2017-12-18 10:05:43 +0000
committermpi <mpi@openbsd.org>2017-12-18 10:05:43 +0000
commite8a5fa7b28f13aaabdc4ee58078d26f364a199b9 (patch)
tree91563c0f070cd484338c0dab91f2e27fe3be978e /sys/kern/kern_rwlock.c
parentSize for free(9). (diff)
downloadwireguard-openbsd-e8a5fa7b28f13aaabdc4ee58078d26f364a199b9.tar.xz
wireguard-openbsd-e8a5fa7b28f13aaabdc4ee58078d26f364a199b9.zip
Make rw_exit() always succeed after a panic.
Prevents a deadlock in if_downall() when rw_enter() succeed without really grabbing the lock. Reported by and ok phessler@
Diffstat (limited to 'sys/kern/kern_rwlock.c')
-rw-r--r--sys/kern/kern_rwlock.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/kern/kern_rwlock.c b/sys/kern/kern_rwlock.c
index 399c352f396..88228a224a1 100644
--- a/sys/kern/kern_rwlock.c
+++ b/sys/kern/kern_rwlock.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_rwlock.c,v 1.32 2017/10/24 08:53:15 mpi Exp $ */
+/* $OpenBSD: kern_rwlock.c,v 1.33 2017/12/18 10:05:43 mpi Exp $ */
/*
* Copyright (c) 2002, 2003 Artur Grabowski <art@openbsd.org>
@@ -287,6 +287,10 @@ _rw_exit(struct rwlock *rwl LOCK_FL_VARS)
int wrlock = owner & RWLOCK_WRLOCK;
unsigned long set;
+ /* Avoid deadlocks after panic */
+ if (panicstr)
+ return;
+
if (wrlock)
rw_assert_wrlock(rwl);
else