lib/buildid.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
Neither ELF spec not ELF loader require program header to be placed
right after ELF header, but build-id code very much assumes such placement:
See
find_get_page(vma->vm_file->f_mapping, 0);
line and checks against PAGE_SIZE.
Returns errors for now until someone rewrites build-id parser
to be more inline with load_elf_binary().
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
---
lib/buildid.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
--- a/lib/buildid.c
+++ b/lib/buildid.c
@@ -73,6 +73,13 @@ static int get_build_id_32(const void *page_addr, unsigned char *build_id,
Elf32_Phdr *phdr;
int i;
+ /*
+ * FIXME
+ * Neither ELF spec nor ELF loader require that program headers
+ * start immediately after ELF header.
+ */
+ if (ehdr->e_phoff != sizeof(Elf32_Ehdr))
+ return -EINVAL;
/* only supports phdr that fits in one page */
if (ehdr->e_phnum >
(PAGE_SIZE - sizeof(Elf32_Ehdr)) / sizeof(Elf32_Phdr))
@@ -98,6 +105,13 @@ static int get_build_id_64(const void *page_addr, unsigned char *build_id,
Elf64_Phdr *phdr;
int i;
+ /*
+ * FIXME
+ * Neither ELF spec nor ELF loader require that program headers
+ * start immediately after ELF header.
+ */
+ if (ehdr->e_phoff != sizeof(Elf64_Ehdr))
+ return -EINVAL;
/* only supports phdr that fits in one page */
if (ehdr->e_phnum >
(PAGE_SIZE - sizeof(Elf64_Ehdr)) / sizeof(Elf64_Phdr))
ccing bpf list On Fri, Jun 21, 2024 at 09:39:33PM +0300, Alexey Dobriyan wrote: > Neither ELF spec not ELF loader require program header to be placed > right after ELF header, but build-id code very much assumes such placement: > > See > > find_get_page(vma->vm_file->f_mapping, 0); > > line and checks against PAGE_SIZE. > > Returns errors for now until someone rewrites build-id parser > to be more inline with load_elf_binary(). > > Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> > --- > > lib/buildid.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > --- a/lib/buildid.c > +++ b/lib/buildid.c > @@ -73,6 +73,13 @@ static int get_build_id_32(const void *page_addr, unsigned char *build_id, > Elf32_Phdr *phdr; > int i; > > + /* > + * FIXME nit, FIXME is usually on the same line as the rest of the comment, otherwise looks good Reviewed-by: Jiri Olsa <jolsa@kernel.org> thanks, jirka > + * Neither ELF spec nor ELF loader require that program headers > + * start immediately after ELF header. > + */ > + if (ehdr->e_phoff != sizeof(Elf32_Ehdr)) > + return -EINVAL; > /* only supports phdr that fits in one page */ > if (ehdr->e_phnum > > (PAGE_SIZE - sizeof(Elf32_Ehdr)) / sizeof(Elf32_Phdr)) > @@ -98,6 +105,13 @@ static int get_build_id_64(const void *page_addr, unsigned char *build_id, > Elf64_Phdr *phdr; > int i; > > + /* > + * FIXME > + * Neither ELF spec nor ELF loader require that program headers > + * start immediately after ELF header. > + */ > + if (ehdr->e_phoff != sizeof(Elf64_Ehdr)) > + return -EINVAL; > /* only supports phdr that fits in one page */ > if (ehdr->e_phnum > > (PAGE_SIZE - sizeof(Elf64_Ehdr)) / sizeof(Elf64_Phdr))
On Mon, Jun 24, 2024 at 4:23 AM Jiri Olsa <olsajiri@gmail.com> wrote: > > ccing bpf list > > On Fri, Jun 21, 2024 at 09:39:33PM +0300, Alexey Dobriyan wrote: > > Neither ELF spec not ELF loader require program header to be placed > > right after ELF header, but build-id code very much assumes such placement: > > > > See > > > > find_get_page(vma->vm_file->f_mapping, 0); > > > > line and checks against PAGE_SIZE. > > > > Returns errors for now until someone rewrites build-id parser > > to be more inline with load_elf_binary(). > > > > Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> > > --- > > > > lib/buildid.c | 14 ++++++++++++++ > > 1 file changed, 14 insertions(+) > > LGTM, but let's please route this through the bpf-next/master tree. Can you please send it to bpf@vger.kernel.org? Acked-by: Andrii Nakryiko <andrii@kernel.org> > > --- a/lib/buildid.c > > +++ b/lib/buildid.c > > @@ -73,6 +73,13 @@ static int get_build_id_32(const void *page_addr, unsigned char *build_id, > > Elf32_Phdr *phdr; > > int i; > > > > + /* > > + * FIXME > > nit, FIXME is usually on the same line as the rest of the comment, > otherwise looks good > > Reviewed-by: Jiri Olsa <jolsa@kernel.org> > > thanks, > jirka > > > > + * Neither ELF spec nor ELF loader require that program headers > > + * start immediately after ELF header. > > + */ > > + if (ehdr->e_phoff != sizeof(Elf32_Ehdr)) > > + return -EINVAL; > > /* only supports phdr that fits in one page */ > > if (ehdr->e_phnum > > > (PAGE_SIZE - sizeof(Elf32_Ehdr)) / sizeof(Elf32_Phdr)) > > @@ -98,6 +105,13 @@ static int get_build_id_64(const void *page_addr, unsigned char *build_id, > > Elf64_Phdr *phdr; > > int i; > > > > + /* > > + * FIXME > > + * Neither ELF spec nor ELF loader require that program headers > > + * start immediately after ELF header. > > + */ > > + if (ehdr->e_phoff != sizeof(Elf64_Ehdr)) > > + return -EINVAL; > > /* only supports phdr that fits in one page */ > > if (ehdr->e_phnum > > > (PAGE_SIZE - sizeof(Elf64_Ehdr)) / sizeof(Elf64_Phdr)) >
© 2016 - 2025 Red Hat, Inc.