lib/buildid.c | 6 ++++++ 1 file changed, 6 insertions(+)
ELF spec doesn't require program header to be placed right after
ELF header, but build-id code very much assumes such placement:
find_get_page(vma->vm_file->f_mapping, 0);
and later check against PAGE_SIZE.
Returns errors for now until someone rewrites build-id parser
to be more correct.
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
---
lib/buildid.c | 6 ++++++
1 file changed, 6 insertions(+)
--- a/lib/buildid.c
+++ b/lib/buildid.c
@@ -73,6 +73,9 @@ static int get_build_id_32(const void *page_addr, unsigned char *build_id,
Elf32_Phdr *phdr;
int i;
+ 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 +101,9 @@ static int get_build_id_64(const void *page_addr, unsigned char *build_id,
Elf64_Phdr *phdr;
int i;
+ 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 Fri, 21 Jun 2024 18:05:50 +0300 Alexey Dobriyan <adobriyan@gmail.com> wrote:
> ELF spec doesn't require program header to be placed right after
> ELF header, but build-id code very much assumes such placement:
>
> find_get_page(vma->vm_file->f_mapping, 0);
>
> and later check against PAGE_SIZE.
>
> Returns errors for now until someone rewrites build-id parser
> to be more correct.
>
> ...
>
> --- a/lib/buildid.c
> +++ b/lib/buildid.c
> @@ -73,6 +73,9 @@ static int get_build_id_32(const void *page_addr, unsigned char *build_id,
> Elf32_Phdr *phdr;
> int i;
>
> + 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 +101,9 @@ static int get_build_id_64(const void *page_addr, unsigned char *build_id,
> Elf64_Phdr *phdr;
> int i;
>
> + 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))
Well can we get comments in here eplaining the shortcoming? That way
we're more likely to get a volunteer.
And please drop the braces?
On Fri, Jun 21, 2024 at 10:07:52AM -0700, Andrew Morton wrote:
> On Fri, 21 Jun 2024 18:05:50 +0300 Alexey Dobriyan <adobriyan@gmail.com> wrote:
>
> > ELF spec doesn't require program header to be placed right after
> > ELF header, but build-id code very much assumes such placement:
> >
> > find_get_page(vma->vm_file->f_mapping, 0);
> >
> > and later check against PAGE_SIZE.
> >
> > Returns errors for now until someone rewrites build-id parser
> > to be more correct.
> >
> > ...
> >
> > --- a/lib/buildid.c
> > +++ b/lib/buildid.c
> > @@ -73,6 +73,9 @@ static int get_build_id_32(const void *page_addr, unsigned char *build_id,
> > Elf32_Phdr *phdr;
> > int i;
> >
> > + 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 +101,9 @@ static int get_build_id_64(const void *page_addr, unsigned char *build_id,
> > Elf64_Phdr *phdr;
> > int i;
> >
> > + 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))
>
> Well can we get comments in here eplaining the shortcoming? That way
> we're more likely to get a volunteer.
Sure.
> And please drop the braces?
Bracers are good. It took hundred years to drop -Wdeclaration-after-statement,
I hope to see mandatory bracers by 2050.
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.