On Tue, May 22, 2018 at 20:26:56 -0400, John Ferlan wrote:
On 05/18/2018 07:29 AM, Peter Krempa wrote:
> Allow saving various aspects necessary to do NBD migration via blockdev
> by storing a 'virStorageSource' in the disk private data meant to store
> the NBD target of migration. Along with this add code to parse and
> format it into the status XML.
>
> Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
> ---
> src/qemu/qemu_domain.c | 162 ++++++++++++++++++++++++++++++++++++++++++++++---
> src/qemu/qemu_domain.h | 1 +
> 2 files changed, 156 insertions(+), 7 deletions(-)
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 94a9c5d1bc..632c025bef 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
[...]
>
> @@ -2092,6 +2155,7 @@ qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf,
> virBuffer attrBuf = VIR_BUFFER_INITIALIZER;
> virBuffer childBuf = VIR_BUFFER_INITIALIZER;
> qemuDomainJob job = priv->job.active;
> + int ret = -1;
>
> if (!qemuDomainTrackJob(job))
> job = QEMU_JOB_NONE;
> @@ -2115,13 +2179,23 @@ qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf,
> if (priv->job.asyncJob != QEMU_ASYNC_JOB_NONE)
> virBufferAsprintf(&attrBuf, " flags='0x%lx'",
priv->job.apiFlags);
>
> - if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT)
> - qemuDomainObjPrivateXMLFormatNBDMigration(&childBuf, vm);
> + if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT &&
> + qemuDomainObjPrivateXMLFormatNBDMigration(&childBuf, vm) < 0)
> + goto cleanup;
>
> if (priv->job.migParams)
> qemuMigrationParamsFormat(&childBuf, priv->job.migParams);
>
> - return virXMLFormatElement(buf, "job", &attrBuf, &childBuf);
> + if (virXMLFormatElement(buf, "job", &attrBuf, &childBuf) <
0)
> + goto cleanup;
> +
> + ret = 0;
> +
> + cleanup:
> + virBufferFreeAndReset(&attrBuf);
> + virBufferFreeAndReset(&childBuf);
So I assume the lack of FreeAndReset was existing prior to this patch
since d8be0f4bc?
Yes. I assumed that virXMLFormatElement clears them on error, but it
apparently does not, so adding them here actually fixes a possible bug.
This chagne would be necessary even with the above assumption being
valid as this patch adds a possible error code path.