|
From: Michael F. <mf...@mf...> - 2021-05-01 22:00:35
|
Michael Forney <mf...@mf...> wrote:
> I agree that the sanity check is good in general, but I have to
> wonder if it makes sense to fail if the section type is just not
> yet set (SHT_NULL), since that does not necessarily indicate an
> application error.
Alternatively, an arguably better check is to make sure the Elf_Data
has d_type == ELF_T_REL(A). What are your thoughts on that?
diff --git a/libelf/gelf_rel.c b/libelf/gelf_rel.c
index 60332597..3ff48647 100644
--- a/libelf/gelf_rel.c
+++ b/libelf/gelf_rel.c
@@ -42,7 +42,6 @@ gelf_getrel(Elf_Data *ed, int ndx, GElf_Rel *dst)
Elf *e;
size_t msz;
Elf_Scn *scn;
- uint32_t sh_type;
Elf32_Rel *rel32;
Elf64_Rel *rel64;
struct _Libelf_Data *d;
@@ -59,12 +58,7 @@ gelf_getrel(Elf_Data *ed, int ndx, GElf_Rel *dst)
ec = e->e_class;
assert(ec == ELFCLASS32 || ec == ELFCLASS64);
- if (ec == ELFCLASS32)
- sh_type = scn->s_shdr.s_shdr32.sh_type;
- else
- sh_type = scn->s_shdr.s_shdr64.sh_type;
-
- if (_libelf_xlate_shtype(sh_type) != ELF_T_REL) {
+ if (d->d_data.d_type != ELF_T_REL) {
LIBELF_SET_ERROR(ARGUMENT, 0);
return (NULL);
}
@@ -104,7 +98,6 @@ gelf_update_rel(Elf_Data *ed, int ndx, GElf_Rel *dr)
Elf *e;
size_t msz;
Elf_Scn *scn;
- uint32_t sh_type;
Elf32_Rel *rel32;
Elf64_Rel *rel64;
struct _Libelf_Data *d;
@@ -121,12 +114,7 @@ gelf_update_rel(Elf_Data *ed, int ndx, GElf_Rel *dr)
ec = e->e_class;
assert(ec == ELFCLASS32 || ec == ELFCLASS64);
- if (ec == ELFCLASS32)
- sh_type = scn->s_shdr.s_shdr32.sh_type;
- else
- sh_type = scn->s_shdr.s_shdr64.sh_type;
-
- if (_libelf_xlate_shtype(sh_type) != ELF_T_REL) {
+ if (d->d_data.d_type != ELF_T_REL) {
LIBELF_SET_ERROR(ARGUMENT, 0);
return (0);
}
diff --git a/libelf/gelf_rela.c b/libelf/gelf_rela.c
index 40462248..71d7e82a 100644
--- a/libelf/gelf_rela.c
+++ b/libelf/gelf_rela.c
@@ -42,7 +42,6 @@ gelf_getrela(Elf_Data *ed, int ndx, GElf_Rela *dst)
Elf *e;
size_t msz;
Elf_Scn *scn;
- uint32_t sh_type;
Elf32_Rela *rela32;
Elf64_Rela *rela64;
struct _Libelf_Data *d;
@@ -59,12 +58,7 @@ gelf_getrela(Elf_Data *ed, int ndx, GElf_Rela *dst)
ec = e->e_class;
assert(ec == ELFCLASS32 || ec == ELFCLASS64);
- if (ec == ELFCLASS32)
- sh_type = scn->s_shdr.s_shdr32.sh_type;
- else
- sh_type = scn->s_shdr.s_shdr64.sh_type;
-
- if (_libelf_xlate_shtype(sh_type) != ELF_T_RELA) {
+ if (d->d_data.d_type != ELF_T_RELA) {
LIBELF_SET_ERROR(ARGUMENT, 0);
return (NULL);
}
@@ -105,7 +99,6 @@ gelf_update_rela(Elf_Data *ed, int ndx, GElf_Rela *dr)
Elf *e;
size_t msz;
Elf_Scn *scn;
- uint32_t sh_type;
Elf32_Rela *rela32;
Elf64_Rela *rela64;
struct _Libelf_Data *d;
@@ -122,12 +115,7 @@ gelf_update_rela(Elf_Data *ed, int ndx, GElf_Rela *dr)
ec = e->e_class;
assert(ec == ELFCLASS32 || ec == ELFCLASS64);
- if (ec == ELFCLASS32)
- sh_type = scn->s_shdr.s_shdr32.sh_type;
- else
- sh_type = scn->s_shdr.s_shdr64.sh_type;
-
- if (_libelf_xlate_shtype(sh_type) != ELF_T_RELA) {
+ if (d->d_data.d_type != ELF_T_RELA) {
LIBELF_SET_ERROR(ARGUMENT, 0);
return (0);
}
|