Elf_Data with d_align of zero passed the alignment check. But an
alignment of zero would cause the padding calculation to be wrong
(resulting in a zero offset). Clamp d_align of zero to one before the
alignment check, the same way sh_addralign of zero is already handled.

Commit c0748eff8473 ("libelf: More checking of valid sh_addralign
values.") fixed a similar issue in elf_getdata. Commit 7369e7d9f171
("elf_newdata: Make sure to set d_type to ELF_T_BYTE and d_align to
one") tried to fix this same issue by making sure elf_newdata set
d_align to one by default.

        * libelf/elf32_updatenull.c (update_null): Clamp data->d_align
        of zero to one before the powerof2 check.

Signed-off-by: Mark Wielaard <[email protected]>
---
 libelf/elf32_updatenull.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c
index 57239ee4ac90..a0a9c3bf3afe 100644
--- a/libelf/elf32_updatenull.c
+++ b/libelf/elf32_updatenull.c
@@ -308,6 +308,10 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int 
*change_bop, size_t shnum)
                          return -1;
                        }
 
+                     /* An alignment of zero would cause the padding
+                        calculation to be wrong.  */
+                     if (data->d_align == 0)
+                       data->d_align = 1;
                      if (unlikely (! powerof2 (data->d_align)))
                        {
                          __libelf_seterrno (ELF_E_INVALID_ALIGN);
-- 
2.56.0

Reply via email to