[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20190523193505.GA8475@avx2>
Date: Thu, 23 May 2019 22:35:05 +0300
From: Alexey Dobriyan <adobriyan@...il.com>
To: Andrew Morton <akpm@...ux-foundation.org>
Cc: linux-kernel@...r.kernel.org
Subject: Re: [PATCH] elf: fix "start_code" evaluation
On Thu, May 23, 2019 at 11:44:17AM -0700, Andrew Morton wrote:
> On Thu, 23 May 2019 20:57:36 +0300 Alexey Dobriyan <adobriyan@...il.com> wrote:
>
> > Only executable ELF program headers should change ->start_code.
> >
> > ...
> >
> > --- a/fs/binfmt_elf.c
> > +++ b/fs/binfmt_elf.c
> > @@ -1026,7 +1026,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
> > }
> > }
> > k = elf_ppnt->p_vaddr;
> > - if (k < start_code)
> > + if ((elf_ppnt->p_flags & PF_X) && k < start_code)
> > start_code = k;
> > if (start_data < k)
> > start_data = k;
>
> What problem does this solve?
It is a bug. Look at the ->end_code update:
if ((elf_ppnt->p_flags & PF_X) && end_code < k)
end_code = k;
> How does it alter runtime behaviour?
It makes "VmExe" and "VmLib" accounting more accurate for common case.
> How do we know it won't break anything?
We don't. Some distros are unaffected because they ship binaries with
first PT_LOAD segment being executable (Debian 8). Some don't.
Regardless, these fields are lies: ELF binary can have multiple disjoint
PT_LOAD segments, but all those ->start and ->end fields assume everything
is mapped together.
Hopefully nobody actually uses them for anything serious.
Powered by blists - more mailing lists