diff options
Diffstat (limited to 'rtemstoolkit/elftoolchain/libelf/gelf_rela.c')
-rw-r--r-- | rtemstoolkit/elftoolchain/libelf/gelf_rela.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/rtemstoolkit/elftoolchain/libelf/gelf_rela.c b/rtemstoolkit/elftoolchain/libelf/gelf_rela.c index 722c1ad..d485ab9 100644 --- a/rtemstoolkit/elftoolchain/libelf/gelf_rela.c +++ b/rtemstoolkit/elftoolchain/libelf/gelf_rela.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_rela.c 189 2008-07-20 10:38:08Z jkoshy $"); +ELFTC_VCSID("$Id: gelf_rela.c 3177 2015-03-30 18:19:41Z emaste $"); GElf_Rela * -gelf_getrela(Elf_Data *d, int ndx, GElf_Rela *dst) +gelf_getrela(Elf_Data *ed, int ndx, GElf_Rela *dst) { int ec; Elf *e; + size_t msz; Elf_Scn *scn; + uint32_t sh_type; Elf32_Rela *rela32; Elf64_Rela *rela64; - 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,14 +70,15 @@ gelf_getrela(Elf_Data *d, int ndx, GElf_Rela *dst) msz = _libelf_msize(ELF_T_RELA, 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) { - rela32 = (Elf32_Rela *) d->d_buf + ndx; + rela32 = (Elf32_Rela *) d->d_data.d_buf + ndx; dst->r_offset = (Elf64_Addr) rela32->r_offset; dst->r_info = ELF64_R_INFO( @@ -84,7 +88,7 @@ gelf_getrela(Elf_Data *d, int ndx, GElf_Rela *dst) } else { - rela64 = (Elf64_Rela *) d->d_buf + ndx; + rela64 = (Elf64_Rela *) d->d_data.d_buf + ndx; *dst = *rela64; } @@ -93,15 +97,18 @@ gelf_getrela(Elf_Data *d, int ndx, GElf_Rela *dst) } int -gelf_update_rela(Elf_Data *d, int ndx, GElf_Rela *dr) +gelf_update_rela(Elf_Data *ed, int ndx, GElf_Rela *dr) { int ec; Elf *e; + size_t msz; Elf_Scn *scn; + uint32_t sh_type; Elf32_Rela *rela32; Elf64_Rela *rela64; - size_t msz; - uint32_t sh_type; + struct _Libelf_Data *d; + + d = (struct _Libelf_Data *) ed; if (d == NULL || ndx < 0 || dr == NULL || (scn = d->d_scn) == NULL || @@ -124,15 +131,17 @@ gelf_update_rela(Elf_Data *d, int ndx, GElf_Rela *dr) } msz = _libelf_msize(ELF_T_RELA, 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) { - rela32 = (Elf32_Rela *) d->d_buf + ndx; + rela32 = (Elf32_Rela *) d->d_data.d_buf + ndx; LIBELF_COPY_U32(rela32, dr, r_offset); @@ -141,12 +150,13 @@ gelf_update_rela(Elf_Data *d, int ndx, GElf_Rela *dr) LIBELF_SET_ERROR(RANGE, 0); return (0); } - rela32->r_info = ELF32_R_INFO(ELF64_R_SYM(dr->r_info), - ELF64_R_TYPE(dr->r_info)); + rela32->r_info = ELF32_R_INFO( + (Elf32_Word) ELF64_R_SYM(dr->r_info), + (Elf32_Word) ELF64_R_TYPE(dr->r_info)); LIBELF_COPY_S32(rela32, dr, r_addend); } else { - rela64 = (Elf64_Rela *) d->d_buf + ndx; + rela64 = (Elf64_Rela *) d->d_data.d_buf + ndx; *rela64 = *dr; } |