summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@st.com>2018-07-04 16:09:21 (GMT)
committerWaldemar Brodkorb <wbrodkorb@conet.de>2018-08-10 14:02:45 (GMT)
commit13c46fbc1e5a021f2b9ed32d83aecc93ae5e655d (patch)
treef0a1fcaae2a55772820e8cf3283caf8f03f60929
parent1a2cdf20c9c47ddacb6370431f676fd55bfbfebb (diff)
rtld: Avoid crash on R_ARM_NONE relocation
R_ARM_NONE contains no data, so avoid dereferencing it. * ldso/ldso/arm/elfinterp.c (_dl_do_reloc): Handle R_ARM_NONE relocation (_dl_do_reloc_lazy): Likewise. Signed-off-by: Mickaël Guêné <mickael.guene@st.com> Signed-off-by: Christophe Lyon <christophe.lyon@st.com>
-rw-r--r--ldso/ldso/arm/elfinterp.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/ldso/ldso/arm/elfinterp.c b/ldso/ldso/arm/elfinterp.c
index 1d79d92..4c26835 100644
--- a/ldso/ldso/arm/elfinterp.c
+++ b/ldso/ldso/arm/elfinterp.c
@@ -289,7 +289,10 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct r_scope_elem *scope,
#if defined (__SUPPORT_LD_DEBUG__)
{
- unsigned long old_val = *reloc_addr;
+ unsigned long old_val;
+
+ if (reloc_type != R_ARM_NONE)
+ old_val = *reloc_addr;
#endif
switch (reloc_type) {
case R_ARM_NONE:
@@ -388,7 +391,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct r_scope_elem *scope,
return -1; /*call _dl_exit(1) */
}
#if defined (__SUPPORT_LD_DEBUG__)
- if (_dl_debug_reloc && _dl_debug_detail)
+ if (_dl_debug_reloc && _dl_debug_detail && reloc_type != R_ARM_NONE)
_dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr);
}
@@ -409,7 +412,10 @@ _dl_do_lazy_reloc (struct elf_resolve *tpnt, struct r_scope_elem *scope,
#if defined (__SUPPORT_LD_DEBUG__)
{
- unsigned long old_val = *reloc_addr;
+ unsigned long old_val;
+
+ if (reloc_type != R_ARM_NONE)
+ old_val = *reloc_addr;
#endif
switch (reloc_type) {
case R_ARM_NONE:
@@ -432,7 +438,7 @@ _dl_do_lazy_reloc (struct elf_resolve *tpnt, struct r_scope_elem *scope,
return -1; /*call _dl_exit(1) */
}
#if defined (__SUPPORT_LD_DEBUG__)
- if (_dl_debug_reloc && _dl_debug_detail)
+ if (_dl_debug_reloc && _dl_debug_detail && reloc_type != R_ARM_NONE)
_dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr);
}