[Libvir] Repository for work-in-progress storage patches
Daniel P. Berrange
berrange at redhat.com
Sat Jan 19 18:52:07 UTC 2008
On Sat, Jan 19, 2008 at 07:42:35PM +0100, Jim Meyering wrote:
> "Daniel P. Berrange" <berrange at redhat.com> wrote:
> > On Sat, Jan 19, 2008 at 07:09:31PM +0100, Jim Meyering wrote:
> ...
> >> In storage_backend_loop.c, it looks like vol->target.path can be leaked.
> >
> > Which function is that in ? Since originally writing it I've changed all
> > error path cleanup code to simply call virStorageVolDefFree(), so there's
> > a central function which will free all members, rather than having cleanup
> > duplicated all over the place.
>
> This is the state from yesterday:
>
> static int virStorageBackendLoopVolCreate(virConnectPtr conn,
> ...
> if ((vol->target.path = malloc(5 + strlen(vol->name) + 1)) == NULL) {
> virStorageReportError(conn, VIR_ERR_NO_MEMORY, "target");
> return -1;
> }
> strcpy(vol->target.path, "/dev/");
> strcat(vol->target.path, vol->name);
>
> if ((vol->key = strdup(vol->target.path)) == NULL) {
> virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "storage vol key");
> return -1;
> }
>
> if (virRun(conn, (char**)cmdargv, NULL) < 0)
> return -1;
>
> if ((fd = open64(vol->target.path, O_RDONLY)) < 0) {
> virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "cannot read path '%s': %d (%s)",
> vol->target.path, errno, strerror(errno));
> goto cleanup;
> }
> ...
> cleanup:
> close(fd);
> virStorageBackendLoopVolDelete(conn, pool, vol);
> return -1;
> }
>
> -----------------------------
> I'd say just do s/return -1/goto cleanup/ after failed strdup
> but then you have to be careful to set fd = -1, and avoid calling
> "close" on it in that case.
Actually that's OK - the contract of the 'volCreate' method in the backend
does not require free'ing of the 'vol' object upon failure. Becaue 'vol'
is passed in pre-allocated, it is the caller's responsibilty to release
the 'vol' object upon failure. So the cleanup code in the loop driver
only needs to cleanup mess it made itself - eg releasing the loop device
and closing the fd.
Take a look at the storageVolumeCreateXML() method in storage_driver.c
+ if (backend->createVol(obj->conn, pool, vol) < 0) {
+ virStorageVolDefFree(vol);
+ return NULL;
+ }
That 'createVol' call is what's invoking virStorageBackendLoopVolCreate()
I should document this API contract alongside the driver API to make
this clear.
Regards,
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
More information about the libvir-list
mailing list