diff options
| author | Brooks Davis <brooks@FreeBSD.org> | 2026-07-15 08:43:50 +0000 |
|---|---|---|
| committer | Brooks Davis <brooks@FreeBSD.org> | 2026-07-15 09:32:16 +0000 |
| commit | db3eca2be2067f7e81d65686b33dcbd475aed363 (patch) | |
| tree | bae72d7c668eaf9141a919a5f2a97c56fcf3d8cf | |
| parent | 8bdc312dac550c292c58a6a3243b08bc8c944b74 (diff) | |
exterrctl(2): add kern_exterrctl
Reviewed by: kib
Effort: CHERI upstreaming
Sponsored by: DARPA, AFRL
Differential Revision: https://reviews.freebsd.org/D58055
| -rw-r--r-- | sys/kern/sys_generic.c | 16 | ||||
| -rw-r--r-- | sys/sys/syscallsubr.h | 1 |
2 files changed, 12 insertions, 5 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index bbfeebbe2f2e..c867867f2618 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -2311,24 +2311,30 @@ exterr_copyout(struct thread *td) int sys_exterrctl(struct thread *td, struct exterrctl_args *uap) { + return (kern_exterrctl(td, uap->op, uap->flags, uap->ptr)); +} + +int +kern_exterrctl(struct thread *td, u_int op, u_int flags, void *ptr) +{ uint32_t ver; int error; - if ((uap->flags & ~(EXTERRCTLF_FORCE)) != 0) + if ((flags & ~(EXTERRCTLF_FORCE)) != 0) return (EINVAL); - switch (uap->op) { + switch (op) { case EXTERRCTL_ENABLE: if ((td->td_pflags2 & TDP2_UEXTERR) != 0 && - (uap->flags & EXTERRCTLF_FORCE) == 0) + (flags & EXTERRCTLF_FORCE) == 0) return (EBUSY); td->td_pflags2 &= ~TDP2_UEXTERR; - error = copyin(uap->ptr, &ver, sizeof(ver)); + error = copyin(ptr, &ver, sizeof(ver)); if (error != 0) return (error); if (ver != UEXTERROR_VER) return (EINVAL); td->td_pflags2 |= TDP2_UEXTERR; - td->td_exterr_ptr = uap->ptr; + td->td_exterr_ptr = ptr; return (0); case EXTERRCTL_DISABLE: if ((td->td_pflags2 & TDP2_UEXTERR) == 0) diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index f0652806b999..e7a118195b53 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -167,6 +167,7 @@ int kern_extattr_set_fp(struct thread *td, struct file *fp, int kern_extattr_set_path(struct thread *td, const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes, int follow, enum uio_seg pathseg); +int kern_exterrctl(struct thread *td, u_int op, u_int flags, void *ptr); int kern_fchmodat(struct thread *td, int fd, const char *path, enum uio_seg pathseg, mode_t mode, int flag); int kern_fchownat(struct thread *td, int fd, const char *path, |
