From: Vitaliy Makkoveev Subject: sysctl(2): unlock fs_sysctl() To: tech@openbsd.org Date: Wed, 30 Oct 2024 19:27:20 +0300 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;