]> xenbits.xensource.com Git - people/sstabellini/xen-unstable.git/.git/commitdiff
tools/libxenstat: Fix infinite loop when QEMU dies
authorHans Reiser <hr@sec.uni-passau.de>
Mon, 9 Nov 2020 14:36:00 +0000 (14:36 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 22 Jan 2021 14:28:44 +0000 (14:28 +0000)
Occasionally, "dead" xentop processes consuming 100% CPU time have been
observed.

When the QEMU process the qmp_read() function is communicating with
terminates, qmp_read() may enter an infinite loop.  poll() signals EOF (POLLIN
and POLLHUP set), the subsequent read() call returns 0, and then the function
calls poll() again, which still sees the EOF condition and will return again
immediately with POLLIN and POLLHUP set, repeating ad infinitum.

A simple fix is to terminate the loop when read returns 0 (under "normal"
instances, poll will return with POLLIN set only if there is data to read, so
read will always read >0 bytes, except if the socket has been closed).

Signed-off-by: Hans Reiser <hr@sec.uni-passau.de>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
tools/libs/stat/xenstat_qmp.c

index 19b236e7b6b71067a61dcd92785822326dc74267..0c5748ba68b3112dc0d332a89e2567225a8b3a58 100644 (file)
@@ -298,7 +298,7 @@ static int qmp_read(int qfd, unsigned char **qstats)
        pfd[0].events = POLLIN;
        while ((n = poll(pfd, 1, 10)) > 0) {
                if (pfd[0].revents & POLLIN) {
-                       if ((n = read(qfd, buf, sizeof(buf))) < 0) {
+                       if ((n = read(qfd, buf, sizeof(buf))) <= 0) {
                                free(*qstats);
                                return 0;
                        }