From 2ee40f16c26ab3182087b0720a35d6dd70d702e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Sun, 27 Oct 2013 16:06:26 +0100 Subject: [PATCH] qrexec-lib: fail peer_client_init call when domain dies Don't wait indefinitely. --- qrexec-lib/txrx-vchan.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/qrexec-lib/txrx-vchan.c b/qrexec-lib/txrx-vchan.c index dc401fb..a1324b8 100644 --- a/qrexec-lib/txrx-vchan.c +++ b/qrexec-lib/txrx-vchan.c @@ -170,9 +170,10 @@ char *peer_client_init(int dom, int port) struct xs_handle *xs; char buf[64]; char *name; - char *dummy; + char *dummy, *dummy2; unsigned int len = 0; char devbuf[128]; + char dombuf[128]; unsigned int count; char **vec; @@ -192,6 +193,7 @@ char *peer_client_init(int dom, int port) snprintf(devbuf, sizeof(devbuf), "/local/domain/%d/device/vchan/%d/event-channel", dom, port); + snprintf(dombuf, sizeof(dombuf), "/local/domain/%d", dom); xs_watch(xs, devbuf, devbuf); do { vec = xs_read_watch(xs, &count); @@ -201,6 +203,15 @@ char *peer_client_init(int dom, int port) dummy = xs_read(xs, 0, devbuf, &len); if (dummy) free(dummy); + else { + /* check if domain still alive */ + dummy2 = xs_read(xs, 0, dombuf, &len); + if (!dummy2) { + fprintf(stderr, "domain dead\n"); + exit(1); + } + free(dummy2); + } } while (!dummy || !len); // wait for the server to create xenstore entries xs_daemon_close(xs);