Index | Thread | Search

From:
Vitaliy Makkoveev <mvs@openbsd.org>
Subject:
sysctl(2): unlock fs_sysctl()
To:
tech@openbsd.org
Date:
Wed, 30 Oct 2024 19:27:20 +0300

Download raw body.

Thread
It is the only `suid_clear' variable - atomically accessed integer.

Index: sys/kern/kern_sysctl.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
diff -u -p -r1.450 kern_sysctl.c
--- sys/kern/kern_sysctl.c	28 Oct 2024 10:18:03 -0000	1.450
+++ sys/kern/kern_sysctl.c	30 Oct 2024 16:12:02 -0000
@@ -262,6 +262,7 @@ sys_sysctl(struct proc *p, void *v, regi
 		fn = net_sysctl;
 		break;
 	case CTL_FS:
+		dolock = 0;
 		fn = fs_sysctl;
 		break;
 	case CTL_VFS:
Index: sys/kern/vfs_subr.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_subr.c,v
diff -u -p -r1.324 vfs_subr.c
--- sys/kern/vfs_subr.c	18 Oct 2024 05:52:32 -0000	1.324
+++ sys/kern/vfs_subr.c	30 Oct 2024 16:12:02 -0000
@@ -72,6 +72,11 @@
 
 #include "softraid.h"
 
+/*
+ * Locks used to protect data:
+ *	a	atomic
+ */
+
 void sr_quiesce(void);
 
 enum vtype iftovt_tab[16] = {
@@ -84,8 +89,8 @@ int	vttoif_tab[9] = {
 	S_IFSOCK, S_IFIFO, S_IFMT,
 };
 
-int prtactive = 0;		/* 1 => print out reclaim of active vnodes */
-int suid_clear = 1;		/* 1 => clear SUID / SGID on owner change */
+int prtactive = 0;	/* 1 => print out reclaim of active vnodes */
+int suid_clear = 1;	/* [a] 1 => clear SUID / SGID on owner change */
 
 /*
  * Insq/Remq for the vnode usage lists.
Index: sys/kern/vfs_syscalls.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_syscalls.c,v
diff -u -p -r1.368 vfs_syscalls.c
--- sys/kern/vfs_syscalls.c	1 Sep 2024 23:26:10 -0000	1.368
+++ sys/kern/vfs_syscalls.c	30 Oct 2024 16:12:02 -0000
@@ -2470,7 +2470,7 @@ dofchownat(struct proc *p, int fd, const
 			goto out;
 		if ((uid != -1 || gid != -1) &&
 		    !vnoperm(vp) &&
-		    (suser(p) || suid_clear)) {
+		    (suser(p) || atomic_load_int(&suid_clear))) {
 			error = VOP_GETATTR(vp, &vattr, p->p_ucred, p);
 			if (error)
 				goto out;
@@ -2523,7 +2523,7 @@ sys_lchown(struct proc *p, void *v, regi
 			goto out;
 		if ((uid != -1 || gid != -1) &&
 		    !vnoperm(vp) &&
-		    (suser(p) || suid_clear)) {
+		    (suser(p) || atomic_load_int(&suid_clear))) {
 			error = VOP_GETATTR(vp, &vattr, p->p_ucred, p);
 			if (error)
 				goto out;
@@ -2573,7 +2573,7 @@ sys_fchown(struct proc *p, void *v, regi
 			goto out;
 		if ((uid != -1 || gid != -1) &&
 		    !vnoperm(vp) &&
-		    (suser(p) || suid_clear)) {
+		    (suser(p) || atomic_load_int(&suid_clear))) {
 			error = VOP_GETATTR(vp, &vattr, p->p_ucred, p);
 			if (error)
 				goto out;