mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 12:03:54 +02:00
for-linus-2020-04-18
-----BEGIN PGP SIGNATURE-----
iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCXprWIAAKCRCRxhvAZXjc
omUyAQCQcvJQhilLv0b7FtBAbN7+TkzV8vAQTzEITuHPa6m/HwEA2Gp9ZDTJfQbV
T6utOrTm/LT0mfBkiDLSnLPtVzh7mgE=
=Jz3d
-----END PGP SIGNATURE-----
Merge tag 'for-linus-2020-04-18' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux
Pull thread fixes from Christian Brauner:
"A few fixes and minor improvements:
- Correctly validate the cgroup file descriptor when clone3() is used
with CLONE_INTO_CGROUP.
- Check that a new enough version of struct clone_args is passed
which supports the cgroup file descriptor argument when
CLONE_INTO_CGROUP is set in the flags argument.
- Catch nonsensical struct clone_args layouts at build time.
- Catch extensions of struct clone_args without updating the uapi
visible size definitions at build time.
- Check whether the signal is valid early in kill_pid_usb_asyncio()
before doing further work.
- Replace open-coded rcu_read_lock()+kill_pid_info()+rcu_read_unlock()
sequence in kill_something_info() with kill_proc_info() which is a
dedicated helper to do just that"
* tag 'for-linus-2020-04-18' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux:
clone3: add build-time CLONE_ARGS_SIZE_VER* validity checks
clone3: add a check for the user struct size if CLONE_INTO_CGROUP is set
clone3: fix cgroup argument sanity check
signal: use kill_proc_info instead of kill_pid_info in kill_something_info
signal: check sig before setting info in kill_pid_usb_asyncio
This commit is contained in:
commit
774acb2a09
|
|
@ -2605,6 +2605,14 @@ noinline static int copy_clone_args_from_user(struct kernel_clone_args *kargs,
|
|||
struct clone_args args;
|
||||
pid_t *kset_tid = kargs->set_tid;
|
||||
|
||||
BUILD_BUG_ON(offsetofend(struct clone_args, tls) !=
|
||||
CLONE_ARGS_SIZE_VER0);
|
||||
BUILD_BUG_ON(offsetofend(struct clone_args, set_tid_size) !=
|
||||
CLONE_ARGS_SIZE_VER1);
|
||||
BUILD_BUG_ON(offsetofend(struct clone_args, cgroup) !=
|
||||
CLONE_ARGS_SIZE_VER2);
|
||||
BUILD_BUG_ON(sizeof(struct clone_args) != CLONE_ARGS_SIZE_VER2);
|
||||
|
||||
if (unlikely(usize > PAGE_SIZE))
|
||||
return -E2BIG;
|
||||
if (unlikely(usize < CLONE_ARGS_SIZE_VER0))
|
||||
|
|
@ -2631,7 +2639,8 @@ noinline static int copy_clone_args_from_user(struct kernel_clone_args *kargs,
|
|||
!valid_signal(args.exit_signal)))
|
||||
return -EINVAL;
|
||||
|
||||
if ((args.flags & CLONE_INTO_CGROUP) && args.cgroup < 0)
|
||||
if ((args.flags & CLONE_INTO_CGROUP) &&
|
||||
(args.cgroup > INT_MAX || usize < CLONE_ARGS_SIZE_VER2))
|
||||
return -EINVAL;
|
||||
|
||||
*kargs = (struct kernel_clone_args){
|
||||
|
|
|
|||
|
|
@ -1510,15 +1510,15 @@ int kill_pid_usb_asyncio(int sig, int errno, sigval_t addr,
|
|||
unsigned long flags;
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (!valid_signal(sig))
|
||||
return ret;
|
||||
|
||||
clear_siginfo(&info);
|
||||
info.si_signo = sig;
|
||||
info.si_errno = errno;
|
||||
info.si_code = SI_ASYNCIO;
|
||||
*((sigval_t *)&info.si_pid) = addr;
|
||||
|
||||
if (!valid_signal(sig))
|
||||
return ret;
|
||||
|
||||
rcu_read_lock();
|
||||
p = pid_task(pid, PIDTYPE_PID);
|
||||
if (!p) {
|
||||
|
|
@ -1557,12 +1557,8 @@ static int kill_something_info(int sig, struct kernel_siginfo *info, pid_t pid)
|
|||
{
|
||||
int ret;
|
||||
|
||||
if (pid > 0) {
|
||||
rcu_read_lock();
|
||||
ret = kill_pid_info(sig, info, find_vpid(pid));
|
||||
rcu_read_unlock();
|
||||
return ret;
|
||||
}
|
||||
if (pid > 0)
|
||||
return kill_proc_info(sig, info, pid);
|
||||
|
||||
/* -INT_MIN is undefined. Exclude this case to avoid a UBSAN warning */
|
||||
if (pid == INT_MIN)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user