[libvirt] [PATCH] Allow relative path for qemu backing file

Jesse J Cook jesse.cook at eads-na-security.com
Tue Apr 5 16:55:18 UTC 2011


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 at eads-na-security.com




More information about the libvir-list mailing list