[libvirt] [PATCH] Make error reporting in libvirtd thread safe
Eric Blake
eblake at redhat.com
Wed Mar 23 17:01:32 UTC 2011
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 at redhat.com +1-801-349-2682
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110323/c6708635/attachment-0001.sig>
More information about the libvir-list
mailing list