From: Daniel P. Berrange Date: Fri, 3 May 2013 11:00:15 +0000 (+0100) Subject: Fix release of resources with lockd plugin X-Git-Tag: CVE-2013-1962~206 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8dc93ffadcca0cc9813ba04036b7139922c55400;p=thirdparty%2Flibvirt.git Fix release of resources with lockd plugin The lockd plugin for the lock manager was not correctly handling the release of resource locks. This meant that during migration, or when pausing a VM, the locks would not get released. This in turn made it impossible to resume the domain, or finish migration --- diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c index 28a4f15c39..4d0cd743c4 100644 --- a/src/locking/lock_driver_lockd.c +++ b/src/locking/lock_driver_lockd.c @@ -774,10 +774,11 @@ static int virLockManagerLockDaemonRelease(virLockManagerPtr lock, virNetClientPtr client = NULL; virNetClientProgramPtr program = NULL; int counter = 0; - virLockSpaceProtocolReleaseResourceArgs args; int rv = -1; + size_t i; + virLockManagerLockDaemonPrivatePtr priv = lock->privateData; - memset(&args, 0, sizeof(args)); + virCheckFlags(0, -1); if (state) *state = NULL; @@ -785,16 +786,29 @@ static int virLockManagerLockDaemonRelease(virLockManagerPtr lock, if (!(client = virLockManagerLockDaemonConnect(lock, &program, &counter))) goto cleanup; - args.flags = flags; - - if (virNetClientProgramCall(program, - client, - counter++, - VIR_LOCK_SPACE_PROTOCOL_PROC_RELEASE_RESOURCE, - 0, NULL, NULL, NULL, - (xdrproc_t)xdr_virLockSpaceProtocolReleaseResourceArgs, &args, - (xdrproc_t)xdr_void, NULL) < 0) - goto cleanup; + for (i = 0 ; i < priv->nresources ; i++) { + virLockSpaceProtocolReleaseResourceArgs args; + + memset(&args, 0, sizeof(args)); + + if (priv->resources[i].lockspace) + args.path = priv->resources[i].lockspace; + args.name = priv->resources[i].name; + args.flags = priv->resources[i].flags; + + args.flags &= + ~(VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED | + VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE); + + if (virNetClientProgramCall(program, + client, + counter++, + VIR_LOCK_SPACE_PROTOCOL_PROC_RELEASE_RESOURCE, + 0, NULL, NULL, NULL, + (xdrproc_t)xdr_virLockSpaceProtocolReleaseResourceArgs, &args, + (xdrproc_t)xdr_void, NULL) < 0) + goto cleanup; + } rv = 0;