On 03/23/2011 09:52 AM, Jiri Denemark wrote:
Bug
https://bugzilla.redhat.com/show_bug.cgi?id=689374 reported
libvirtd
crash during error dispatch.
The reason is that libvirtd uses remoteDispatchConnError() with non-NULL
conn parameter which means that virConnGetLastError() is used instead of
its thread safe replacement virGetLastError().
diff --git a/daemon/dispatch.c b/daemon/dispatch.c
index dc3b48a..4814017 100644
--- a/daemon/dispatch.c
+++ b/daemon/dispatch.c
@@ -113,14 +113,10 @@ void remoteDispatchOOMError (remote_error *rerr)
void remoteDispatchConnError (remote_error *rerr,
- virConnectPtr conn)
+ virConnectPtr conn ATTRIBUTE_UNUSED)
{
- virErrorPtr verr;
+ virErrorPtr verr = virGetLastError();
- if (conn)
- verr = virConnGetLastError(conn);
- else
- verr = virGetLastError();
if (verr)
remoteDispatchCopyError(rerr, verr);
else
I agree this avoids the problem...
diff --git a/daemon/remote.c b/daemon/remote.c
index a8fef4d..4b42ed2 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -757,8 +757,8 @@ remoteDispatchDomainGetSchedulerType (struct qemud_server *server
ATTRIBUTE_UNUS
type = virDomainGetSchedulerType (dom, &nparams);
if (type == NULL) {
- virDomainFree(dom);
remoteDispatchConnError(rerr, conn);
+ virDomainFree(dom);
return -1;
}
...and that this rearrangement is required to avoid clobbering the last
error.
I spent time browsing remote.c for any instances you might of missed,
and found one.
ACK with this squashed in:
diff --git i/daemon/remote.c w/daemon/remote.c
index 4b42ed2..7520df3 100644
--- i/daemon/remote.c
+++ w/daemon/remote.c
@@ -6590,8 +6590,8 @@ remoteDispatchDomainMigrateSetMaxSpeed(struct
qemud_server *server ATTRIBUTE_UNU
}
if (virDomainMigrateSetMaxSpeed(dom, args->bandwidth, args->flags)
== -1) {
- virDomainFree(dom);
remoteDispatchConnError(rerr, conn);
+ virDomainFree(dom);
return -1;
}
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org