From: Andrew Cooper Date: Fri, 4 Jul 2014 16:06:20 +0000 (+0100) Subject: tools/xenctx: Correct use of xc_domain_{, un}pause() X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4690 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=6de560fadabb8a19887aa4320857088dba9a2b95;p=xen.git tools/xenctx: Correct use of xc_domain_{, un}pause() The previous code never worked correctly. There was a TOCTOU race between checking dominfo and pausing the domain. Since c/s 3eb1c708, Xen properly reference counts pause hypercalls, so unconditionally pause and unpause the domain. Signed-off-by: Andrew Cooper CC: Ian Campbell CC: Ian Jackson CC: George Dunlap Acked-by: Ian Campbell --- diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c index 82bd789559..4ed120a6a8 100644 --- a/tools/xentrace/xenctx.c +++ b/tools/xentrace/xenctx.c @@ -91,7 +91,6 @@ static struct xenctx { int do_stack; #endif int kernel_start_set; - int self_paused; xc_dominfo_t dominfo; } xenctx; @@ -1273,13 +1272,10 @@ int main(int argc, char **argv) exit(-1); } - if (!xenctx.dominfo.paused) { - ret = xc_domain_pause(xenctx.xc_handle, xenctx.domid); - if (ret < 0) { - perror("xc_domain_pause"); - exit(-1); - } - xenctx.self_paused = 1; + ret = xc_domain_pause(xenctx.xc_handle, xenctx.domid); + if (ret < 0) { + perror("xc_domain_pause"); + exit(-1); } #ifndef NO_TRANSLATION @@ -1303,12 +1299,10 @@ int main(int argc, char **argv) if ( do_default ) dump_ctx(vcpu); - if (xenctx.self_paused) { - ret = xc_domain_unpause(xenctx.xc_handle, xenctx.domid); - if (ret < 0) { - perror("xc_domain_unpause"); - exit(-1); - } + ret = xc_domain_unpause(xenctx.xc_handle, xenctx.domid); + if (ret < 0) { + perror("xc_domain_unpause"); + exit(-1); } ret = xc_interface_close(xenctx.xc_handle);