restore: check a return code of RUN_CLONE_RESTORE_FN

Submitted by Andrey Vagin on May 15, 2018, 8:31 p.m.

Details

Message ID 20180515203112.4996-1-avagin@virtuozzo.com
State Accepted
Series "restore: check a return code of RUN_CLONE_RESTORE_FN"
Headers show

Commit Message

Andrey Vagin May 15, 2018, 8:31 p.m.
Otherwise we can skip an error and then criu will hang on switching to
the next stage.

Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
---
 criu/pie/restorer.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

Patch hide | download patch | download mbox

diff --git a/criu/pie/restorer.c b/criu/pie/restorer.c
index 6b5e9a008..ea79211ba 100644
--- a/criu/pie/restorer.c
+++ b/criu/pie/restorer.c
@@ -1604,6 +1604,8 @@  long __export_restore_task(struct task_restore_args *args)
 
 		for (i = 0; i < args->nr_threads; i++) {
 			char last_pid_buf[16], *s;
+			pid_t pid = 0;
+
 			/* skip self */
 			if (thread_args[i].pid[0] == args->t->pid[0]) {
 				self_thread = i;
@@ -1612,7 +1614,8 @@  long __export_restore_task(struct task_restore_args *args)
 
 			if (fd >= 0) {
 				/* One level pid ns hierarhy */
-				last_pid_len = std_vprint_num(last_pid_buf, sizeof(last_pid_buf), thread_args[i].pid[0] - 1, &s);
+				pid = thread_args[i].pid[0];
+				last_pid_len = std_vprint_num(last_pid_buf, sizeof(last_pid_buf), pid - 1, &s);
 				sys_lseek(fd, 0, SEEK_SET);
 				ret = sys_write(fd, s, last_pid_len);
 				if (ret < 0) {
@@ -1625,7 +1628,8 @@  long __export_restore_task(struct task_restore_args *args)
 				for (k = 0; k < MAX_NS_NESTING; k++) {
 					if (thread_args[i].pid[k] == 0)
 						break;
-					if (request_set_next_pid(args->pid_ns_id[k], thread_args[i].pid[k], args->transport_fd) < 0) {
+					pid = thread_args[i].pid[k];
+					if (request_set_next_pid(args->pid_ns_id[k], pid, args->transport_fd) < 0) {
 						pr_err("Can't request to set pid\n");
 						mutex_unlock(&task_entries_local->last_pid_mutex);
 						goto core_restore_end;
@@ -1642,6 +1646,10 @@  long __export_restore_task(struct task_restore_args *args)
 			 */
 
 			RUN_CLONE_RESTORE_FN(ret, clone_flags, new_sp, parent_tid, thread_args, args->clone_restore_fn);
+			if (ret != pid) {
+				pr_err("Unable to create a thread: %ld", ret);
+				goto core_restore_end;
+			}
 		}
 
 		mutex_unlock(&task_entries_local->last_pid_mutex);