git.annexia.org
/
libguestfs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Coverity: fix memory leak along error path.
[libguestfs.git]
/
src
/
appliance.c
diff --git
a/src/appliance.c
b/src/appliance.c
index
30eb6fd
..
822fe77
100644
(file)
--- a/
src/appliance.c
+++ b/
src/appliance.c
@@
-1,5
+1,5
@@
/* libguestfs
/* libguestfs
- * Copyright (C) 2010 Red Hat Inc.
+ * Copyright (C) 2010
-2011
Red Hat Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@
-240,15
+240,15
@@
calculate_supermin_checksum (guestfs_h *g, const char *supermin_path)
return NULL;
}
return NULL;
}
- if (pclose (pp)
== -1
) {
-
perror ("pclose
");
+ if (pclose (pp)
!= 0
) {
+
warning (g, "pclose: %m
");
return NULL;
}
len = strlen (checksum);
if (len < 16) { /* sanity check */
return NULL;
}
len = strlen (checksum);
if (len < 16) { /* sanity check */
-
fprintf (stderr, "libguestfs: internal error: febootstrap-supermin-helper -f checksum returned a short string\n
");
+
warning (g, "febootstrap-supermin-helper -f checksum returned a short string
");
return NULL;
}
return NULL;
}
@@
-308,7
+308,7
@@
check_for_cached_appliance (guestfs_h *g,
uid_t uid,
char **kernel, char **initrd, char **appliance)
{
uid_t uid,
char **kernel, char **initrd, char **appliance)
{
- const char *tmpdir = guestfs_tmpdir ();
+ const char *tmpdir = guestfs_
__persistent_
tmpdir ();
/* len must be longer than the length of any pathname we can
* generate in this function.
/* len must be longer than the length of any pathname we can
* generate in this function.
@@
-320,7
+320,6
@@
check_for_cached_appliance (guestfs_h *g,
snprintf (filename, len, "%s/checksum", cachedir);
(void) mkdir (cachedir, 0755);
snprintf (filename, len, "%s/checksum", cachedir);
(void) mkdir (cachedir, 0755);
- (void) utime (cachedir, NULL);
/* See if the cache directory exists and passes some simple checks
* to make sure it has not been tampered with.
/* See if the cache directory exists and passes some simple checks
* to make sure it has not been tampered with.
@@
-344,13
+343,19
@@
check_for_cached_appliance (guestfs_h *g,
return -1;
}
return -1;
}
+ (void) utime (cachedir, NULL);
+
garbage_collect_appliances (cachedir);
/* Try to open and acquire a lock on the checksum file. */
int fd = open (filename, O_RDONLY);
if (fd == -1)
return 0;
garbage_collect_appliances (cachedir);
/* Try to open and acquire a lock on the checksum file. */
int fd = open (filename, O_RDONLY);
if (fd == -1)
return 0;
+#ifdef HAVE_FUTIMENS
(void) futimens (fd, NULL);
(void) futimens (fd, NULL);
+#else
+ (void) futimes (fd, NULL);
+#endif
struct flock fl;
fl.l_type = F_RDLCK;
fl.l_whence = SEEK_SET;
struct flock fl;
fl.l_type = F_RDLCK;
fl.l_whence = SEEK_SET;
@@
-396,6
+401,12
@@
check_for_cached_appliance (guestfs_h *g,
/* Releases the lock on checksum. */
if (close (fd) == -1) {
perrorf (g, "close");
/* Releases the lock on checksum. */
if (close (fd) == -1) {
perrorf (g, "close");
+ /* Allocated in hard_link_to_cached_appliance above, must be
+ * freed along this error path.
+ */
+ free (*kernel);
+ free (*initrd);
+ free (*appliance);
return -1;
}
return -1;
}
@@
-418,7
+429,7
@@
build_supermin_appliance (guestfs_h *g,
if (g->verbose)
guestfs___print_timestamped_message (g, "begin building supermin appliance");
if (g->verbose)
guestfs___print_timestamped_message (g, "begin building supermin appliance");
- const char *tmpdir = guestfs_tmpdir ();
+ const char *tmpdir = guestfs_
__persistent_
tmpdir ();
/* len must be longer than the length of any pathname we can
* generate in this function.
/* len must be longer than the length of any pathname we can
* generate in this function.
@@
-534,6
+545,12
@@
build_supermin_appliance (guestfs_h *g,
/* Releases the lock on checksum. */
if (close (fd) == -1) {
perrorf (g, "close");
/* Releases the lock on checksum. */
if (close (fd) == -1) {
perrorf (g, "close");
+ /* Allocated in hard_link_to_cached_appliance above, must be
+ * freed along this error path.
+ */
+ free (*kernel);
+ free (*initrd);
+ free (*appliance);
return -1;
}
return -1;
}