Module Name: src
Committed By: riastradh
Date: Sun Mar 16 15:52:03 UTC 2025
Modified Files:
src/sys/kern: kern_proc.c
Log Message:
kern_proc.c: Sprinkle SET_ERROR.
To generate a diff of this commit:
cvs rdiff -u -r1.277 -r1.278 src/sys/kern/kern_proc.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/kern_proc.c
diff -u src/sys/kern/kern_proc.c:1.277 src/sys/kern/kern_proc.c:1.278
--- src/sys/kern/kern_proc.c:1.277 Sun Mar 16 15:51:34 2025
+++ src/sys/kern/kern_proc.c Sun Mar 16 15:52:03 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_proc.c,v 1.277 2025/03/16 15:51:34 riastradh Exp $ */
+/* $NetBSD: kern_proc.c,v 1.278 2025/03/16 15:52:03 riastradh Exp $ */
/*-
* Copyright (c) 1999, 2006, 2007, 2008, 2020, 2023
@@ -63,7 +63,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.277 2025/03/16 15:51:34 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.278 2025/03/16 15:52:03 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_kstack.h"
@@ -102,6 +102,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_proc.c,
#include <sys/pset.h>
#include <sys/ras.h>
#include <sys/resourcevar.h>
+#include <sys/sdt.h>
#include <sys/signalvar.h>
#include <sys/sleepq.h>
#include <sys/syscall_stats.h>
@@ -631,25 +632,25 @@ pgid_in_session(struct proc *p, pid_t pg
int error;
if (pg_id <= INT_MIN)
- return EINVAL;
+ return SET_ERROR(EINVAL);
mutex_enter(&proc_lock);
if (pg_id < 0) {
struct proc *p1 = proc_find(-pg_id);
if (p1 == NULL) {
- error = EINVAL;
+ error = SET_ERROR(EINVAL);
goto fail;
}
pgrp = p1->p_pgrp;
} else {
pgrp = pgrp_find(pg_id);
if (pgrp == NULL) {
- error = EINVAL;
+ error = SET_ERROR(EINVAL);
goto fail;
}
}
session = pgrp->pg_session;
- error = (session != p->p_pgrp->pg_session) ? EPERM : 0;
+ error = (session != p->p_pgrp->pg_session) ? SET_ERROR(EPERM) : 0;
fail:
mutex_exit(&proc_lock);
return error;
@@ -1301,37 +1302,36 @@ proc_enterpgrp(struct proc *curp, pid_t
new_pgrp = kmem_alloc(sizeof(*new_pgrp), KM_SLEEP);
mutex_enter(&proc_lock);
- rval = EPERM; /* most common error (to save typing) */
/* Check pgrp exists or can be created */
pgrp = pid_table[pgid & pid_tbl_mask].pt_pgrp;
if (pgrp != NULL && pgrp->pg_id != pgid)
- goto done;
+ goto eperm;
/* Can only set another process under restricted circumstances. */
if (pid != curp->p_pid) {
/* Must exist and be one of our children... */
p = proc_find_internal(pid, false);
if (p == NULL || !p_inferior(p, curp)) {
- rval = ESRCH;
+ rval = SET_ERROR(ESRCH);
goto done;
}
/* ... in the same session... */
if (sess != NULL || p->p_session != curp->p_session)
- goto done;
+ goto eperm;
/* ... existing pgid must be in same session ... */
if (pgrp != NULL && pgrp->pg_session != p->p_session)
- goto done;
+ goto eperm;
/* ... and not done an exec. */
if (p->p_flag & PK_EXEC) {
- rval = EACCES;
+ rval = SET_ERROR(EACCES);
goto done;
}
} else {
/* ... setsid() cannot re-enter a pgrp */
if (mksess && (curp->p_pgid == curp->p_pid ||
pgrp_find(curp->p_pid)))
- goto done;
+ goto eperm;
p = curp;
}
@@ -1341,31 +1341,31 @@ proc_enterpgrp(struct proc *curp, pid_t
if (sess == NULL && p->p_pgrp == pgrp)
/* unless it's a definite noop */
rval = 0;
- goto done;
+ goto eperm;
}
/* Can only create a process group with id of process */
if (pgrp == NULL && pgid != pid)
- goto done;
+ goto eperm;
/* Can only create a session if creating pgrp */
if (sess != NULL && pgrp != NULL)
- goto done;
+ goto eperm;
/* Check we allocated memory for a pgrp... */
if (pgrp == NULL && new_pgrp == NULL)
- goto done;
+ goto eperm;
/* Don't attach to 'zombie' pgrp */
if (pgrp != NULL && LIST_EMPTY(&pgrp->pg_members))
- goto done;
+ goto eperm;
/* Expect to succeed now */
rval = 0;
if (pgrp == p->p_pgrp)
/* nothing to do */
- goto done;
+ goto eperm;
/* Ok all setup, link up required structures */
@@ -1422,8 +1422,11 @@ proc_enterpgrp(struct proc *curp, pid_t
/* Done with the swap; we can release the tty mutex. */
mutex_spin_exit(&tty_lock);
+ goto done;
- done:
+eperm:
+ rval = SET_ERROR(EPERM);
+done:
if (pg_id != NO_PGID) {
/* Releases proc_lock. */
pg_delete(pg_id);
@@ -1790,7 +1793,7 @@ proc_vmspace_getref(struct proc *p, stru
if ((p != curproc && (p->p_sflag & PS_WEXIT) != 0) ||
(p->p_vmspace->vm_refcnt < 1)) {
- return EFAULT;
+ return SET_ERROR(EFAULT);
}
uvmspace_addref(p->p_vmspace);
@@ -1948,19 +1951,18 @@ proc_setspecific(struct proc *p, specifi
int
proc_uidmatch(kauth_cred_t cred, kauth_cred_t target)
{
- int r = 0;
if (kauth_cred_getuid(cred) != kauth_cred_getuid(target) ||
kauth_cred_getuid(cred) != kauth_cred_getsvuid(target)) {
/*
* suid proc of ours or proc not ours
*/
- r = EPERM;
+ return SET_ERROR(EPERM);
} else if (kauth_cred_getgid(target) != kauth_cred_getsvgid(target)) {
/*
* sgid proc has sgid back to us temporarily
*/
- r = EPERM;
+ return SET_ERROR(EPERM);
} else {
/*
* our rgid must be in target's group list (ie,
@@ -1971,10 +1973,10 @@ proc_uidmatch(kauth_cred_t cred, kauth_c
if (kauth_cred_ismember_gid(cred,
kauth_cred_getgid(target), &ismember) != 0 ||
!ismember)
- r = EPERM;
+ return SET_ERROR(EPERM);
}
- return (r);
+ return 0;
}
/*
@@ -2088,16 +2090,16 @@ sysctl_doeproc(SYSCTLFN_ARGS)
if (type == KERN_PROC) {
if (namelen == 0)
- return EINVAL;
+ return SET_ERROR(EINVAL);
switch (op = name[0]) {
case KERN_PROC_ALL:
if (namelen != 1)
- return EINVAL;
+ return SET_ERROR(EINVAL);
arg = 0;
break;
default:
if (namelen != 2)
- return EINVAL;
+ return SET_ERROR(EINVAL);
arg = name[1];
break;
}
@@ -2105,7 +2107,7 @@ sysctl_doeproc(SYSCTLFN_ARGS)
kelem_size = elem_size = sizeof(kbuf->kproc);
} else {
if (namelen != 4)
- return EINVAL;
+ return SET_ERROR(EINVAL);
op = name[0];
arg = name[1];
elem_size = name[2];
@@ -2213,7 +2215,7 @@ sysctl_doeproc(SYSCTLFN_ARGS)
break;
default:
- error = EINVAL;
+ error = SET_ERROR(EINVAL);
mutex_exit(p->p_lock);
goto cleanup;
}
@@ -2287,7 +2289,7 @@ sysctl_doeproc(SYSCTLFN_ARGS)
if (where != NULL) {
*oldlenp = dp - where;
if (needed > *oldlenp) {
- error = ENOMEM;
+ error = SET_ERROR(ENOMEM);
goto out;
}
} else {
@@ -2354,7 +2356,7 @@ sysctl_kern_proc_args(SYSCTLFN_ARGS)
return (sysctl_query(SYSCTLFN_CALL(rnode)));
if (newp != NULL || namelen != 2)
- return (EINVAL);
+ return SET_ERROR(EINVAL);
pid = name[0];
type = name[1];
@@ -2378,7 +2380,7 @@ sysctl_kern_proc_args(SYSCTLFN_ARGS)
/* ok */
break;
default:
- return (EINVAL);
+ return SET_ERROR(EINVAL);
}
sysctl_unlock();
@@ -2386,7 +2388,7 @@ sysctl_kern_proc_args(SYSCTLFN_ARGS)
/* check pid */
mutex_enter(&proc_lock);
if ((p = proc_find(pid)) == NULL) {
- error = EINVAL;
+ error = SET_ERROR(EINVAL);
goto out_locked;
}
mutex_enter(p->p_lock);
@@ -2399,7 +2401,7 @@ sysctl_kern_proc_args(SYSCTLFN_ARGS)
error = kauth_authorize_process(l->l_cred, KAUTH_PROCESS_CANSEE,
p, KAUTH_ARG(KAUTH_REQ_PROCESS_CANSEE_ENV), NULL, NULL);
else
- error = EINVAL; /* XXXGCC */
+ error = SET_ERROR(EINVAL); /* XXXGCC */
if (error) {
mutex_exit(p->p_lock);
goto out_locked;
@@ -2420,12 +2422,12 @@ sysctl_kern_proc_args(SYSCTLFN_ARGS)
* System processes also don't have a user stack.
*/
if (P_ZOMBIE(p) || (p->p_flag & PK_SYSTEM) != 0) {
- error = EINVAL;
+ error = SET_ERROR(EINVAL);
mutex_exit(p->p_lock);
goto out_locked;
}
- error = rw_tryenter(&p->p_reflock, RW_READER) ? 0 : EBUSY;
+ error = rw_tryenter(&p->p_reflock, RW_READER) ? 0 : SET_ERROR(EBUSY);
mutex_exit(p->p_lock);
if (error) {
goto out_locked;
@@ -2504,12 +2506,12 @@ copy_procargs(struct proc *p, int oid, s
argvlen = pss.ps_nenvstr;
break;
default:
- error = EINVAL;
+ error = SET_ERROR(EINVAL);
goto done;
}
if (argvlen < 0) {
- error = EIO;
+ error = SET_ERROR(EIO);
goto done;
}
@@ -2952,7 +2954,7 @@ proc_find_locked(struct lwp *l, struct p
if (*p == NULL) {
if (pid != -1)
mutex_exit(&proc_lock);
- return ESRCH;
+ return SET_ERROR(ESRCH);
}
if (pid != -1)
mutex_enter((*p)->p_lock);
@@ -2980,7 +2982,7 @@ fill_pathname(struct lwp *l, pid_t pid,
if (p->p_path == NULL) {
if (pid != -1)
mutex_exit(p->p_lock);
- return ENOENT;
+ return SET_ERROR(ENOENT);
}
size_t len = strlen(p->p_path) + 1;
@@ -2988,7 +2990,7 @@ fill_pathname(struct lwp *l, pid_t pid,
size_t copylen = uimin(len, *oldlenp);
error = sysctl_copyout(l, p->p_path, oldp, copylen);
if (error == 0 && *oldlenp < len)
- error = ENOSPC;
+ error = SET_ERROR(ENOSPC);
}
*oldlenp = len;
if (pid != -1)
@@ -3033,7 +3035,7 @@ fill_cwd(struct lwp *l, pid_t pid, void
size_t copylen = uimin(lenused, *oldlenp);
error = sysctl_copyout(l, bp, oldp, copylen);
if (error == 0 && *oldlenp < lenused)
- error = ENOSPC;
+ error = SET_ERROR(ENOSPC);
}
*oldlenp = lenused;
out:
@@ -3054,11 +3056,11 @@ proc_getauxv(struct proc *p, void **buf,
if ((error = copyin_psstrings(p, &pss)) != 0)
return error;
if (pss.ps_envstr == NULL)
- return EIO;
+ return SET_ERROR(EIO);
size = p->p_execsw->es_arglen;
if (size == 0)
- return EIO;
+ return SET_ERROR(EIO);
size_t ptrsz = PROC_PTRSZ(p);
uauxv = (void *)((char *)pss.ps_envstr + (pss.ps_nenvstr + 1) * ptrsz);
@@ -3093,7 +3095,7 @@ sysctl_security_expose_address(SYSCTLFN_
if (kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_KERNADDR,
0, NULL, NULL, NULL))
- return EPERM;
+ return SET_ERROR(EPERM);
switch (expose_address) {
case 0:
@@ -3101,7 +3103,7 @@ sysctl_security_expose_address(SYSCTLFN_
case 2:
break;
default:
- return EINVAL;
+ return SET_ERROR(EINVAL);
}
*(int *)rnode->sysctl_data = expose_address;