svn commit: r359567 - stable/12/sys/kern
Mark Johnston
markj at FreeBSD.org
Thu Apr 2 15:37:51 UTC 2020
Author: markj
Date: Thu Apr 2 15:37:40 2020
New Revision: 359567
URL: https://svnweb.freebsd.org/changeset/base/359567
Log:
MFC r359132:
Enter a write sequence when updating rights.
Modified:
stable/12/sys/kern/sys_capability.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/kern/sys_capability.c
==============================================================================
--- stable/12/sys/kern/sys_capability.c Thu Apr 2 15:32:09 2020 (r359566)
+++ stable/12/sys/kern/sys_capability.c Thu Apr 2 15:37:40 2020 (r359567)
@@ -223,6 +223,7 @@ kern_cap_rights_limit(struct thread *td, int fd, cap_r
{
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_r
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_lon
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_fcn
return (ENOTCAPABLE);
}
+ seq_write_begin(&fdep->fde_seq);
fdep->fde_fcntls = fcntlrights;
+ seq_write_end(&fdep->fde_seq);
FILEDESC_XUNLOCK(fdp);
return (0);
More information about the svn-src-stable
mailing list