gelf_getauxv and gelf_update_auxv check whether the given ndx fits
checking whether the multiplication of the ndx by the sizeof type is
larger than d_size. But these multiplications can overflow. Use the
INVALID_NDX macro instead.
* libelf/gelf_getauxv.c (gelf_getauxv): Check using INVALID_NDX.
* libelf/gelf_update_auxv.c (gelf_update_auxv): Likewise.
Signed-off-by: Mark Wielaard <[email protected]>
---
libelf/gelf_getauxv.c | 4 ++--
libelf/gelf_update_auxv.c | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/libelf/gelf_getauxv.c b/libelf/gelf_getauxv.c
index 405ec6465c83..d3a178b5fc46 100644
--- a/libelf/gelf_getauxv.c
+++ b/libelf/gelf_getauxv.c
@@ -67,7 +67,7 @@ gelf_getauxv (Elf_Data *data, int ndx, GElf_auxv_t *dst)
entries has to be converted. The user better have provided a
buffer where we can store the information. While copying the data
we convert the format. */
- if (unlikely ((ndx + 1) * sizeof (Elf32_auxv_t) > data_scn->d.d_size))
+ if (INVALID_NDX (ndx, Elf32_auxv_t, &data_scn->d))
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
@@ -87,7 +87,7 @@ gelf_getauxv (Elf_Data *data, int ndx, GElf_auxv_t *dst)
/* The data is already in the correct form. Just make sure the
index is OK. */
- if (unlikely ((ndx + 1) * sizeof (GElf_auxv_t) > data_scn->d.d_size))
+ if (INVALID_NDX (ndx, GElf_auxv_t, &data_scn->d))
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
diff --git a/libelf/gelf_update_auxv.c b/libelf/gelf_update_auxv.c
index e4e5229c623f..1254ef466b36 100644
--- a/libelf/gelf_update_auxv.c
+++ b/libelf/gelf_update_auxv.c
@@ -76,7 +76,7 @@ gelf_update_auxv (Elf_Data *data, int ndx, GElf_auxv_t *src)
}
/* Check whether we have to resize the data buffer. */
- if (unlikely ((ndx + 1) * sizeof (Elf32_auxv_t) > data_scn->d.d_size))
+ if (INVALID_NDX (ndx, Elf32_auxv_t, &data_scn->d))
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
@@ -90,7 +90,7 @@ gelf_update_auxv (Elf_Data *data, int ndx, GElf_auxv_t *src)
else
{
/* Check whether we have to resize the data buffer. */
- if (unlikely ((ndx + 1) * sizeof (Elf64_auxv_t) > data_scn->d.d_size))
+ if (INVALID_NDX (ndx, Elf64_auxv_t, &data_scn->d))
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--
2.56.0