[CRIU] [PATCH 6/8] compel: Do not loose sign of result in compat syscall

Cyrill Gorcunov gorcunov at openvz.org
Wed Nov 1 16:19:23 MSK 2017


From: Cyrill Gorcunov <gorcunov at virtuozzo.com>

Regs are present in unsigned format so convert them
into signed first to provide results.

In particular if memfd_create syscall failed we won't
notice -ENOMEM error but rather treat it as unsigned
hex value

 | (05.303002) Putting parasite blob into 0x7f1c6ffe0000->0xfffffff4
 | (05.303234) Putting tsock into pid 42773

Signed-off-by: Cyrill Gorcunov <gorcunov at virtuozzo.com>
---
 compel/arch/x86/src/lib/infect.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/compel/arch/x86/src/lib/infect.c b/compel/arch/x86/src/lib/infect.c
index 9c919e64ef13..e546ee376d41 100644
--- a/compel/arch/x86/src/lib/infect.c
+++ b/compel/arch/x86/src/lib/infect.c
@@ -293,9 +293,10 @@ int compel_syscall(struct parasite_ctl *ctl, int nr, long *ret,
 		unsigned long arg6)
 {
 	user_regs_struct_t regs = ctl->orig.regs;
+	bool native = user_regs_native(&regs);
 	int err;
 
-	if (user_regs_native(&regs)) {
+	if (native) {
 		user_regs_struct64 *r = &regs.native;
 
 		r->ax  = (uint64_t)nr;
@@ -321,7 +322,9 @@ int compel_syscall(struct parasite_ctl *ctl, int nr, long *ret,
 		err = compel_execute_syscall(ctl, &regs, code_int_80);
 	}
 
-	*ret = get_user_reg(&regs, ax);
+	*ret = native ?
+		(long)get_user_reg(&regs, ax) :
+		(int)get_user_reg(&regs, ax);
 	return err;
 }
 
@@ -345,6 +348,13 @@ void *remote_mmap(struct parasite_ctl *ctl,
 		return NULL;
 	}
 
+	/*
+	 * For compat tasks the address in foreign process
+	 * must lay inside 4 bytes.
+	 */
+	if (compat_task)
+		map &= 0xfffffffful;
+
 	return (void *)map;
 }
 
-- 
2.7.5



More information about the CRIU mailing list