From: Mark W. <ma...@so...> - 2025-02-25 20:41:30
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=2d09ef48e22061b143cd4765e8defb63f5d5024a commit 2d09ef48e22061b143cd4765e8defb63f5d5024a Author: Mark Wielaard <ma...@kl...> Date: Sat Dec 28 01:29:58 2024 +0100 riscv64: Add hardwire for ld-linux-riscv64-lp64d.so.1 strcmp When using dlopen ld.so can end up in glibc strcmp_unaligned_loop which causes undefined reads. Hardwire strcmp for ld.so with a simple assembly implementation. Diff: --- coregrind/m_redir.c | 5 +++++ coregrind/m_trampoline.S | 17 +++++++++++++++++ coregrind/pub_core_trampoline.h | 1 + 3 files changed, 23 insertions(+) diff --git a/coregrind/m_redir.c b/coregrind/m_redir.c index 958f3e7c46..5e7bc42f97 100644 --- a/coregrind/m_redir.c +++ b/coregrind/m_redir.c @@ -1714,6 +1714,11 @@ void VG_(redir_initialise) ( void ) (Addr)&VG_(riscv64_linux_REDIR_FOR_index), complain_about_stripped_glibc_ldso ); + add_hardwired_spec( + "ld-linux-riscv64-lp64d.so.1", "strcmp", + (Addr)&VG_(riscv64_linux_REDIR_FOR_strcmp), + complain_about_stripped_glibc_ldso + ); } # elif defined(VGP_x86_solaris) diff --git a/coregrind/m_trampoline.S b/coregrind/m_trampoline.S index c506070d6a..4860a2259f 100644 --- a/coregrind/m_trampoline.S +++ b/coregrind/m_trampoline.S @@ -1647,6 +1647,23 @@ VG_(riscv64_linux_REDIR_FOR_index): ret .size VG_(riscv64_linux_REDIR_FOR_index), .-VG_(riscv64_linux_REDIR_FOR_index) +.global VG_(riscv64_linux_REDIR_FOR_strcmp) +.type VG_(riscv64_linux_REDIR_FOR_strcmp), @function +VG_(riscv64_linux_REDIR_FOR_strcmp): +0: + lbu a5, 0(a0) /* load *s1 */ + lbu a4, 0(a1) /* load *s2 */ + beqz a5, 1f /* check end of s1 */ + beq a5, a4, 2f /* loop if *s1 == *s2 */ +1: + subw a0, a5, a4 /* return value is *s1 - *s2 */ + ret +2: + addi a0, a0, 1 /* next char in s1 */ + addi a1, a1, 1 /* next char in s2 */ + j 0b /* and back to the start */ +.size VG_(riscv64_linux_REDIR_FOR_strcmp), .-VG_(riscv64_linux_REDIR_FOR_strcmp) + .global VG_(trampoline_stuff_end) VG_(trampoline_stuff_end): diff --git a/coregrind/pub_core_trampoline.h b/coregrind/pub_core_trampoline.h index 7e9e2d76be..db497c51a5 100644 --- a/coregrind/pub_core_trampoline.h +++ b/coregrind/pub_core_trampoline.h @@ -180,6 +180,7 @@ extern UInt VG_(nanomips_linux_REDIR_FOR_strlen)( void* ); extern Addr VG_(riscv64_linux_SUBST_FOR_rt_sigreturn); extern HChar* VG_(riscv64_linux_REDIR_FOR_index)( const HChar*, Int ); extern SizeT VG_(riscv64_linux_REDIR_FOR_strlen)( const HChar* ); +extern Int VG_(riscv64_linux_REDIR_FOR_strcmp)( const HChar*, const HChar* ); #endif #if defined(VGP_x86_solaris) |