On Mon, 2011-04-04 at 16:39 -0600, Eric Blake wrote:
On 03/27/2011 07:30 PM, Jesse Cook wrote:
> This patch enables the relative backing file path support provided by
> qemu-img create.
>
> If a relative path is specified for the backing file, it is converted
> to an absolute path using the storage pool path. The absolute path is
> used to verify that the backing file exists. If the backing file exists,
> the relative path is allowed and will be provided to qemu-img create.
>
> This patch takes the place of a previous patch:
>
http://www.redhat.com/archives/libvir-list/2011-March/msg00179.html
> ---
> src/storage/storage_backend.c | 18 +++++++++++++++++-
> 1 files changed, 17 insertions(+), 1 deletions(-)
Sorry for not reviewing this in time for 0.9.0.
No Problem. It took me a while to get around to the fix.
> @@ -686,7 +689,20 @@
virStorageBackendCreateQemuImg(virConnectPtr conn,
> vol->backingStore.format);
> return -1;
> }
> - if (access(vol->backingStore.path, R_OK) != 0) {
> +
> + /* Convert relative backing store paths to absolute paths for access
> + * validation.
> + */
> + if ('/' != *(vol->backingStore.path)) {
> + virAsprintf(&absolutePath, "%s/%s",
pool->def->target.path,
> + vol->backingStore.path);
> +
> + } else {
> + virAsprintf(&absolutePath, "%s",
vol->backingStore.path);
strdup is more efficient here, and avoiding malloc in the first place
even more so.
> + }
> + accessRetCode = access(absolutePath, R_OK);
This could segfault on OOM.
> + VIR_FREE(absolutePath);
I believe there needs to be a NULL check here or absolute paths and
virAsprintf errors will segfault. I can patch if you don't beat me to
it.
> + if (accessRetCode != 0) {
> virReportSystemError(errno,
> _("inaccessible backing store volume
%s"),
> vol->backingStore.path);
ACK with nits fixed; so here's what I squashed in before pushing. I
also updated AUTHORS to pass 'make syntax-check'; feel free to let me
know off-list if you prefer any alternate spelling there (especially
since you sent v1 and v2 under different email aliases).
diff --git i/src/storage/storage_backend.c w/src/storage/storage_backend.c
index 5f5565b..8af2878 100644
--- i/src/storage/storage_backend.c
+++ w/src/storage/storage_backend.c
@@ -693,7 +693,6 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
if (vol->backingStore.path) {
int accessRetCode = -1;
-
char *absolutePath = NULL;
/* XXX: Not strictly required: qemu-img has an option a different
@@ -719,14 +718,14 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
/* Convert relative backing store paths to absolute paths for
access
* validation.
*/
- if ('/' != *(vol->backingStore.path)) {
+ if ('/' != *(vol->backingStore.path) &&
virAsprintf(&absolutePath, "%s/%s",
pool->def->target.path,
- vol->backingStore.path);
-
- } else {
- virAsprintf(&absolutePath, "%s", vol->backingStore.path);
+ vol->backingStore.path) < 0) {
+ virReportOOMError();
+ return -1;
}
- accessRetCode = access(absolutePath, R_OK);
+ accessRetCode = access(absolutePath ? absolutePath
+ : vol->backingStore.path, R_OK);
VIR_FREE(absolutePath);
if (accessRetCode != 0) {
virReportSystemError(errno,
--
Jesse Cook
Research Scientist
EADS NA Defense Security & Systems Solutions, Inc. (DS3)
Email: jesse.cook(a)eads-na-security.com