[Libvir] Repository for work-in-progress storage patches
Jim Meyering
jim at meyering.net
Sat Jan 19 18:42:35 UTC 2008
"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.
More information about the libvir-list
mailing list