lkml.org 
[lkml]   [2017]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH v2] MIPS: Add nonxstack=on|off kernel parameter
    From
    Date
    On 11/21/2017 05:56 AM, Aleksandar Markovic wrote:
    > From: Miodrag Dinic <miodrag.dinic@mips.com>
    >
    > Add a new kernel parameter to override the default behavior related
    > to the decision whether to set up stack as non-executable in function
    > mips_elf_read_implies_exec().
    >
    > The new parameter is used to control non executable stack and heap,
    > regardless of PT_GNU_STACK entry. This does apply to both stack and
    > heap, despite the name.
    >
    > Allowed values:
    >
    > nonxstack=on Force non-exec stack & heap
    > nonxstack=off Force executable stack & heap
    >
    > If this parameter is omitted, kernel behavior remains the same as it
    > was before this patch is applied.

    Do other architectures have a similar hack?

    If arm{,64} and x86 don't need this, what would make MIPS so special
    that we have to carry this around?


    >
    > This functionality is convenient during debugging and is especially
    > useful for Android development where non-exec stack is required.

    Why not just set the PT_GNU_STACK flags correctly in the first place?

    >
    > Signed-off-by: Miodrag Dinic <miodrag.dinic@mips.com>
    > Signed-off-by: Aleksandar Markovic <aleksandar.markovic@mips.com>
    > ---
    > Documentation/admin-guide/kernel-parameters.txt | 11 +++++++
    > arch/mips/kernel/elf.c | 39 +++++++++++++++++++++++++
    > 2 files changed, 50 insertions(+)
    >
    > diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
    > index b74e133..99464ee 100644
    > --- a/Documentation/admin-guide/kernel-parameters.txt
    > +++ b/Documentation/admin-guide/kernel-parameters.txt
    > @@ -2614,6 +2614,17 @@
    > noexec32=off: disable non-executable mappings
    > read implies executable mappings
    >
    > + nonxstack [MIPS]
    > + Force setting up stack and heap as non-executable or
    > + executable regardless of PT_GNU_STACK entry. Both
    > + stack and heap are affected, despite the name. Valid
    > + arguments: on, off.
    > + nonxstack=on: Force non-executable stack and heap
    > + nonxstack=off: Force executable stack and heap
    > + If ommited, stack and heap will or will not be set
    > + up as non-executable depending on PT_GNU_STACK
    > + entry and possibly other factors.
    > +
    > nofpu [MIPS,SH] Disable hardware FPU at boot time.
    >
    > nofxsr [BUGS=X86-32] Disables x86 floating point extended
    > diff --git a/arch/mips/kernel/elf.c b/arch/mips/kernel/elf.c
    > index 731325a..28ef7f3 100644
    > --- a/arch/mips/kernel/elf.c
    > +++ b/arch/mips/kernel/elf.c
    > @@ -326,8 +326,47 @@ void mips_set_personality_nan(struct arch_elf_state *state)
    > }
    > }
    >
    > +static int nonxstack = EXSTACK_DEFAULT;
    > +
    > +/*
    > + * kernel parameter: nonxstack=on|off
    > + *
    > + * Force setting up stack and heap as non-executable or
    > + * executable regardless of PT_GNU_STACK entry. Both
    > + * stack and heap are affected, despite the name. Valid
    > + * arguments: on, off.
    > + *
    > + * nonxstack=on: Force non-executable stack and heap
    > + * nonxstack=off: Force executable stack and heap
    > + *
    > + * If ommited, stack and heap will or will not be set
    > + * up as non-executable depending on PT_GNU_STACK
    > + * entry and possibly other factors.
    > + */
    > +static int __init nonxstack_setup(char *str)
    > +{
    > + if (!strcmp(str, "on"))
    > + nonxstack = EXSTACK_DISABLE_X;
    > + else if (!strcmp(str, "off"))
    > + nonxstack = EXSTACK_ENABLE_X;
    > + else
    > + pr_err("Malformed nonxstack format! nonxstack=on|off\n");
    > +
    > + return 1;
    > +}
    > +__setup("nonxstack=", nonxstack_setup);
    > +
    > int mips_elf_read_implies_exec(void *elf_ex, int exstack)
    > {
    > + switch (nonxstack) {
    > + case EXSTACK_DISABLE_X:
    > + return 0;
    > + case EXSTACK_ENABLE_X:
    > + return 1;
    > + default:
    > + break;
    > + }
    > +
    > if (exstack != EXSTACK_DISABLE_X) {
    > /* The binary doesn't request a non-executable stack */
    > return 1;
    >

    \
     
     \ /
      Last update: 2017-11-21 21:54    [W:3.619 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site