diff options
author | Christophe Lyon <christophe.lyon@st.com> | 2018-07-04 18:09:21 +0200 |
---|---|---|
committer | Waldemar Brodkorb <wbrodkorb@conet.de> | 2018-08-10 16:02:45 +0200 |
commit | 13c46fbc1e5a021f2b9ed32d83aecc93ae5e655d (patch) | |
tree | f0a1fcaae2a55772820e8cf3283caf8f03f60929 | |
parent | 1a2cdf20c9c47ddacb6370431f676fd55bfbfebb (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.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/ldso/ldso/arm/elfinterp.c b/ldso/ldso/arm/elfinterp.c index 1d79d925b..4c268356f 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); } |