Date: Thu, 2 Apr 2020 15:37:40 +0000 (UTC) From: Mark Johnston <markj@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r359567 - stable/12/sys/kern Message-ID: <202004021537.032Fbe4I077430@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202004021537.032Fbe4I077430>