[CRIU] [crtools-bot for Kinsbursky Stanislav ] restorer: close log
file before detaching from crtools
Cyrill Gorcunov
gorcunov at openvz.org
Tue Feb 21 11:32:18 EST 2012
The commit is pushed to "master" and will appear on git://github.com/cyrillos/crtools.git
------>
commit acf604c60c49fce31221f446e15f474069a45d00
Author: Kinsbursky Stanislav <skinsbursky at openvz.org>
Date: Tue Feb 21 12:10:36 2012 +0300
restorer: close log file before detaching from crtools
v2: it's toom risky to jump to address equal to line numbet (there could be
valid executable code). So now jump is done to 0 address and %sp encodes line
number (32 most significant bits) and error code (32 least significant bits).
There is a race between log close by process being restoring and opened file
desctriptors check in zdtm test suite - crtools can exit and compare file
descriptors before detached restored process will perform all the rest tasks
(including close of the log) and execute final system call:
|--- dump/sleeping00/8578/dump.fd 2012-02-20 14:31:31.246096000 +0300
|+++ dump/sleeping00/8578/restore.fd 2012-02-20 14:31:31.418095999 +0300
|@@ -1,4 +1,5 @@
|
| 0 -> /dev/null
| 1 -> /dev/null
|+1023 -> /root/crtools/test/dump/sleeping00/8578/restore.log
| 2 -> /dev/null
The solution is to close log in restorer before final command received. But
this leads to another problem: we have to inform somehow about possible errors
afterwards This is done by forced segmentation fault and looks like this
(dmesg):
pipe00[4678]: segfault at 0 ip 00007f4c8ab77d02 sp 000002ed00000001 error 4
Where %sp encodes line number (32 most significant bits) and error code (32
least significant bits).
Signed-off-by: Stanislav Kinsbursky <skinsbursky at openvz.org>
Acked-by: Pavel Emelyanov <xemul at parallels.com>
Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
restorer.c | 20 +++++++++++++++-----
1 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/restorer.c b/restorer.c
index ea4af04..552f741 100644
--- a/restorer.c
+++ b/restorer.c
@@ -722,6 +722,9 @@ long restore_task(struct task_restore_core_args *args)
sys_sigaction(SIGCHLD, &args->sigchld_act, NULL);
cr_wait_dec(&args->task_entries->nr_in_progress);
+
+ sys_close(args->logfd);
+
cr_wait_while(&args->task_entries->start, CR_STATE_RESTORE_SIGCHLD);
/*
@@ -742,13 +745,10 @@ long restore_task(struct task_restore_core_args *args)
ret = sys_munmap(args->task_entries, TASK_ENTRIES_SIZE);
if (ret < 0) {
- write_num_n(__LINE__);
- write_num_n(ret);
- goto core_restore_end;
+ ret = ((long)__LINE__ << 32) | -ret;
+ goto core_restore_failed;
}
- sys_close(args->logfd);
-
/*
* Sigframe stack.
*/
@@ -773,4 +773,14 @@ core_restore_end:
write_num_n(sys_getpid());
sys_exit(-1);
return -1;
+
+core_restore_failed:
+ asm volatile(
+ "movq %0, %%rsp \n"
+ "movq 0, %%rax \n"
+ "jmp *%%rax \n"
+ :
+ : "r"(ret)
+ : );
+ return ret;
}
More information about the CRIU
mailing list