diff options
Diffstat (limited to 'rtemstoolkit/elftoolchain/libelf/gelf_dyn.c')
-rw-r--r-- | rtemstoolkit/elftoolchain/libelf/gelf_dyn.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/rtemstoolkit/elftoolchain/libelf/gelf_dyn.c b/rtemstoolkit/elftoolchain/libelf/gelf_dyn.c index 6a2885c..7423309 100644 --- a/rtemstoolkit/elftoolchain/libelf/gelf_dyn.c +++ b/rtemstoolkit/elftoolchain/libelf/gelf_dyn.c @@ -24,25 +24,28 @@ * SUCH DAMAGE. */ -#include <sys/cdefs.h> - #include <assert.h> #include <gelf.h> +#include <limits.h> +#include <stdint.h> #include "_libelf.h" -LIBELF_VCSID("$Id: gelf_dyn.c 189 2008-07-20 10:38:08Z jkoshy $"); +ELFTC_VCSID("$Id: gelf_dyn.c 3177 2015-03-30 18:19:41Z emaste $"); GElf_Dyn * -gelf_getdyn(Elf_Data *d, int ndx, GElf_Dyn *dst) +gelf_getdyn(Elf_Data *ed, int ndx, GElf_Dyn *dst) { int ec; Elf *e; + size_t msz; Elf_Scn *scn; Elf32_Dyn *dyn32; Elf64_Dyn *dyn64; - size_t msz; uint32_t sh_type; + struct _Libelf_Data *d; + + d = (struct _Libelf_Data *) ed; if (d == NULL || ndx < 0 || dst == NULL || (scn = d->d_scn) == NULL || @@ -67,21 +70,22 @@ gelf_getdyn(Elf_Data *d, int ndx, GElf_Dyn *dst) msz = _libelf_msize(ELF_T_DYN, ec, e->e_version); assert(msz > 0); + assert(ndx >= 0); - if (msz * ndx >= d->d_size) { + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (NULL); } if (ec == ELFCLASS32) { - dyn32 = (Elf32_Dyn *) d->d_buf + ndx; + dyn32 = (Elf32_Dyn *) d->d_data.d_buf + ndx; dst->d_tag = dyn32->d_tag; dst->d_un.d_val = (Elf64_Xword) dyn32->d_un.d_val; } else { - dyn64 = (Elf64_Dyn *) d->d_buf + ndx; + dyn64 = (Elf64_Dyn *) d->d_data.d_buf + ndx; *dst = *dyn64; } @@ -90,15 +94,18 @@ gelf_getdyn(Elf_Data *d, int ndx, GElf_Dyn *dst) } int -gelf_update_dyn(Elf_Data *d, int ndx, GElf_Dyn *ds) +gelf_update_dyn(Elf_Data *ed, int ndx, GElf_Dyn *ds) { int ec; Elf *e; + size_t msz; Elf_Scn *scn; Elf32_Dyn *dyn32; Elf64_Dyn *dyn64; - size_t msz; uint32_t sh_type; + struct _Libelf_Data *d; + + d = (struct _Libelf_Data *) ed; if (d == NULL || ndx < 0 || ds == NULL || (scn = d->d_scn) == NULL || @@ -121,20 +128,22 @@ gelf_update_dyn(Elf_Data *d, int ndx, GElf_Dyn *ds) } msz = _libelf_msize(ELF_T_DYN, ec, e->e_version); + assert(msz > 0); + assert(ndx >= 0); - if (msz * ndx >= d->d_size) { + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (0); } if (ec == ELFCLASS32) { - dyn32 = (Elf32_Dyn *) d->d_buf + ndx; + dyn32 = (Elf32_Dyn *) d->d_data.d_buf + ndx; LIBELF_COPY_S32(dyn32, ds, d_tag); LIBELF_COPY_U32(dyn32, ds, d_un.d_val); } else { - dyn64 = (Elf64_Dyn *) d->d_buf + ndx; + dyn64 = (Elf64_Dyn *) d->d_data.d_buf + ndx; *dyn64 = *ds; } |