Date: Fri, 26 Jun 2026 22:20:51 +0000 From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: 5e633db3f8e1 - stable/15 - kern_proc.c: make kern.proc.osrel atomic Message-ID: <6a3efb43.30a09.20dcbf35@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch stable/15 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=5e633db3f8e126578c097c9649ba3be552664c6a commit 5e633db3f8e126578c097c9649ba3be552664c6a Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2026-06-15 17:28:15 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2026-06-26 22:16:06 +0000 kern_proc.c: make kern.proc.osrel atomic (cherry picked from commit 80626f34ee985671bb8c60ee986b89587b7a1511) --- sys/kern/kern_proc.c | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 1e09e6042e7a..056176399062 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -3123,39 +3123,38 @@ sysctl_kern_proc_osrel(SYSCTL_HANDLER_ARGS) int *name = (int *)arg1; u_int namelen = arg2; struct proc *p; - int flags, error, osrel; + int flags, error, old_osrel, osrel; if (namelen != 1) return (EINVAL); - if (req->newptr != NULL && req->newlen != sizeof(osrel)) - return (EINVAL); - - flags = PGET_HOLD | PGET_NOTWEXIT; - if (req->newptr != NULL) + flags = PGET_NOTWEXIT; + if (req->newptr != NULL) { + if (req->newlen != sizeof(osrel)) + return (EINVAL); + error = SYSCTL_IN(req, &osrel, sizeof(osrel)); + if (error != 0) + return (error); + if (osrel < 0) + return (EINVAL); flags |= PGET_CANDEBUG; - else + } else { flags |= PGET_CANSEE; + } error = pget((pid_t)name[0], flags, &p); if (error != 0) return (error); - - error = SYSCTL_OUT(req, &p->p_osrel, sizeof(p->p_osrel)); - if (error != 0) - goto errout; - - if (req->newptr != NULL) { - error = SYSCTL_IN(req, &osrel, sizeof(osrel)); - if (error != 0) - goto errout; - if (osrel < 0) { - error = EINVAL; - goto errout; - } - p->p_osrel = osrel; + if ((p->p_flag & P_INEXEC) != 0) { + error = EBUSY; + } else { + old_osrel = p->p_osrel; + if (req->newptr != NULL) + p->p_osrel = osrel; } -errout: - PRELE(p); + PROC_UNLOCK(p); + + if (error == 0) + error = SYSCTL_OUT(req, &old_osrel, sizeof(old_osrel)); return (error); }home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a3efb43.30a09.20dcbf35>
