[CRIU] [PATCH] arm: don't use the register R12 in the routine syscall_common()

Alexander Kartashov alekskartashov at parallels.com
Wed Sep 25 05:10:29 EDT 2013


The register R12 has a special meaning when syscalls are hooked
with ptrace() in ARM that results in a dumpee context corruption
on an injected blob unmap. Note that this patch doesn't solve
the problem entirely since the compiler may corrupt the register
before issuing a call to the routine sys_munmap(); however
we assume that a sufficiently decent compiler doesn't.

Signed-off-by: Alexander Kartashov <alekskartashov at parallels.com>
Tested-by: Andrew Vagin <avagin at parallels.com>
---
 arch/arm/syscall-common.S |   16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/arch/arm/syscall-common.S b/arch/arm/syscall-common.S
index 09f8a27..c3cbf71 100644
--- a/arch/arm/syscall-common.S
+++ b/arch/arm/syscall-common.S
@@ -1,12 +1,18 @@
 #include "asm/linkage.h"
 
+@ We use the register R8 unlike libc that uses R12.
+@ This avoids corruption of the register by the stub
+@ for the syscall sys_munmap() when syscalls are hooked
+@ by ptrace(). However we have to make sure that
+@ the compiler doesn't use the register on the route
+@ between parasite_service() and sys_munmap().
+
 syscall_common:
 	ldr	%r7, [%r7]
-	add	%ip, %sp, #16
-	ldm	%ip, {%r4, %r5, %r6}
+	add	%r8, %sp, #24
+	ldm	%r8, {%r4, %r5, %r6}
 	svc	0x00000000
-	pop	{%r4, %r5, %r6, %r7}
-	bx	%lr
+	pop	{%r4, %r5, %r6, %r7, %r8, %pc}
 
 
 .macro syscall name, nr
@@ -14,7 +20,7 @@ syscall_common:
 		.long \nr
 
 	ENTRY(\name)
-		push	{%r4, %r5, %r6, %r7}
+		push	{%r4, %r5, %r6, %r7, %r8, %lr}
 		adr		%r7, .nr_\name
 		b		syscall_common
 	END(\name)
-- 
1.7.9.5



More information about the CRIU mailing list