
On 09/24/2013 11:14 AM, Peter Krempa wrote: ...
src/qemu/qemu_process.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 846cee6..2b9bfe3 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1389,7 +1389,7 @@ static qemuMonitorCallbacks monitorCallbacks = { };
static int -qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm) +qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int logfd) { qemuDomainObjPrivatePtr priv = vm->privateData; int ret = -1; @@ -1415,6 +1415,9 @@ qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm) &monitorCallbacks, driver);
+ if (mon) + ignore_value(qemuMonitorSetDomainLog(mon, logfd)); + virObjectLock(vm); priv->monStart = 0;
@@ -1794,11 +1797,11 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver, virHashTablePtr paths = NULL; qemuDomainObjPrivatePtr priv;
- if (!virQEMUCapsUsedQMP(qemuCaps) - && pos != -1) { - if ((logfd = qemuDomainOpenLog(driver, vm, pos)) < 0) - return -1; + if (pos != -1 && + (logfd = qemuDomainOpenLog(driver, vm, pos)) < 0) + return -1;
+ if (logfd != -1 && !virQEMUCapsUsedQMP(qemuCaps)) { if (VIR_ALLOC_N(buf, buf_size) < 0) goto closelog;
@@ -1809,9 +1812,8 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver, }
VIR_DEBUG("Connect monitor to %p '%s'", vm, vm->def->name); - if (qemuConnectMonitor(driver, vm) < 0) { + if (qemuConnectMonitor(driver, vm, logfd) < 0) goto cleanup; - }
/* Try to get the pty path mappings again via the monitor. This is much more * reliable if it's available. @@ -1838,14 +1840,15 @@ cleanup: /* VM is dead, any other error raised in the interim is probably * not as important as the qemu cmdline output */ if (virQEMUCapsUsedQMP(qemuCaps)) { - if ((logfd = qemuDomainOpenLog(driver, vm, pos)) < 0) - return -1; - if (VIR_ALLOC_N(buf, buf_size) < 0) goto closelog; }
len = strlen(buf); + /* best effor seek - we need to reset to the original position, so that + * a possible read of the fd in the monitor code doesn't influence this + * error delivery option */ + lseek(logfd, pos, SEEK_SET);
Coverity complains: 1850 * error delivery option */ (18) Event check_return: Calling function "lseek(logfd, pos, 0)" without checking return value. This library function may fail and return an error code. (19) Event unchecked_value: No check of the return value of "lseek(logfd, pos, 0)". 1851 lseek(logfd, pos, SEEK_SET); John
qemuProcessReadLog(logfd, buf + len, buf_size - len - 1, 0, true); virReportError(VIR_ERR_INTERNAL_ERROR, _("process exited while connecting to monitor: %s"), @@ -3080,7 +3083,7 @@ qemuProcessReconnect(void *opaque) virObjectRef(obj);
/* XXX check PID liveliness & EXE path */ - if (qemuConnectMonitor(driver, obj) < 0) + if (qemuConnectMonitor(driver, obj, -1) < 0) goto error;
/* Failure to connect to agent shouldn't be fatal */ @@ -4047,6 +4050,9 @@ int qemuProcessStart(virConnectPtr conn, goto cleanup; }
+ /* unset reporting errors from qemu log */ + qemuMonitorSetDomainLog(priv->mon, -1); + virCommandFree(cmd); VIR_FORCE_CLOSE(logfile); virObjectUnref(cfg); @@ -4062,6 +4068,8 @@ cleanup: virBitmapFree(nodemask); virCommandFree(cmd); VIR_FORCE_CLOSE(logfile); + if (priv->mon) + qemuMonitorSetDomainLog(priv->mon, -1); qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED, stop_flags); virObjectUnref(cfg); virObjectUnref(caps);