]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: blockPeek: Fix filling of the return buffer
authorPeter Krempa <pkrempa@redhat.com>
Mon, 18 Sep 2017 14:03:58 +0000 (16:03 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 19 Sep 2017 15:26:48 +0000 (17:26 +0200)
Commit 3956af495e broke the blockPeek API since virStorageFileRead
allocates a return buffer and fills it with the data, while the API
fills a user-provided buffer. This did not get caught by the compiler
since the API prototype uses a 'void *'.

Fix it by transferring the data from the allocated buffer to the user
provided buffer.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1491217

src/qemu/qemu_driver.c

index e1a0dd553ef60f59fc0011b6a002744843ddaedf..3109f8a17045c1ef86d6192a689c293079a1c14f 100644 (file)
@@ -11415,6 +11415,7 @@ qemuDomainBlockPeek(virDomainPtr dom,
     virQEMUDriverPtr driver = dom->conn->privateData;
     virDomainDiskDefPtr disk = NULL;
     virDomainObjPtr vm;
+    char *tmpbuf = NULL;
     int ret = -1;
 
     virCheckFlags(0, -1);
@@ -11441,15 +11442,18 @@ qemuDomainBlockPeek(virDomainPtr dom,
     if (qemuDomainStorageFileInit(driver, vm, disk->src) < 0)
         goto cleanup;
 
-    if (virStorageFileRead(disk->src, offset, size, buffer) < 0)
+    if (virStorageFileRead(disk->src, offset, size, &tmpbuf) < 0)
         goto cleanup;
 
+    memcpy(buffer, tmpbuf, size);
+
     ret = 0;
 
  cleanup:
     if (disk)
         virStorageFileDeinit(disk->src);
     virDomainObjEndAPI(&vm);
+    VIR_FREE(tmpbuf);
     return ret;
 }