Commit 91174391 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 fixes from Thomas Gleixner:
 "A set of small fixes for x86:

   - fix locking in RDT to prevent memory leaks and freeing in use
     memory

   - prevent setting invalid values for vdso32_enabled which cause
     inconsistencies for user space resulting in application crashes.

   - plug a race in the vdso32 code between fork and sysctl which causes
     inconsistencies for user space resulting in application crashes.

   - make MPX signal delivery work in compat mode

   - make the dmesg output of traps and faults readable again"

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/intel_rdt: Fix locking in rdtgroup_schemata_write()
  x86/debug: Fix the printk() debug output of signal_fault(), do_trap() and do_general_protection()
  x86/vdso: Plug race between mapping and ELF header setup
  x86/vdso: Ensure vdso32_enabled gets set to valid values only
  x86/signals: Fix lower/upper bound reporting in compat siginfo
parents 07c7016d 7f00f388
...@@ -30,8 +30,10 @@ static int __init vdso32_setup(char *s) ...@@ -30,8 +30,10 @@ static int __init vdso32_setup(char *s)
{ {
vdso32_enabled = simple_strtoul(s, NULL, 0); vdso32_enabled = simple_strtoul(s, NULL, 0);
if (vdso32_enabled > 1) if (vdso32_enabled > 1) {
pr_warn("vdso32 values other than 0 and 1 are no longer allowed; vdso disabled\n"); pr_warn("vdso32 values other than 0 and 1 are no longer allowed; vdso disabled\n");
vdso32_enabled = 0;
}
return 1; return 1;
} }
...@@ -62,13 +64,18 @@ subsys_initcall(sysenter_setup); ...@@ -62,13 +64,18 @@ subsys_initcall(sysenter_setup);
/* Register vsyscall32 into the ABI table */ /* Register vsyscall32 into the ABI table */
#include <linux/sysctl.h> #include <linux/sysctl.h>
static const int zero;
static const int one = 1;
static struct ctl_table abi_table2[] = { static struct ctl_table abi_table2[] = {
{ {
.procname = "vsyscall32", .procname = "vsyscall32",
.data = &vdso32_enabled, .data = &vdso32_enabled,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec .proc_handler = proc_dointvec_minmax,
.extra1 = (int *)&zero,
.extra2 = (int *)&one,
}, },
{} {}
}; };
......
...@@ -287,7 +287,7 @@ struct task_struct; ...@@ -287,7 +287,7 @@ struct task_struct;
#define ARCH_DLINFO_IA32 \ #define ARCH_DLINFO_IA32 \
do { \ do { \
if (vdso32_enabled) { \ if (VDSO_CURRENT_BASE) { \
NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \ NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \
NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \ NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \
} \ } \
......
...@@ -200,11 +200,11 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of, ...@@ -200,11 +200,11 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of,
} }
out: out:
rdtgroup_kn_unlock(of->kn);
for_each_enabled_rdt_resource(r) { for_each_enabled_rdt_resource(r) {
kfree(r->tmp_cbms); kfree(r->tmp_cbms);
r->tmp_cbms = NULL; r->tmp_cbms = NULL;
} }
rdtgroup_kn_unlock(of->kn);
return ret ?: nbytes; return ret ?: nbytes;
} }
......
...@@ -846,7 +846,7 @@ void signal_fault(struct pt_regs *regs, void __user *frame, char *where) ...@@ -846,7 +846,7 @@ void signal_fault(struct pt_regs *regs, void __user *frame, char *where)
task_pid_nr(current) > 1 ? KERN_INFO : KERN_EMERG, task_pid_nr(current) > 1 ? KERN_INFO : KERN_EMERG,
me->comm, me->pid, where, frame, me->comm, me->pid, where, frame,
regs->ip, regs->sp, regs->orig_ax); regs->ip, regs->sp, regs->orig_ax);
print_vma_addr(" in ", regs->ip); print_vma_addr(KERN_CONT " in ", regs->ip);
pr_cont("\n"); pr_cont("\n");
} }
......
...@@ -151,8 +151,8 @@ int __copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from, ...@@ -151,8 +151,8 @@ int __copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from,
if (from->si_signo == SIGSEGV) { if (from->si_signo == SIGSEGV) {
if (from->si_code == SEGV_BNDERR) { if (from->si_code == SEGV_BNDERR) {
compat_uptr_t lower = (unsigned long)&to->si_lower; compat_uptr_t lower = (unsigned long)from->si_lower;
compat_uptr_t upper = (unsigned long)&to->si_upper; compat_uptr_t upper = (unsigned long)from->si_upper;
put_user_ex(lower, &to->si_lower); put_user_ex(lower, &to->si_lower);
put_user_ex(upper, &to->si_upper); put_user_ex(upper, &to->si_upper);
} }
......
...@@ -255,7 +255,7 @@ do_trap(int trapnr, int signr, char *str, struct pt_regs *regs, ...@@ -255,7 +255,7 @@ do_trap(int trapnr, int signr, char *str, struct pt_regs *regs,
pr_info("%s[%d] trap %s ip:%lx sp:%lx error:%lx", pr_info("%s[%d] trap %s ip:%lx sp:%lx error:%lx",
tsk->comm, tsk->pid, str, tsk->comm, tsk->pid, str,
regs->ip, regs->sp, error_code); regs->ip, regs->sp, error_code);
print_vma_addr(" in ", regs->ip); print_vma_addr(KERN_CONT " in ", regs->ip);
pr_cont("\n"); pr_cont("\n");
} }
...@@ -519,7 +519,7 @@ do_general_protection(struct pt_regs *regs, long error_code) ...@@ -519,7 +519,7 @@ do_general_protection(struct pt_regs *regs, long error_code)
pr_info("%s[%d] general protection ip:%lx sp:%lx error:%lx", pr_info("%s[%d] general protection ip:%lx sp:%lx error:%lx",
tsk->comm, task_pid_nr(tsk), tsk->comm, task_pid_nr(tsk),
regs->ip, regs->sp, error_code); regs->ip, regs->sp, error_code);
print_vma_addr(" in ", regs->ip); print_vma_addr(KERN_CONT " in ", regs->ip);
pr_cont("\n"); pr_cont("\n");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment