Re: [PATCH] x86/vdso: ensure vdso32_enabled gets set to valid values only

From: Thomas Gleixner
Date: Mon Apr 10 2017 - 09:41:53 EST


On Mon, 10 Apr 2017, Thomas Gleixner wrote:

> On Wed, 5 Apr 2017, Mathias Krause wrote:
> > @@ -62,13 +64,18 @@ int __init sysenter_setup(void)
> > /* Register vsyscall32 into the ABI table */
> > #include <linux/sysctl.h>
> >
> > +static const int zero;
> > +static const int one = 1;
> > +
> > static struct ctl_table abi_table2[] = {
> > {
> > .procname = "vsyscall32",
> > .data = &vdso32_enabled,
> > .maxlen = sizeof(int),
> > .mode = 0644,
> > - .proc_handler = proc_dointvec
> > + .proc_handler = proc_dointvec_minmax,
> > + .extra1 = (int *)&zero,
> > + .extra2 = (int *)&one,
>
> This is still bustable. Let's start with: vdso32_enabled = false
>
> arch_setup_additional_pages()
> --> No mapping
>
> sysctl.vsysscall32()
> --> vdso32_enabled = true
>
> create_elf_tables()
> if (vdso32_enabled) {
> --> Add VDSO entry with NULL pointer
>
> The vdso map code needs to store a flag in current which can be checked in
> ARCH_DLINFO_IA32.

It's ways simpler. Patch below.

Thanks,

tglx

--- a/arch/x86/include/asm/elf.h
+++ b/arch/x86/include/asm/elf.h
@@ -287,7 +287,7 @@ struct task_struct;

#define ARCH_DLINFO_IA32 \
do { \
- if (vdso32_enabled) { \
+ if (VDSO_CURRENT_BASE) { \
NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \
NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \
} \