Hi,

On 1/14/26 1:14 PM, Sascha Hauer wrote:
> We currently have only one place which iterates over elf segments, but
> there are more to come, so add an iterator for it.
> 
> Signed-off-by: Sascha Hauer <[email protected]>
> ---
>  common/elf.c  | 8 +++-----
>  include/elf.h | 6 ++++++
>  2 files changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/common/elf.c b/common/elf.c
> index 
> f772018deb3c5a07a9f76bc654e54ff46cc3612e..af73396b351d96489bd6fae1f035d379703ae528
>  100644
> --- a/common/elf.c
> +++ b/common/elf.c
> @@ -161,19 +161,17 @@ static int load_elf_to_memory(struct elf_image *elf)
>  static int load_elf_image_segments(struct elf_image *elf)
>  {
>       void *buf = elf->hdr_buf;
> -     void *phdr = (void *) (buf + elf_hdr_e_phoff(elf, buf));
> -     int i, ret;
> +     void *phdr;
> +     int ret;
>  
>       /* File as already been loaded */
>       if (!list_empty(&elf->list))
>               return -EINVAL;
>  
> -     for (i = 0; i < elf_hdr_e_phnum(elf, buf) ; ++i) {
> +     elf_for_each_segment(phdr, elf, buf) {
>               ret = request_elf_segment(elf, phdr);
>               if (ret)
>                       goto elf_release_regions;
> -
> -             phdr += elf_size_of_phdr(elf);
>       }
>  
>       /*
> diff --git a/include/elf.h b/include/elf.h
> index 
> 994db642b0789942530f6ef7fdffdd2218afd7b6..a062af77004ab7fe730793552d2cce9d5675dd7f
>  100644
> --- a/include/elf.h
> +++ b/include/elf.h
> @@ -439,4 +439,10 @@ static inline unsigned long elf_size_of_phdr(struct 
> elf_image *elf)
>               return sizeof(Elf64_Phdr);
>  }
>  
> +#define elf_for_each_segment(phdr, elf, buf) \
> +     for (phdr = buf + elf_hdr_e_phoff(elf, buf); \
> +          phdr < buf + elf_hdr_e_phoff(elf, buf) + \
> +          elf_hdr_e_phnum(elf, buf) * elf_size_of_phdr(elf); \
> +          phdr += elf_size_of_phdr(elf))

Please cast buf to (void *)buf and either change

        phdr += elf_size_of_phdr(elf))

to
        phdr = (u8 *)phdr + elf_size_of_phdr(elf))

or declare phdr in the for loop.

Otherwise, it's too easy to pass the wrong pointer there and have the
first iteration be correct and the rest wrong.

Thanks,
Ahmad

> +
>  #endif /* _LINUX_ELF_H */
> 

-- 
Pengutronix e.K.                  |                             |
Steuerwalder Str. 21              | http://www.pengutronix.de/  |
31137 Hildesheim, Germany         | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686  | Fax:   +49-5121-206917-5555 |


Reply via email to