[CRIU] [PATCH 7/8] restore: Add restoration of alternative signal stack

Cyrill Gorcunov gorcunov at openvz.org
Mon Jun 17 12:47:47 EDT 2013


Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 cr-restore.c       |  7 +++++++
 include/restorer.h |  3 +++
 include/sigframe.h | 16 ++++++++++++++++
 pie/restorer.c     |  9 +++++++++
 sigframe.c         |  2 ++
 5 files changed, 37 insertions(+)

diff --git a/cr-restore.c b/cr-restore.c
index d62c598..24885f1 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -2031,6 +2031,13 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
 	if (prepare_rlimits(pid, task_args))
 		goto err;
 
+	if (core->sas) {
+		task_args->has_sas = true;
+		task_args->sas = *core->sas;
+	} else {
+		task_args->has_sas = false;
+	}
+
 	/*
 	 * Fill up per-thread data.
 	 */
diff --git a/include/restorer.h b/include/restorer.h
index a5c0667..c69d4d1 100644
--- a/include/restorer.h
+++ b/include/restorer.h
@@ -133,6 +133,9 @@ struct task_restore_core_args {
 
 	struct vdso_symtable		vdso_sym_rt;		/* runtime vdso symbols */
 	unsigned long			vdso_rt_parked_at;	/* safe place to keep vdso */
+
+	bool				has_sas;
+	ThreadSasEntry			sas;
 } __aligned(sizeof(long));
 
 #define SHMEMS_SIZE	4096
diff --git a/include/sigframe.h b/include/sigframe.h
index afc2c9d..47bb2fd 100644
--- a/include/sigframe.h
+++ b/include/sigframe.h
@@ -5,6 +5,8 @@
 #ifndef __CR_SIGFRAME_H__
 #define __CR_SIGFRAME_H__
 
+#include "protobuf/core.pb-c.h"
+
 struct rt_sigframe;
 
 #ifndef __ARCH_SI_PREAMBLE_SIZE
@@ -43,4 +45,18 @@ extern int construct_sigframe(struct rt_sigframe *sigframe,
 			      struct rt_sigframe *rsigframe,
 			      CoreEntry *core);
 
+/*
+ * FIXME Convert it to inline helper, which requires
+ *	 to unweave types mess we've generated for
+ *	 run-time data.
+ */
+#define setup_sas(sigframe, sas)							\
+do {											\
+	if ((sas)) {									\
+		(sigframe)->uc.uc_stack.ss_sp	= (void *)decode_pointer((sas)->ss_sp);	\
+		(sigframe)->uc.uc_stack.ss_flags= (int)(sas)->ss_flags;			\
+		(sigframe)->uc.uc_stack.ss_size	= (size_t)(sas)->ss_size;		\
+	}										\
+} while (0)
+
 #endif /* __CR_SIGFRAME_H__ */
diff --git a/pie/restorer.c b/pie/restorer.c
index 06b24a9..ddac648 100644
--- a/pie/restorer.c
+++ b/pie/restorer.c
@@ -733,6 +733,15 @@ long __export_restore_task(struct task_restore_core_args *args)
 		goto core_restore_end;
 
 	/*
+	 * FIXME
+	 * Alternative signal stack for the group leader
+	 * is setting up separately from the threads.
+	 * This better should be unified one day.
+	 */
+	if (args->has_sas)
+		setup_sas(rt_sigframe, &args->sas);
+
+	/*
 	 * Threads restoration. This requires some more comments. This
 	 * restorer routine and thread restorer routine has the following
 	 * memory map, prepared by a caller code.
diff --git a/sigframe.c b/sigframe.c
index 68c9776..5d19be6 100644
--- a/sigframe.c
+++ b/sigframe.c
@@ -31,5 +31,7 @@ int construct_sigframe(struct rt_sigframe *sigframe,
 	if (restore_gpregs(sigframe, CORE_THREAD_ARCH_INFO(core)->gpregs))
 		return -1;
 
+	setup_sas(sigframe, core->sas);
+
 	return 0;
 }
-- 
1.8.1.4



More information about the CRIU mailing list