Merge branch 'akpm' (patches from Andrew)
Merge misc fixes from Andrew Morton: "Various fixes and followups" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: mm, compaction: make sure we isolate a valid PFN include/linux/generic-radix-tree.h: fix kerneldoc comment kernel/signal.c: trace_signal_deliver when signal_group_exit drivers/iommu/intel-iommu.c: fix variable 'iommu' set but not used spdxcheck.py: fix directory structures kasan: initialize tag to 0xff in __kasan_kmalloc z3fold: fix sheduling while atomic scripts/gdb: fix invocation when CONFIG_COMMON_CLK is not set mm/gup: continue VM_FAULT_RETRY processing even for pre-faults ocfs2: fix error path kobject memory leak memcg: make it work on sparse non-0-node systems mm, memcg: consider subtrees in memory.events prctl_set_mm: downgrade mmap_sem to read lock prctl_set_mm: refactor checks from validate_prctl_map kernel/fork.c: make max_threads symbol static arch/arm/boot/compressed/decompress.c: fix build error due to lz4 changes arch/parisc/configs/c8000_defconfig: remove obsoleted CONFIG_DEBUG_SLAB_LEAK mm/vmalloc.c: fix typo in comment lib/sort.c: fix kernel-doc notation warnings mm: fix Documentation/vm/hmm.rst Sphinx warnings
This commit is contained in:
@@ -1810,11 +1810,13 @@ int cgroup_show_path(struct seq_file *sf, struct kernfs_node *kf_node,
|
||||
|
||||
enum cgroup2_param {
|
||||
Opt_nsdelegate,
|
||||
Opt_memory_localevents,
|
||||
nr__cgroup2_params
|
||||
};
|
||||
|
||||
static const struct fs_parameter_spec cgroup2_param_specs[] = {
|
||||
fsparam_flag ("nsdelegate", Opt_nsdelegate),
|
||||
fsparam_flag("nsdelegate", Opt_nsdelegate),
|
||||
fsparam_flag("memory_localevents", Opt_memory_localevents),
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -1837,6 +1839,9 @@ static int cgroup2_parse_param(struct fs_context *fc, struct fs_parameter *param
|
||||
case Opt_nsdelegate:
|
||||
ctx->flags |= CGRP_ROOT_NS_DELEGATE;
|
||||
return 0;
|
||||
case Opt_memory_localevents:
|
||||
ctx->flags |= CGRP_ROOT_MEMORY_LOCAL_EVENTS;
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1848,6 +1853,11 @@ static void apply_cgroup_root_flags(unsigned int root_flags)
|
||||
cgrp_dfl_root.flags |= CGRP_ROOT_NS_DELEGATE;
|
||||
else
|
||||
cgrp_dfl_root.flags &= ~CGRP_ROOT_NS_DELEGATE;
|
||||
|
||||
if (root_flags & CGRP_ROOT_MEMORY_LOCAL_EVENTS)
|
||||
cgrp_dfl_root.flags |= CGRP_ROOT_MEMORY_LOCAL_EVENTS;
|
||||
else
|
||||
cgrp_dfl_root.flags &= ~CGRP_ROOT_MEMORY_LOCAL_EVENTS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1855,6 +1865,8 @@ static int cgroup_show_options(struct seq_file *seq, struct kernfs_root *kf_root
|
||||
{
|
||||
if (cgrp_dfl_root.flags & CGRP_ROOT_NS_DELEGATE)
|
||||
seq_puts(seq, ",nsdelegate");
|
||||
if (cgrp_dfl_root.flags & CGRP_ROOT_MEMORY_LOCAL_EVENTS)
|
||||
seq_puts(seq, ",memory_localevents");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6325,7 +6337,7 @@ static struct kobj_attribute cgroup_delegate_attr = __ATTR_RO(delegate);
|
||||
static ssize_t features_show(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "nsdelegate\n");
|
||||
return snprintf(buf, PAGE_SIZE, "nsdelegate\nmemory_localevents\n");
|
||||
}
|
||||
static struct kobj_attribute cgroup_features_attr = __ATTR_RO(features);
|
||||
|
||||
|
@@ -123,7 +123,7 @@
|
||||
unsigned long total_forks; /* Handle normal Linux uptimes. */
|
||||
int nr_threads; /* The idle threads do not count.. */
|
||||
|
||||
int max_threads; /* tunable limit on nr_threads */
|
||||
static int max_threads; /* tunable limit on nr_threads */
|
||||
|
||||
DEFINE_PER_CPU(unsigned long, process_counts) = 0;
|
||||
|
||||
|
@@ -2485,6 +2485,8 @@ relock:
|
||||
if (signal_group_exit(signal)) {
|
||||
ksig->info.si_signo = signr = SIGKILL;
|
||||
sigdelset(¤t->pending.signal, SIGKILL);
|
||||
trace_signal_deliver(SIGKILL, SEND_SIG_NOINFO,
|
||||
&sighand->action[SIGKILL - 1]);
|
||||
recalc_sigpending();
|
||||
goto fatal;
|
||||
}
|
||||
|
62
kernel/sys.c
62
kernel/sys.c
@@ -1882,13 +1882,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[] = {
|
||||
@@ -1949,24 +1950,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;
|
||||
@@ -1993,11 +1976,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,
|
||||
@@ -2010,6 +2000,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;
|
||||
@@ -2097,7 +2095,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;
|
||||
|
||||
@@ -2125,9 +2127,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;
|
||||
@@ -2139,9 +2147,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:
|
||||
@@ -2181,7 +2186,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;
|
||||
|
||||
@@ -2218,7 +2223,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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user