mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 22:23:14 -04:00
Linux 5.2-rc3
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAlz0N88eHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiG3kIH/2uP/+A3STjoURBh nCZVThVUXryD+9eughto97PfkBsVs6Wfylx/WX4Qhi4zi8PnIM8DnY9MuCdfhT5+ 7WN76MQrCxagHOtHfGf2yXYtYP4wfNmbttWPxsxtEsWVNMzboCMILTGeSpZlwD04 bb5qdRVeAcULO3A0xAJXS/sSAvX9mFDLDfOV24G2ksRbmrzDs8KPRVJBoSicem+Z Rz0wktu+G3GAb8j3mBu2DcDe66pLGLCbQ3VxwpbCN0+ZyEXUkiY7khGCFEX0SxLH 1+SICNVbdJWMvhQf4p0eEUX/5NhIhtZyUFMiXX/vHnglECTRk4AQ9LQaVuYXDey9 wsnlA9o= =KXpG -----END PGP SIGNATURE----- Merge Linux 5.2-rc3 into android-mainline Linux 5.2-rc3 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
eae1a1b5a5
8220 changed files with 11906 additions and 66195 deletions
62
kernel/sys.c
62
kernel/sys.c
|
|
@ -1884,13 +1884,14 @@ exit_err:
|
|||
}
|
||||
|
||||
/*
|
||||
* Check arithmetic relations of passed addresses.
|
||||
*
|
||||
* WARNING: we don't require any capability here so be very careful
|
||||
* in what is allowed for modification from userspace.
|
||||
*/
|
||||
static int validate_prctl_map(struct prctl_mm_map *prctl_map)
|
||||
static int validate_prctl_map_addr(struct prctl_mm_map *prctl_map)
|
||||
{
|
||||
unsigned long mmap_max_addr = TASK_SIZE;
|
||||
struct mm_struct *mm = current->mm;
|
||||
int error = -EINVAL, i;
|
||||
|
||||
static const unsigned char offsets[] = {
|
||||
|
|
@ -1951,24 +1952,6 @@ static int validate_prctl_map(struct prctl_mm_map *prctl_map)
|
|||
prctl_map->start_data))
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Someone is trying to cheat the auxv vector.
|
||||
*/
|
||||
if (prctl_map->auxv_size) {
|
||||
if (!prctl_map->auxv || prctl_map->auxv_size > sizeof(mm->saved_auxv))
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Finally, make sure the caller has the rights to
|
||||
* change /proc/pid/exe link: only local sys admin should
|
||||
* be allowed to.
|
||||
*/
|
||||
if (prctl_map->exe_fd != (u32)-1) {
|
||||
if (!ns_capable(current_user_ns(), CAP_SYS_ADMIN))
|
||||
goto out;
|
||||
}
|
||||
|
||||
error = 0;
|
||||
out:
|
||||
return error;
|
||||
|
|
@ -1995,11 +1978,18 @@ static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data
|
|||
if (copy_from_user(&prctl_map, addr, sizeof(prctl_map)))
|
||||
return -EFAULT;
|
||||
|
||||
error = validate_prctl_map(&prctl_map);
|
||||
error = validate_prctl_map_addr(&prctl_map);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
if (prctl_map.auxv_size) {
|
||||
/*
|
||||
* Someone is trying to cheat the auxv vector.
|
||||
*/
|
||||
if (!prctl_map.auxv ||
|
||||
prctl_map.auxv_size > sizeof(mm->saved_auxv))
|
||||
return -EINVAL;
|
||||
|
||||
memset(user_auxv, 0, sizeof(user_auxv));
|
||||
if (copy_from_user(user_auxv,
|
||||
(const void __user *)prctl_map.auxv,
|
||||
|
|
@ -2012,6 +2002,14 @@ static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data
|
|||
}
|
||||
|
||||
if (prctl_map.exe_fd != (u32)-1) {
|
||||
/*
|
||||
* Make sure the caller has the rights to
|
||||
* change /proc/pid/exe link: only local sys admin should
|
||||
* be allowed to.
|
||||
*/
|
||||
if (!ns_capable(current_user_ns(), CAP_SYS_ADMIN))
|
||||
return -EINVAL;
|
||||
|
||||
error = prctl_set_mm_exe_file(mm, prctl_map.exe_fd);
|
||||
if (error)
|
||||
return error;
|
||||
|
|
@ -2099,7 +2097,11 @@ static int prctl_set_mm(int opt, unsigned long addr,
|
|||
unsigned long arg4, unsigned long arg5)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct prctl_mm_map prctl_map;
|
||||
struct prctl_mm_map prctl_map = {
|
||||
.auxv = NULL,
|
||||
.auxv_size = 0,
|
||||
.exe_fd = -1,
|
||||
};
|
||||
struct vm_area_struct *vma;
|
||||
int error;
|
||||
|
||||
|
|
@ -2127,9 +2129,15 @@ static int prctl_set_mm(int opt, unsigned long addr,
|
|||
|
||||
error = -EINVAL;
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
/*
|
||||
* arg_lock protects concurent updates of arg boundaries, we need
|
||||
* mmap_sem for a) concurrent sys_brk, b) finding VMA for addr
|
||||
* validation.
|
||||
*/
|
||||
down_read(&mm->mmap_sem);
|
||||
vma = find_vma(mm, addr);
|
||||
|
||||
spin_lock(&mm->arg_lock);
|
||||
prctl_map.start_code = mm->start_code;
|
||||
prctl_map.end_code = mm->end_code;
|
||||
prctl_map.start_data = mm->start_data;
|
||||
|
|
@ -2141,9 +2149,6 @@ static int prctl_set_mm(int opt, unsigned long addr,
|
|||
prctl_map.arg_end = mm->arg_end;
|
||||
prctl_map.env_start = mm->env_start;
|
||||
prctl_map.env_end = mm->env_end;
|
||||
prctl_map.auxv = NULL;
|
||||
prctl_map.auxv_size = 0;
|
||||
prctl_map.exe_fd = -1;
|
||||
|
||||
switch (opt) {
|
||||
case PR_SET_MM_START_CODE:
|
||||
|
|
@ -2183,7 +2188,7 @@ static int prctl_set_mm(int opt, unsigned long addr,
|
|||
goto out;
|
||||
}
|
||||
|
||||
error = validate_prctl_map(&prctl_map);
|
||||
error = validate_prctl_map_addr(&prctl_map);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
|
|
@ -2220,7 +2225,8 @@ static int prctl_set_mm(int opt, unsigned long addr,
|
|||
|
||||
error = 0;
|
||||
out:
|
||||
up_write(&mm->mmap_sem);
|
||||
spin_unlock(&mm->arg_lock);
|
||||
up_read(&mm->mmap_sem);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue