[1/2] zdtm/lib: don't close bad criu_status_in file descriptor in signal handler

Submitted by Mike Rapoport on June 6, 2018, 2:30 p.m.

Details

Message ID 1528295458-18467-2-git-send-email-rppt@linux.vnet.ibm.com
State Accepted
Series "lazy-pages: two more fixes"
Commit d6d9d7f7acd4a7544c9b739fe1266d7b70fe1a85
Headers show

Commit Message

Mike Rapoport June 6, 2018, 2:30 p.m.
The criu_status_in is not always used and it may be -1 when the signal
handler closes it. With lazy-pages we hit a corner case which clobbers the
errno value. This happens when we resume the process inside glibc syscall
wrapper and get the signal before the page containing errno is copied. In
this case, signal handler is invoked before the syscall return value is
written to errno and the actual value of errno seen by the process becomes
-EBADF because of close(-1) in the signal handler.

Let's ensure that close() in signal handler does not fail to make Jenkins
happier while the proper solution for the lazy-pages issue is found.

Signed-off-by: Mike Rapoport <rppt@linux.vnet.ibm.com>
---
 test/zdtm/lib/test.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Patch hide | download patch | download mbox

diff --git a/test/zdtm/lib/test.c b/test/zdtm/lib/test.c
index 572d160..e0ba44b 100644
--- a/test/zdtm/lib/test.c
+++ b/test/zdtm/lib/test.c
@@ -40,7 +40,8 @@  static void sig_hand(int signo)
 	if (parent)
 		futex_set_and_wake(&test_shared_state->stage, TEST_FAIL_STAGE);
 	futex_set_and_wake(&sig_received, signo);
-	close(criu_status_in);
+	if (criu_status_in >= 0)
+		close(criu_status_in);
 }
 
 static char *outfile;