diff options
author | tegge <tegge@FreeBSD.org> | 2003-02-15 22:43:05 +0000 |
---|---|---|
committer | tegge <tegge@FreeBSD.org> | 2003-02-15 22:43:05 +0000 |
commit | f360480a6898bcaa82e7208ccaada23eed75ec60 (patch) | |
tree | b8fc43179ec725ae6a10c79cff344462bcda2b98 /sys/kern/kern_fork.c | |
parent | 6db4854a46ecff5ef74e282dbd82f8db4e62abd2 (diff) | |
download | FreeBSD-src-f360480a6898bcaa82e7208ccaada23eed75ec60.zip FreeBSD-src-f360480a6898bcaa82e7208ccaada23eed75ec60.tar.gz |
Avoid file lock leakage when linuxthreads port or rfork is used:
- Mark the process leader as having an advisory lock
- Check if process leader is marked as having advisory lock when
closing file
- Check that file is still open after lock has been obtained
- Don't allow file descriptor table sharing between processes
with different leaders
PR: 10265
Reviewed by: alfred
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r-- | sys/kern/kern_fork.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index f84afa8..166f1c6 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -166,6 +166,13 @@ rfork(td, uap) /* Don't allow kernel only flags. */ if ((uap->flags & RFKERNELONLY) != 0) return (EINVAL); + /* + * Don't allow sharing of file descriptor table unless + * RFTHREAD flag is supplied + */ + if ((uap->flags & (RFPROC | RFTHREAD | RFFDG | RFCFDG)) == + RFPROC) + return(EINVAL); mtx_lock(&Giant); error = fork1(td, uap->flags, 0, &p2); if (error == 0) { |