summaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2020-04-02 15:37:40 +0000
committerMark Johnston <markj@FreeBSD.org>2020-04-02 15:37:40 +0000
commit565ed50ce5a78ceab76fd5a7c65981bce66d853c (patch)
tree1f3ec4aa94492d25be2181731d258bdc52f30acf /sys/kern
parentdb9562496aae5de1df53a1e5316457324efc0f77 (diff)
downloadsrc-test2-565ed50ce5a78ceab76fd5a7c65981bce66d853c.tar.gz
src-test2-565ed50ce5a78ceab76fd5a7c65981bce66d853c.zip
Notes
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/sys_capability.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/sys/kern/sys_capability.c b/sys/kern/sys_capability.c
index a3b2665034b8..5b47018f5130 100644
--- a/sys/kern/sys_capability.c
+++ b/sys/kern/sys_capability.c
@@ -223,6 +223,7 @@ kern_cap_rights_limit(struct thread *td, int fd, cap_rights_t *rights)
{
struct filedesc *fdp;
struct filedescent *fdep;
+ u_long *ioctls;
int error;
fdp = td->td_proc->p_fd;
@@ -232,18 +233,22 @@ kern_cap_rights_limit(struct thread *td, int fd, cap_rights_t *rights)
FILEDESC_XUNLOCK(fdp);
return (EBADF);
}
+ ioctls = NULL;
error = _cap_check(cap_rights(fdp, fd), rights, CAPFAIL_INCREASE);
if (error == 0) {
+ seq_write_begin(&fdep->fde_seq);
fdep->fde_rights = *rights;
if (!cap_rights_is_set(rights, CAP_IOCTL)) {
- free(fdep->fde_ioctls, M_FILECAPS);
+ ioctls = fdep->fde_ioctls;
fdep->fde_ioctls = NULL;
fdep->fde_nioctls = 0;
}
if (!cap_rights_is_set(rights, CAP_FCNTL))
fdep->fde_fcntls = 0;
+ seq_write_end(&fdep->fde_seq);
}
FILEDESC_XUNLOCK(fdp);
+ free(ioctls, M_FILECAPS);
return (error);
}
@@ -428,8 +433,10 @@ kern_cap_ioctls_limit(struct thread *td, int fd, u_long *cmds, size_t ncmds)
goto out;
ocmds = fdep->fde_ioctls;
+ seq_write_begin(&fdep->fde_seq);
fdep->fde_ioctls = cmds;
fdep->fde_nioctls = ncmds;
+ seq_write_end(&fdep->fde_seq);
cmds = ocmds;
error = 0;
@@ -586,7 +593,9 @@ sys_cap_fcntls_limit(struct thread *td, struct cap_fcntls_limit_args *uap)
return (ENOTCAPABLE);
}
+ seq_write_begin(&fdep->fde_seq);
fdep->fde_fcntls = fcntlrights;
+ seq_write_end(&fdep->fde_seq);
FILEDESC_XUNLOCK(fdp);
return (0);