Messages in this thread | | | Date | Thu, 23 May 2019 22:35:05 +0300 | From | Alexey Dobriyan <> | 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@gmail.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.
| |