]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
riscv64: Add hardwire for ld-linux-riscv64-lp64d.so.1 strcmp
authorMark Wielaard <mark@klomp.org>
Sat, 28 Dec 2024 00:29:58 +0000 (01:29 +0100)
committerMark Wielaard <mark@klomp.org>
Tue, 25 Feb 2025 20:40:19 +0000 (21:40 +0100)
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.

coregrind/m_redir.c
coregrind/m_trampoline.S
coregrind/pub_core_trampoline.h

index 958f3e7c46228e483535ea4671aa0db88a8de9be..5e7bc42f9757f2b7cb8b816cb44cf57924797523 100644 (file)
@@ -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)
index c506070d6ac7f22216ac22be8937654e94d04780..4860a2259f0bc587abb8173f5bb49b7c0933a210 100644 (file)
@@ -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):
 
index 7e9e2d76be8daa59f9fc04cbaa8f5e88a68c85a4..db497c51a51c35188c29ed9dcc8881154c7972d7 100644 (file)
@@ -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)