summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorriastradh <riastradh@NetBSD.org>2023-05-09 12:04:04 +0000
committerriastradh <riastradh@NetBSD.org>2023-05-09 12:04:04 +0000
commit348b09e89dcd4a1895896b84a06d128a36b740ca (patch)
treeecdcb0f26c99c08a39144880964cd682246242a1 /sys/dev
parent86274b6ec76f3a5c49801f7d3eb2b0fc354dc053 (diff)
ioctl(DIOCRMWEDGES): Delete only idle wedges.
Don't forcibly delete busy wedges. Reported-by: syzbot+e46f31fe56e04f567d88@syzkaller.appspotmail.com https://syzkaller.appspot.com/bug?id=8a00fd7f2e7459748d7a274098180a4708ff0f61 Fixes accidental destruction of the busy wedge that the root file system is mounted on, triggered by syzbot's ioctl(DIOCRMWEDGES).
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/dkwedge/dk.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/sys/dev/dkwedge/dk.c b/sys/dev/dkwedge/dk.c
index cf9b2453208..363f0f370d2 100644
--- a/sys/dev/dkwedge/dk.c
+++ b/sys/dev/dkwedge/dk.c
@@ -1,4 +1,4 @@
-/* $NetBSD: dk.c,v 1.153 2023/05/09 12:03:55 riastradh Exp $ */
+/* $NetBSD: dk.c,v 1.154 2023/05/09 12:04:04 riastradh Exp $ */
/*-
* Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.153 2023/05/09 12:03:55 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.154 2023/05/09 12:04:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_dkwedge.h"
@@ -774,14 +774,27 @@ dkwedge_detach(device_t self, int flags)
/*
* dkwedge_delall: [exported function]
*
- * Delete all of the wedges on the specified disk. Used when
- * a disk is being detached.
+ * Forcibly delete all of the wedges on the specified disk. Used
+ * when a disk is being detached.
*/
void
dkwedge_delall(struct disk *pdk)
{
- dkwedge_delall1(pdk, false);
+ dkwedge_delall1(pdk, /*idleonly*/false);
+}
+
+/*
+ * dkwedge_delidle: [exported function]
+ *
+ * Delete all of the wedges on the specified disk if idle. Used
+ * by ioctl(DIOCRMWEDGES).
+ */
+void
+dkwedge_delidle(struct disk *pdk)
+{
+
+ dkwedge_delall1(pdk, /*idleonly*/true);
}
static void
@@ -1065,7 +1078,7 @@ dkwedge_discover(struct disk *pdk)
/*
* Remove unused wedges
*/
- dkwedge_delall1(pdk, true);
+ dkwedge_delidle(pdk);
/*
* For each supported partition map type, look to see if