diff --git a/daemon/9p.c b/daemon/9p.c index 49efafc15..d3d8a1d92 100644 --- a/daemon/9p.c +++ b/daemon/9p.c @@ -75,17 +75,14 @@ do_list_9p (void) * the mount tag length to be unlimited (or up to 65536 bytes). * See: linux/include/linux/virtio_9p.h */ - char *mount_tag = read_whole_file (mount_tag_path); + CLEANUP_FREE char *mount_tag = read_whole_file (mount_tag_path); if (mount_tag == 0) continue; if (add_string (&r, mount_tag) == -1) { - free (mount_tag); closedir (dir); return NULL; } - - free (mount_tag); } } @@ -173,26 +170,26 @@ read_whole_file (const char *filename) int do_mount_9p (const char *mount_tag, const char *mountpoint, const char *options) { - char *mp = NULL, *opts = NULL, *err = NULL; + CLEANUP_FREE char *mp = NULL, *opts = NULL, *err = NULL; struct stat statbuf; - int r = -1; + int r; ABS_PATH (mountpoint, , return -1); mp = sysroot_path (mountpoint); if (!mp) { reply_with_perror ("malloc"); - goto out; + return -1; } /* Check the mountpoint exists and is a directory. */ if (stat (mp, &statbuf) == -1) { reply_with_perror ("%s", mountpoint); - goto out; + return -1; } if (!S_ISDIR (statbuf.st_mode)) { reply_with_perror ("%s: mount point is not a directory", mountpoint); - goto out; + return -1; } /* Add trans=virtio to the options. */ @@ -200,14 +197,14 @@ do_mount_9p (const char *mount_tag, const char *mountpoint, const char *options) STRNEQ (options, "")) { if (asprintf (&opts, "trans=virtio,%s", options) == -1) { reply_with_perror ("asprintf"); - goto out; + return -1; } } else { opts = strdup ("trans=virtio"); if (opts == NULL) { reply_with_perror ("strdup"); - goto out; + return -1; } } @@ -215,13 +212,8 @@ do_mount_9p (const char *mount_tag, const char *mountpoint, const char *options) str_mount, "-o", opts, "-t", "9p", mount_tag, mp, NULL); if (r == -1) { reply_with_error ("%s on %s: %s", mount_tag, mountpoint, err); - goto out; + return -1; } - r = 0; - out: - free (err); - free (opts); - free (mp); - return r; + return 0; } diff --git a/daemon/augeas.c b/daemon/augeas.c index 0de8369ac..c0c97e303 100644 --- a/daemon/augeas.c +++ b/daemon/augeas.c @@ -68,7 +68,7 @@ optgroup_augeas_available (void) int do_aug_init (const char *root, int flags) { - char *buf; + CLEANUP_FREE char *buf = NULL; if (aug) { aug_close (aug); @@ -82,7 +82,6 @@ do_aug_init (const char *root, int flags) } aug = aug_init (buf, NULL, flags); - free (buf); if (!aug) { reply_with_error ("Augeas initialization failed"); @@ -338,7 +337,6 @@ char ** do_aug_ls (const char *path) { char **matches; - char *buf; size_t len; NEED_AUG (NULL); @@ -358,6 +356,8 @@ do_aug_ls (const char *path) if (STREQ (path, "/")) matches = do_aug_match ("/*"); else { + CLEANUP_FREE char *buf; + len += 3; /* / * + terminating \0 */ buf = malloc (len); if (buf == NULL) { @@ -367,7 +367,6 @@ do_aug_ls (const char *path) snprintf (buf, len, "%s/*", path); matches = do_aug_match (buf); - free (buf); } if (matches == NULL) diff --git a/daemon/available.c b/daemon/available.c index 59f956437..d0322bc97 100644 --- a/daemon/available.c +++ b/daemon/available.c @@ -84,7 +84,7 @@ test_proc_filesystems (const char *filesystem) { size_t len = strlen (filesystem) + 32; char regex[len]; - char *err; + CLEANUP_FREE char *err = NULL; int r; snprintf (regex, len, "^[[:space:]]*%s$", filesystem); @@ -92,10 +92,8 @@ test_proc_filesystems (const char *filesystem) r = commandr (NULL, &err, str_grep, regex, "/proc/filesystems", NULL); if (r == -1 || r >= 2) { fprintf (stderr, "grep /proc/filesystems: %s", err); - free (err); return -1; } - free (err); return r == 0; } diff --git a/daemon/base64.c b/daemon/base64.c index fcbeec8f9..f36542f88 100644 --- a/daemon/base64.c +++ b/daemon/base64.c @@ -42,7 +42,7 @@ do_base64_in (const char *file) { int err, r; FILE *fp; - char *cmd; + CLEANUP_FREE char *cmd = NULL; if (asprintf_nowarn (&cmd, "%s -d -i > %R", str_base64, file) == -1) { err = errno; @@ -61,10 +61,8 @@ do_base64_in (const char *file) cancel_receive (); errno = err; reply_with_perror ("%s", cmd); - free (cmd); return -1; } - free (cmd); /* The semantics of fwrite are too undefined, so write to the * file descriptor directly instead. @@ -101,7 +99,7 @@ do_base64_out (const char *file) { int r; FILE *fp; - char *cmd; + CLEANUP_FREE char *cmd = NULL; char buf[GUESTFS_MAX_CHUNK_SIZE]; if (asprintf_nowarn (&cmd, "%s %R", str_base64, file) == -1) { @@ -115,10 +113,8 @@ do_base64_out (const char *file) fp = popen (cmd, "r"); if (fp == NULL) { reply_with_perror ("%s", cmd); - free (cmd); return -1; } - free (cmd); /* Now we must send the reply message, before the file contents. After * this there is no opportunity in the protocol to send any error diff --git a/daemon/blkid.c b/daemon/blkid.c index b6bc22dc6..64919dd7e 100644 --- a/daemon/blkid.c +++ b/daemon/blkid.c @@ -32,7 +32,8 @@ GUESTFSD_EXT_CMD(str_blkid, blkid); static char * get_blkid_tag (const char *device, const char *tag) { - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; int r; r = commandr (&out, &err, @@ -46,12 +47,9 @@ get_blkid_tag (const char *device, const char *tag) else reply_with_error ("%s: %s", device, err); free (out); - free (err); return NULL; } - free (err); - if (r == 2) { /* means UUID etc not found */ free (out); out = strdup (""); @@ -96,32 +94,27 @@ static int test_blkid_p_i_opt (void) { int r; - char *err; + CLEANUP_FREE char *err = NULL, *err2 = NULL; r = commandr (NULL, &err, str_blkid, "-p", "/dev/null", NULL); if (r == -1) { /* This means we couldn't run the blkid command at all. */ command_failed: reply_with_error ("could not run 'blkid' command: %s", err); - free (err); return -1; } if (strstr (err, "invalid option --")) { - free (err); return 0; } - free (err); - r = commandr (NULL, &err, str_blkid, "-i", NULL); + r = commandr (NULL, &err2, str_blkid, "-i", NULL); if (r == -1) goto command_failed; - if (strstr (err, "invalid option --")) { - free (err); + if (strstr (err2, "invalid option --")) { return 0; } - free (err); /* We have both options. */ return 1; @@ -132,8 +125,8 @@ blkid_with_p_i_opt (const char *device) { size_t i; int r; - char *out = NULL, *err = NULL; - char **lines = NULL; + CLEANUP_FREE char *out = NULL, *err = NULL; + CLEANUP_FREE_STRING_LIST char **lines = NULL; DECLARE_STRINGSBUF (ret); r = command (&out, &err, str_blkid, "-c", "/dev/null", @@ -184,17 +177,9 @@ blkid_with_p_i_opt (const char *device) if (end_stringsbuf (&ret) == -1) goto error; - free (out); - free (err); - free_strings (lines); - return ret.argv; error: - free (out); - free (err); - if (lines) - free_strings (lines); if (ret.argv) free_strings (ret.argv); diff --git a/daemon/blockdev.c b/daemon/blockdev.c index f216bf795..04cede903 100644 --- a/daemon/blockdev.c +++ b/daemon/blockdev.c @@ -38,7 +38,7 @@ call_blockdev (const char *device, const char *switc, int extraarg, int prints) { int r; int64_t rv; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; const char *argv[] = { str_blockdev, switc, @@ -73,8 +73,6 @@ call_blockdev (const char *device, const char *switc, int extraarg, int prints) if (r == -1) { reply_with_error ("%s: %s", argv[0], err); - free (err); - free (out); return -1; } @@ -83,15 +81,10 @@ call_blockdev (const char *device, const char *switc, int extraarg, int prints) if (prints) { if (sscanf (out, "%" SCNi64, &rv) != 1) { reply_with_error ("%s: expected output, but got nothing", argv[0]); - free (out); - free (err); return -1; } } - free (out); - free (err); - return rv; } diff --git a/daemon/btrfs.c b/daemon/btrfs.c index 8ecde0191..2830509c1 100644 --- a/daemon/btrfs.c +++ b/daemon/btrfs.c @@ -44,8 +44,7 @@ int do_btrfs_filesystem_resize (const char *filesystem, int64_t size) { const size_t MAX_ARGS = 64; - char *buf; - char *err; + CLEANUP_FREE char *buf = NULL, *err = NULL; int r; const char *argv[MAX_ARGS]; size_t i = 0; @@ -77,15 +76,12 @@ do_btrfs_filesystem_resize (const char *filesystem, int64_t size) ADD_ARG (argv, i, NULL); r = commandv (NULL, &err, argv); - free (buf); if (r == -1) { reply_with_error ("%s: %s", filesystem, err); - free (err); return -1; } - free (err); return 0; } @@ -107,7 +103,7 @@ do_mkfs_btrfs (char *const *devices, const char *argv[MAX_ARGS]; size_t i = 0, j; int r; - char *err; + CLEANUP_FREE char *err = NULL; char allocstart_s[64]; char bytecount_s[64]; char leafsize_s[64]; @@ -200,11 +196,9 @@ do_mkfs_btrfs (char *const *devices, r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s: %s", devices[0], err); - free (err); return -1; } - free (err); return 0; } @@ -214,8 +208,8 @@ do_btrfs_subvolume_snapshot (const char *source, const char *dest) const size_t MAX_ARGS = 64; const char *argv[MAX_ARGS]; size_t i = 0; - char *source_buf, *dest_buf; - char *err; + CLEANUP_FREE char *source_buf = NULL, *dest_buf = NULL; + CLEANUP_FREE char *err = NULL; int r; source_buf = sysroot_path (source); @@ -226,7 +220,6 @@ do_btrfs_subvolume_snapshot (const char *source, const char *dest) dest_buf = sysroot_path (dest); if (dest_buf == NULL) { reply_with_perror ("malloc"); - free (source_buf); return -1; } @@ -238,14 +231,10 @@ do_btrfs_subvolume_snapshot (const char *source, const char *dest) ADD_ARG (argv, i, NULL); r = commandv (NULL, &err, argv); - free (source_buf); - free (dest_buf); if (r == -1) { reply_with_error ("%s: %s: %s", source, dest, err); - free (err); return -1; } - free (err); return 0; } @@ -256,8 +245,8 @@ do_btrfs_subvolume_delete (const char *subvolume) const size_t MAX_ARGS = 64; const char *argv[MAX_ARGS]; size_t i = 0; - char *subvolume_buf; - char *err; + CLEANUP_FREE char *subvolume_buf = NULL; + CLEANUP_FREE char *err = NULL; int r; subvolume_buf = sysroot_path (subvolume); @@ -273,13 +262,10 @@ do_btrfs_subvolume_delete (const char *subvolume) ADD_ARG (argv, i, NULL); r = commandv (NULL, &err, argv); - free (subvolume_buf); if (r == -1) { reply_with_error ("%s: %s", subvolume, err); - free (err); return -1; } - free (err); return 0; } @@ -290,8 +276,8 @@ do_btrfs_subvolume_create (const char *dest) const size_t MAX_ARGS = 64; const char *argv[MAX_ARGS]; size_t i = 0; - char *dest_buf; - char *err; + CLEANUP_FREE char *dest_buf = NULL; + CLEANUP_FREE char *err = NULL; int r; dest_buf = sysroot_path (dest); @@ -307,13 +293,10 @@ do_btrfs_subvolume_create (const char *dest) ADD_ARG (argv, i, NULL); r = commandv (NULL, &err, argv); - free (dest_buf); if (r == -1) { reply_with_error ("%s: %s", dest, err); - free (err); return -1; } - free (err); return 0; } @@ -323,10 +306,11 @@ do_btrfs_subvolume_list (const char *fs) { const size_t MAX_ARGS = 64; guestfs_int_btrfssubvolume_list *ret; - char *fs_buf; + CLEANUP_FREE char *fs_buf = NULL; const char *argv[MAX_ARGS]; size_t i = 0; - char *out, *err, **lines, *pos; + char **lines, *pos; + CLEANUP_FREE char *out = NULL, *err = NULL; size_t nr_subvolumes; int r; @@ -343,16 +327,12 @@ do_btrfs_subvolume_list (const char *fs) ADD_ARG (argv, i, NULL); r = commandv (&out, &err, argv); - free (fs_buf); if (r == -1) { reply_with_error ("%s: %s", fs, err); - free (err); return NULL; } - free (err); lines = split_lines (out); - free (out); if (!lines) return NULL; @@ -420,9 +400,9 @@ do_btrfs_subvolume_set_default (int64_t id, const char *fs) const size_t MAX_ARGS = 64; const char *argv[MAX_ARGS]; size_t i = 0; - char *fs_buf; + CLEANUP_FREE char *fs_buf = NULL; char buf[64]; - char *err; + CLEANUP_FREE char *err = NULL; int r; snprintf (buf, sizeof buf, "%" PRIi64, id); @@ -441,13 +421,10 @@ do_btrfs_subvolume_set_default (int64_t id, const char *fs) ADD_ARG (argv, i, NULL); r = commandv (NULL, &err, argv); - free (fs_buf); if (r == -1) { reply_with_error ("%s: %s", fs, err); - free (err); return -1; } - free (err); return 0; } @@ -458,8 +435,8 @@ do_btrfs_filesystem_sync (const char *fs) const size_t MAX_ARGS = 64; const char *argv[MAX_ARGS]; size_t i = 0; - char *fs_buf; - char *err; + CLEANUP_FREE char *fs_buf = NULL; + CLEANUP_FREE char *err = NULL; int r; fs_buf = sysroot_path (fs); @@ -475,13 +452,10 @@ do_btrfs_filesystem_sync (const char *fs) ADD_ARG (argv, i, NULL); r = commandv (NULL, &err, argv); - free (fs_buf); if (r == -1) { reply_with_error ("%s: %s", fs, err); - free (err); return -1; } - free (err); return 0; } @@ -492,8 +466,8 @@ do_btrfs_filesystem_balance (const char *fs) const size_t MAX_ARGS = 64; const char *argv[MAX_ARGS]; size_t i = 0; - char *fs_buf; - char *err; + CLEANUP_FREE char *fs_buf = NULL; + CLEANUP_FREE char *err = NULL; int r; fs_buf = sysroot_path (fs); @@ -509,13 +483,10 @@ do_btrfs_filesystem_balance (const char *fs) ADD_ARG (argv, i, NULL); r = commandv (NULL, &err, argv); - free (fs_buf); if (r == -1) { reply_with_error ("%s: %s", fs, err); - free (err); return -1; } - free (err); return 0; } @@ -531,8 +502,8 @@ do_btrfs_device_add (char *const *devices, const char *fs) size_t MAX_ARGS = nr_devices + 8; const char *argv[MAX_ARGS]; size_t i = 0, j; - char *fs_buf; - char *err; + CLEANUP_FREE char *fs_buf = NULL; + CLEANUP_FREE char *err = NULL; int r; fs_buf = sysroot_path (fs); @@ -552,13 +523,10 @@ do_btrfs_device_add (char *const *devices, const char *fs) ADD_ARG (argv, i, NULL); r = commandv (NULL, &err, argv); - free (fs_buf); if (r == -1) { reply_with_error ("%s: %s", fs, err); - free (err); return -1; } - free (err); return 0; } @@ -574,8 +542,8 @@ do_btrfs_device_delete (char *const *devices, const char *fs) size_t MAX_ARGS = nr_devices + 8; const char *argv[MAX_ARGS]; size_t i = 0, j; - char *fs_buf; - char *err; + CLEANUP_FREE char *fs_buf = NULL; + CLEANUP_FREE char *err = NULL; int r; fs_buf = sysroot_path (fs); @@ -595,13 +563,10 @@ do_btrfs_device_delete (char *const *devices, const char *fs) ADD_ARG (argv, i, NULL); r = commandv (NULL, &err, argv); - free (fs_buf); if (r == -1) { reply_with_error ("%s: %s", fs, err); - free (err); return -1; } - free (err); return 0; } @@ -609,7 +574,7 @@ do_btrfs_device_delete (char *const *devices, const char *fs) int do_btrfs_set_seeding (const char *device, int svalue) { - char *err; + CLEANUP_FREE char *err = NULL; int r; const char *s_value = svalue ? "1" : "0"; @@ -617,11 +582,9 @@ do_btrfs_set_seeding (const char *device, int svalue) r = commandr (NULL, &err, str_btrfstune, "-S", s_value, device, NULL); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); return 0; } @@ -629,7 +592,7 @@ do_btrfs_set_seeding (const char *device, int svalue) int do_btrfs_fsck (const char *device, int64_t superblock, int repair) { - char *err; + CLEANUP_FREE char *err = NULL; int r; size_t i = 0; const size_t MAX_ARGS = 64; @@ -661,10 +624,8 @@ do_btrfs_fsck (const char *device, int64_t superblock, int repair) r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); return 0; } diff --git a/daemon/checksum.c b/daemon/checksum.c index f9ae2a831..d4ef7b1e0 100644 --- a/daemon/checksum.c +++ b/daemon/checksum.c @@ -66,7 +66,8 @@ static char * checksum (const char *csumtype, int fd) { const char *program; - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; int flags, r; size_t len; @@ -84,12 +85,9 @@ checksum (const char *csumtype, int fd) pulse_mode_cancel (); reply_with_error ("%s: %s", program, err); free (out); - free (err); return NULL; } - free (err); - /* Split it at the first whitespace. */ len = strcspn (out, " \t\n"); out[len] = '\0'; @@ -141,7 +139,7 @@ do_checksums_out (const char *csumtype, const char *dir) if (program == NULL) return -1; - char *sysrootdir = sysroot_path (dir); + CLEANUP_FREE char *sysrootdir = sysroot_path (dir); if (!sysrootdir) { reply_with_perror ("malloc"); return -1; @@ -150,23 +148,19 @@ do_checksums_out (const char *csumtype, const char *dir) r = stat (sysrootdir, &statbuf); if (r == -1) { reply_with_perror ("%s", dir); - free (sysrootdir); return -1; } if (!S_ISDIR (statbuf.st_mode)) { reply_with_error ("%s: not a directory", dir); - free (sysrootdir); return -1; } - char *cmd; + CLEANUP_FREE char *cmd = NULL; if (asprintf_nowarn (&cmd, "cd %Q && %s -type f -print0 | %s -0 %s", sysrootdir, str_find, str_xargs, program) == -1) { reply_with_perror ("asprintf"); - free (sysrootdir); return -1; } - free (sysrootdir); if (verbose) fprintf (stderr, "%s\n", cmd); @@ -174,10 +168,8 @@ do_checksums_out (const char *csumtype, const char *dir) FILE *fp = popen (cmd, "r"); if (fp == NULL) { reply_with_perror ("%s", cmd); - free (cmd); return -1; } - free (cmd); /* Now we must send the reply message, before the file contents. After * this there is no opportunity in the protocol to send any error diff --git a/daemon/cmp.c b/daemon/cmp.c index 89da3b88a..61506b6c1 100644 --- a/daemon/cmp.c +++ b/daemon/cmp.c @@ -32,8 +32,8 @@ GUESTFSD_EXT_CMD(str_cmp, cmp); int do_equal (const char *file1, const char *file2) { - char *file1buf, *file2buf; - char *err; + CLEANUP_FREE char *file1buf = NULL, *file2buf = NULL; + CLEANUP_FREE char *err = NULL; int r; file1buf = sysroot_path (file1); @@ -45,22 +45,14 @@ do_equal (const char *file1, const char *file2) file2buf = sysroot_path (file2); if (file2buf == NULL) { reply_with_perror ("malloc"); - free (file1buf); return -1; } r = commandr (NULL, &err, str_cmp, "-s", file1buf, file2buf, NULL); - - free (file1buf); - free (file2buf); - if (r == -1 || r > 1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - return r == 0; } diff --git a/daemon/command.c b/daemon/command.c index 583903336..9d9c81ddd 100644 --- a/daemon/command.c +++ b/daemon/command.c @@ -40,10 +40,11 @@ umount_ignore_fail (const char *path) char * do_command (char *const *argv) { - char *out, *err; + char *out; + CLEANUP_FREE char *err; int r; - char *sysroot_dev, *sysroot_dev_pts, *sysroot_proc, - *sysroot_selinux, *sysroot_sys; + CLEANUP_FREE char *sysroot_dev = NULL, *sysroot_dev_pts = NULL, + *sysroot_proc = NULL, *sysroot_selinux = NULL, *sysroot_sys = NULL; int dev_ok, dev_pts_ok, proc_ok, selinux_ok, sys_ok; /* We need a root filesystem mounted to do this. */ @@ -76,11 +77,6 @@ do_command (char *const *argv) sysroot_proc == NULL || sysroot_selinux == NULL || sysroot_sys == NULL) { reply_with_perror ("malloc"); - free (sysroot_dev); - free (sysroot_dev_pts); - free (sysroot_proc); - free (sysroot_selinux); - free (sysroot_sys); return NULL; } @@ -105,28 +101,19 @@ do_command (char *const *argv) if (dev_pts_ok) umount_ignore_fail (sysroot_dev_pts); if (dev_ok) umount_ignore_fail (sysroot_dev); - free (sysroot_dev); - free (sysroot_dev_pts); - free (sysroot_proc); - free (sysroot_selinux); - free (sysroot_sys); - if (r == -1) { reply_with_error ("%s", err); free (out); - free (err); return NULL; } - free (err); - return out; /* Caller frees. */ } char ** do_command_lines (char *const *argv) { - char *out; + CLEANUP_FREE char *out = NULL; char **lines; out = do_command (argv); @@ -134,7 +121,6 @@ do_command_lines (char *const *argv) return NULL; lines = split_lines (out); - free (out); if (lines == NULL) return NULL; diff --git a/daemon/compress.c b/daemon/compress.c index d664ebc2d..6c4e3b744 100644 --- a/daemon/compress.c +++ b/daemon/compress.c @@ -39,7 +39,7 @@ do_compressX_out (const char *file, const char *filter, int is_device) { int r; FILE *fp; - char *cmd; + CLEANUP_FREE char *cmd = NULL; char buf[GUESTFS_MAX_CHUNK_SIZE]; /* The command will look something like: @@ -71,10 +71,8 @@ do_compressX_out (const char *file, const char *filter, int is_device) fp = popen (cmd, "r"); if (fp == NULL) { reply_with_perror ("%s", cmd); - free (cmd); return -1; } - free (cmd); /* Now we must send the reply message, before the file contents. After * this there is no opportunity in the protocol to send any error diff --git a/daemon/copy.c b/daemon/copy.c index e895fbd85..b4f01543a 100644 --- a/daemon/copy.c +++ b/daemon/copy.c @@ -177,48 +177,37 @@ int do_copy_device_to_file (const char *src, const char *dest, int64_t srcoffset, int64_t destoffset, int64_t size) { - char *dest_buf; - int r; + CLEANUP_FREE char *dest_buf = sysroot_path (dest); - dest_buf = sysroot_path (dest); if (!dest_buf) { reply_with_perror ("malloc"); return -1; } - r = copy (src, src, dest_buf, dest, DEST_FILE_FLAGS, - srcoffset, destoffset, size); - free (dest_buf); - - return r; + return copy (src, src, dest_buf, dest, DEST_FILE_FLAGS, + srcoffset, destoffset, size); } int do_copy_file_to_device (const char *src, const char *dest, int64_t srcoffset, int64_t destoffset, int64_t size) { - char *src_buf; - int r; + CLEANUP_FREE char *src_buf = sysroot_path (src); - src_buf = sysroot_path (src); if (!src_buf) { reply_with_perror ("malloc"); return -1; } - r = copy (src_buf, src, dest, dest, DEST_DEVICE_FLAGS, - srcoffset, destoffset, size); - free (src_buf); - - return r; + return copy (src_buf, src, dest, dest, DEST_DEVICE_FLAGS, + srcoffset, destoffset, size); } int do_copy_file_to_file (const char *src, const char *dest, int64_t srcoffset, int64_t destoffset, int64_t size) { - char *src_buf, *dest_buf; - int r; + CLEANUP_FREE char *src_buf = NULL, *dest_buf = NULL; src_buf = sysroot_path (src); if (!src_buf) { @@ -229,14 +218,9 @@ do_copy_file_to_file (const char *src, const char *dest, dest_buf = sysroot_path (dest); if (!dest_buf) { reply_with_perror ("malloc"); - free (src_buf); return -1; } - r = copy (src_buf, src, dest_buf, dest, DEST_FILE_FLAGS, - srcoffset, destoffset, size); - free (src_buf); - free (dest_buf); - - return r; + return copy (src_buf, src, dest_buf, dest, DEST_FILE_FLAGS, + srcoffset, destoffset, size); } diff --git a/daemon/cpmv.c b/daemon/cpmv.c index c182f68b7..c701729f2 100644 --- a/daemon/cpmv.c +++ b/daemon/cpmv.c @@ -51,8 +51,8 @@ do_mv (const char *src, const char *dest) static int cpmv_cmd (const char *cmd, const char *flags, const char *src, const char *dest) { - char *srcbuf, *destbuf; - char *err; + CLEANUP_FREE char *srcbuf = NULL, *destbuf = NULL; + CLEANUP_FREE char *err = NULL; int r; srcbuf = sysroot_path (src); @@ -64,7 +64,6 @@ cpmv_cmd (const char *cmd, const char *flags, const char *src, const char *dest) destbuf = sysroot_path (dest); if (destbuf == NULL) { reply_with_perror ("malloc"); - free (srcbuf); return -1; } @@ -75,16 +74,11 @@ cpmv_cmd (const char *cmd, const char *flags, const char *src, const char *dest) else r = command (NULL, &err, cmd, srcbuf, destbuf, NULL); - free (srcbuf); - free (destbuf); - if (r == -1) { pulse_mode_cancel (); reply_with_error ("%s", err); - free (err); return -1; } - free (err); pulse_mode_end (); diff --git a/daemon/dd.c b/daemon/dd.c index 7184ab6a6..cd4e84991 100644 --- a/daemon/dd.c +++ b/daemon/dd.c @@ -33,8 +33,8 @@ int do_dd (const char *src, const char *dest) { int src_is_dev, dest_is_dev; - char *if_arg, *of_arg; - char *err; + CLEANUP_FREE char *if_arg = NULL, *of_arg = NULL; + CLEANUP_FREE char *err = NULL; int r; src_is_dev = STRPREFIX (src, "/dev/"); @@ -56,20 +56,14 @@ do_dd (const char *src, const char *dest) r = asprintf (&of_arg, "of=%s%s", sysroot, dest); if (r == -1) { reply_with_perror ("asprintf"); - free (if_arg); return -1; } r = command (NULL, &err, str_dd, "bs=1024K", if_arg, of_arg, NULL); - free (if_arg); - free (of_arg); - if (r == -1) { reply_with_error ("%s: %s: %s", src, dest, err); - free (err); return -1; } - free (err); return 0; } @@ -77,19 +71,17 @@ do_dd (const char *src, const char *dest) int do_copy_size (const char *src, const char *dest, int64_t ssize) { - char *buf; int src_fd, dest_fd; if (STRPREFIX (src, "/dev/")) src_fd = open (src, O_RDONLY | O_CLOEXEC); else { - buf = sysroot_path (src); + CLEANUP_FREE char *buf = sysroot_path (src); if (!buf) { reply_with_perror ("malloc"); return -1; } src_fd = open (buf, O_RDONLY | O_CLOEXEC); - free (buf); } if (src_fd == -1) { reply_with_perror ("%s", src); @@ -99,14 +91,13 @@ do_copy_size (const char *src, const char *dest, int64_t ssize) if (STRPREFIX (dest, "/dev/")) dest_fd = open (dest, O_WRONLY | O_CLOEXEC); else { - buf = sysroot_path (dest); + CLEANUP_FREE char *buf = sysroot_path (dest); if (!buf) { reply_with_perror ("malloc"); close (src_fd); return -1; } dest_fd = open (buf, O_WRONLY|O_CREAT|O_TRUNC|O_NOCTTY|O_CLOEXEC, 0666); - free (buf); } if (dest_fd == -1) { reply_with_perror ("%s", dest); diff --git a/daemon/debug.c b/daemon/debug.c index 97b1341d8..214591f31 100644 --- a/daemon/debug.c +++ b/daemon/debug.c @@ -228,7 +228,7 @@ debug_segv (const char *subcmd, size_t argc, char *const *const argv) static char * debug_sh (const char *subcmd, size_t argc, char *const *const argv) { - char *cmd; + CLEANUP_FREE char *cmd = NULL; size_t len, i, j; if (argc < 1) { @@ -267,8 +267,6 @@ debug_sh (const char *subcmd, size_t argc, char *const *const argv) char *err; int r = commandf (NULL, &err, COMMAND_FLAG_FOLD_STDOUT_ON_STDERR, "/bin/sh", "-c", cmd, NULL); - free (cmd); - if (r == -1) { reply_with_error ("%s", err); free (err); @@ -283,18 +281,16 @@ static char * debug_env (const char *subcmd, size_t argc, char *const *const argv) { int r; - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; r = command (&out, &err, str_printenv, NULL); if (r == -1) { reply_with_error ("printenv: %s", err); free (out); - free (err); return NULL; } - free (err); - return out; } @@ -327,7 +323,8 @@ static char * debug_binaries (const char *subcmd, size_t argc, char *const *const argv) { int r; - char *out, *err; + char *out; + CLEANUP_FREE char *err; char cmd[256]; snprintf (cmd, sizeof (cmd), @@ -341,12 +338,9 @@ debug_binaries (const char *subcmd, size_t argc, char *const *const argv) if (r == -1) { reply_with_error ("find: %s", err); free (out); - free (err); return NULL; } - free (err); - return out; } @@ -357,7 +351,8 @@ static char * debug_ldd (const char *subcmd, size_t argc, char *const *const argv) { int r; - char *out, *err, *ret; + char *out, *ret; + CLEANUP_FREE char *err = NULL; if (argc != 1) { reply_with_error ("ldd: no file argument"); @@ -374,7 +369,6 @@ debug_ldd (const char *subcmd, size_t argc, char *const *const argv) if (r == -1) { reply_with_error ("ldd: %s: %s", argv[0], err); free (out); - free (err); return NULL; } @@ -383,12 +377,10 @@ debug_ldd (const char *subcmd, size_t argc, char *const *const argv) if (ret == NULL) { reply_with_perror ("realloc"); free (out); - free (err); return NULL; } strcat (ret, err); - free (err); return ret; } @@ -400,6 +392,9 @@ debug_ls (const char *subcmd, size_t argc, char *const *const argv) size_t len = count_strings (argv); const char *cargv[len+3]; size_t i; + int r; + char *out; + CLEANUP_FREE char *err; cargv[0] = str_ls; cargv[1] = "-a"; @@ -407,19 +402,13 @@ debug_ls (const char *subcmd, size_t argc, char *const *const argv) cargv[2+i] = argv[i]; cargv[2+len] = NULL; - int r; - char *out, *err; - r = commandv (&out, &err, (void *) cargv); if (r == -1) { reply_with_error ("ls: %s", err); free (out); - free (err); return NULL; } - free (err); - return out; } @@ -430,6 +419,9 @@ debug_ll (const char *subcmd, size_t argc, char *const *const argv) size_t len = count_strings (argv); const char *cargv[len+3]; size_t i; + int r; + char *out; + CLEANUP_FREE char *err; cargv[0] = str_ls; cargv[1] = "-la"; @@ -437,19 +429,13 @@ debug_ll (const char *subcmd, size_t argc, char *const *const argv) cargv[2+i] = argv[i]; cargv[2+len] = NULL; - int r; - char *out, *err; - r = commandv (&out, &err, (void *) cargv); if (r == -1) { reply_with_error ("ll: %s", err); free (out); - free (err); return NULL; } - free (err); - return out; } @@ -590,7 +576,7 @@ debug_qtrace (const char *subcmd, size_t argc, char *const *const argv) { 2, 15, 21, 2, -1 }, /* disable trace */ { 2, 21, 15, 2, -1 } /* enable trace */ }; - void *buf; + CLEANUP_FREE void *buf = NULL; size_t i; /* For O_DIRECT, buffer must be aligned too (thanks Matt). @@ -608,20 +594,17 @@ debug_qtrace (const char *subcmd, size_t argc, char *const *const argv) if (lseek (fd, patterns[enable][i]*QTRACE_SIZE, SEEK_SET) == -1) { reply_with_perror ("qtrace: %s: lseek", argv[0]); close (fd); - free (buf); return NULL; } if (read (fd, buf, QTRACE_SIZE) == -1) { reply_with_perror ("qtrace: %s: read", argv[0]); close (fd); - free (buf); return NULL; } } close (fd); - free (buf); /* This does a sync and flushes all caches. */ if (do_drop_caches (3) == -1) diff --git a/daemon/devsparts.c b/daemon/devsparts.c index 7e319cbee..96959ffe7 100644 --- a/daemon/devsparts.c +++ b/daemon/devsparts.c @@ -247,39 +247,35 @@ do_part_to_partnum (const char *part) int do_device_index (const char *device) { - char **devices; size_t i; int ret = -1; + CLEANUP_FREE_STRING_LIST char **devices = do_list_devices (); - devices = do_list_devices (); if (devices == NULL) return -1; for (i = 0; devices[i] != NULL; ++i) { if (STREQ (device, devices[i])) ret = (int) i; - free (devices[i]); } - free (devices); if (ret == -1) reply_with_error ("device not found"); + return ret; } int do_nr_devices (void) { - char **devices; size_t i; + CLEANUP_FREE_STRING_LIST char **devices = do_list_devices (); - devices = do_list_devices (); if (devices == NULL) return -1; for (i = 0; devices[i] != NULL; ++i) - free (devices[i]); - free (devices); + ; return (int) i; } @@ -291,7 +287,7 @@ do_list_disk_labels (void) { DIR *dir = NULL; struct dirent *d; - char *path = NULL, *rawdev = NULL; + char *rawdev = NULL; DECLARE_STRINGSBUF (ret); dir = opendir (GUESTFSDIR); @@ -302,6 +298,8 @@ do_list_disk_labels (void) errno = 0; while ((d = readdir (dir)) != NULL) { + CLEANUP_FREE char *path = NULL; + if (d->d_name[0] == '.') continue; @@ -318,9 +316,6 @@ do_list_disk_labels (void) goto error; } - free (path); - path = NULL; - if (add_string (&ret, d->d_name) == -1) goto error; @@ -354,7 +349,6 @@ do_list_disk_labels (void) error: if (dir) closedir (dir); - free (path); free (rawdev); return NULL; } diff --git a/daemon/df.c b/daemon/df.c index e7236859d..f17708453 100644 --- a/daemon/df.c +++ b/daemon/df.c @@ -33,7 +33,8 @@ char * do_df (void) { int r; - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; NEED_ROOT (, return NULL); @@ -41,12 +42,9 @@ do_df (void) if (r == -1) { reply_with_error ("%s", err); free (out); - free (err); return NULL; } - free (err); - return out; /* Caller frees. */ } @@ -54,7 +52,8 @@ char * do_df_h (void) { int r; - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; NEED_ROOT (, return NULL); @@ -62,11 +61,8 @@ do_df_h (void) if (r == -1) { reply_with_error ("%s", err); free (out); - free (err); return NULL; } - free (err); - return out; /* Caller frees. */ } diff --git a/daemon/dir.c b/daemon/dir.c index cf90a0d66..07dc68f17 100644 --- a/daemon/dir.c +++ b/daemon/dir.c @@ -56,7 +56,7 @@ int do_rm_rf (const char *path) { int r; - char *buf, *err; + CLEANUP_FREE char *buf = NULL, *err = NULL; if (STREQ (path, "/")) { reply_with_error ("cannot remove root directory"); @@ -70,17 +70,12 @@ do_rm_rf (const char *path) } r = command (NULL, &err, str_rm, "-rf", buf, NULL); - free (buf); - /* rm -rf is never supposed to fail. I/O errors perhaps? */ if (r == -1) { reply_with_error ("%s: %s", path, err); - free (err); return -1; } - free (err); - return 0; } @@ -133,7 +128,7 @@ recursive_mkdir (const char *path) { int loop = 0; int r; - char *ppath, *p; + char *p; struct stat buf; again: @@ -153,14 +148,13 @@ recursive_mkdir (const char *path) if (path[0] == '/' && path[1] == '\0') return -1; /* Try to make the parent directory first. */ - ppath = strdup (path); + CLEANUP_FREE char *ppath = strdup (path); if (ppath == NULL) return -1; p = strrchr (ppath, '/'); if (p) *p = '\0'; r = recursive_mkdir (ppath); - free (ppath); if (r != 0) return r; diff --git a/daemon/dmesg.c b/daemon/dmesg.c index 69d4f3726..5e16861f2 100644 --- a/daemon/dmesg.c +++ b/daemon/dmesg.c @@ -32,17 +32,16 @@ GUESTFSD_EXT_CMD(str_dmesg, dmesg); char * do_dmesg (void) { - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; int r; r = command (&out, &err, str_dmesg, NULL); if (r == -1) { reply_with_error ("%s", err); free (out); - free (err); return NULL; } - free (err); return out; /* caller frees */ } diff --git a/daemon/du.c b/daemon/du.c index 4392befbb..9becae4e6 100644 --- a/daemon/du.c +++ b/daemon/du.c @@ -35,8 +35,7 @@ do_du (const char *path) { int r; int64_t rv; - char *out, *err; - char *buf; + CLEANUP_FREE char *out = NULL, *err = NULL, *buf = NULL; /* Make the path relative to /sysroot. */ buf = sysroot_path (path); @@ -48,26 +47,18 @@ do_du (const char *path) pulse_mode_start (); r = command (&out, &err, str_du, "-s", buf, NULL); - free (buf); if (r == -1) { pulse_mode_cancel (); reply_with_error ("%s: %s", path, err); - free (out); - free (err); return -1; } - free (err); - if (sscanf (out, "%"SCNi64, &rv) != 1) { pulse_mode_cancel (); reply_with_error ("%s: could not read output: %s", path, out); - free (out); return -1; } - free (out); - pulse_mode_end (); return rv; diff --git a/daemon/echo-daemon.c b/daemon/echo-daemon.c index 18e2cf8e3..c80581953 100644 --- a/daemon/echo-daemon.c +++ b/daemon/echo-daemon.c @@ -50,7 +50,7 @@ do_echo_daemon (char *const *argv) char *out_new = realloc (out, out_len + 1); if (NULL == out_new) { reply_with_perror ("realloc"); - free(out); + free (out); return 0; } out = out_new; diff --git a/daemon/ext2.c b/daemon/ext2.c index ab879dbed..5b58d3e6e 100644 --- a/daemon/ext2.c +++ b/daemon/ext2.c @@ -42,18 +42,15 @@ char ** do_tune2fs_l (const char *device) { int r; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; char *p, *pend, *colon; DECLARE_STRINGSBUF (ret); r = command (&out, &err, str_tune2fs, "-l", device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); - free (out); return NULL; } - free (err); p = out; @@ -63,7 +60,6 @@ do_tune2fs_l (const char *device) if (p) p++; else { reply_with_error ("truncated output"); - free (out); return NULL; } } @@ -85,30 +81,25 @@ do_tune2fs_l (const char *device) do { colon++; } while (*colon && c_isspace (*colon)); if (add_string (&ret, p) == -1) { - free (out); return NULL; } if (STREQ (colon, "") || STREQ (colon, "") || STREQ (colon, "(none)")) { if (add_string (&ret, "") == -1) { - free (out); return NULL; } } else { if (add_string (&ret, colon) == -1) { - free (out); return NULL; } } } else { if (add_string (&ret, p) == -1) { - free (out); return NULL; } if (add_string (&ret, "") == -1) { - free (out); return NULL; } } @@ -116,8 +107,6 @@ do_tune2fs_l (const char *device) p = pend; } - free (out); - if (end_stringsbuf (&ret) == -1) return NULL; @@ -140,16 +129,14 @@ int do_set_e2uuid (const char *device, const char *uuid) { int r; - char *err; + CLEANUP_FREE char *err = NULL; r = command (NULL, &err, str_tune2fs, "-U", uuid, device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } @@ -163,7 +150,7 @@ do_get_e2uuid (const char *device) static int if_not_mounted_run_e2fsck (const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r, mounted; mounted = is_device_mounted (device); @@ -176,10 +163,8 @@ if_not_mounted_run_e2fsck (const char *device) str_e2fsck, "-fy", device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); } return 0; @@ -188,7 +173,7 @@ if_not_mounted_run_e2fsck (const char *device) int do_resize2fs (const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; if (if_not_mounted_run_e2fsck (device) == -1) @@ -197,18 +182,16 @@ do_resize2fs (const char *device) r = command (NULL, &err, str_resize2fs, device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } int do_resize2fs_size (const char *device, int64_t size) { - char *err; + CLEANUP_FREE char *err = NULL; int r; /* resize2fs itself may impose additional limits. Since we are @@ -231,18 +214,16 @@ do_resize2fs_size (const char *device, int64_t size) r = command (NULL, &err, str_resize2fs, device, buf, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } int do_resize2fs_M (const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; if (if_not_mounted_run_e2fsck (device) == -1) @@ -251,11 +232,9 @@ do_resize2fs_M (const char *device) r = command (NULL, &err, str_resize2fs, "-M", device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } @@ -266,7 +245,7 @@ do_e2fsck (const char *device, int forceall) { const char *argv[MAX_ARGS]; - char *err; + CLEANUP_FREE char *err = NULL; size_t i = 0; int r; @@ -305,11 +284,9 @@ do_e2fsck (const char *device, */ if (r == -1 || r >= 2) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } @@ -323,7 +300,7 @@ do_e2fsck_f (const char *device) int do_mke2journal (int blocksize, const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; char blocksize_s[32]; @@ -334,18 +311,16 @@ do_mke2journal (int blocksize, const char *device) device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } int do_mke2journal_L (int blocksize, const char *label, const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; if (strlen (label) > EXT2_LABEL_MAX) { @@ -363,18 +338,16 @@ do_mke2journal_L (int blocksize, const char *label, const char *device) device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } int do_mke2journal_U (int blocksize, const char *uuid, const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; char blocksize_s[32]; @@ -386,11 +359,9 @@ do_mke2journal_U (int blocksize, const char *uuid, const char *device) device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } @@ -398,7 +369,7 @@ int do_mke2fs_J (const char *fstype, int blocksize, const char *device, const char *journal) { - char *err; + CLEANUP_FREE char *err = NULL; int r; char blocksize_s[32]; @@ -413,11 +384,9 @@ do_mke2fs_J (const char *fstype, int blocksize, const char *device, device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } @@ -425,7 +394,7 @@ int do_mke2fs_JL (const char *fstype, int blocksize, const char *device, const char *label) { - char *err; + CLEANUP_FREE char *err = NULL; int r; if (strlen (label) > EXT2_LABEL_MAX) { @@ -446,11 +415,9 @@ do_mke2fs_JL (const char *fstype, int blocksize, const char *device, device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } @@ -458,7 +425,7 @@ int do_mke2fs_JU (const char *fstype, int blocksize, const char *device, const char *uuid) { - char *err; + CLEANUP_FREE char *err = NULL; int r; char blocksize_s[32]; @@ -473,11 +440,9 @@ do_mke2fs_JU (const char *fstype, int blocksize, const char *device, device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } @@ -498,7 +463,7 @@ do_tune2fs (const char *device, /* only required parameter */ const char *argv[MAX_ARGS]; size_t i = 0; int r; - char *err; + CLEANUP_FREE char *err = NULL; char maxmountcount_s[64]; char mountcount_s[64]; char group_s[64]; @@ -616,11 +581,9 @@ do_tune2fs (const char *device, /* only required parameter */ r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); return 0; } @@ -636,8 +599,9 @@ char * do_get_e2attrs (const char *filename) { int r; - char *buf; - char *out, *err; + CLEANUP_FREE char *buf; + char *out; + CLEANUP_FREE char *err; size_t i, j; buf = sysroot_path (filename); @@ -647,14 +611,11 @@ do_get_e2attrs (const char *filename) } r = command (&out, &err, str_lsattr, "-d", "--", buf, NULL); - free (buf); if (r == -1) { reply_with_error ("%s: %s: %s", "lsattr", filename, err); - free (err); free (out); return NULL; } - free (err); /* Output looks like: * -------------e- filename @@ -678,8 +639,8 @@ int do_set_e2attrs (const char *filename, const char *attrs, int clear) { int r; - char *buf; - char *err; + CLEANUP_FREE char *buf = NULL; + CLEANUP_FREE char *err = NULL; size_t i, j; int lowers[26], uppers[26]; char attr_arg[26*2+1+1]; /* '+'/'-' + attrs + trailing '\0' */ @@ -741,13 +702,10 @@ do_set_e2attrs (const char *filename, const char *attrs, int clear) } r = command (NULL, &err, str_chattr, attr_arg, "--", buf, NULL); - free (buf); if (r == -1) { reply_with_error ("%s: %s: %s", "chattr", filename, err); - free (err); return -1; } - free (err); return 0; } @@ -756,8 +714,7 @@ int64_t do_get_e2generation (const char *filename) { int r; - char *buf; - char *out, *err; + CLEANUP_FREE char *buf = NULL, *out = NULL, *err = NULL; int64_t ret; buf = sysroot_path (filename); @@ -767,22 +724,16 @@ do_get_e2generation (const char *filename) } r = command (&out, &err, str_lsattr, "-dv", "--", buf, NULL); - free (buf); if (r == -1) { reply_with_error ("%s: %s: %s", "lsattr", filename, err); - free (err); - free (out); return -1; } - free (err); if (sscanf (out, "%" SCNu64, &ret) != 1) { reply_with_error ("cannot parse output from '%s' command: %s", "lsattr", out); - free (out); return -1; } - free (out); return ret; } @@ -791,8 +742,7 @@ int do_set_e2generation (const char *filename, int64_t generation) { int r; - char *buf; - char *err; + CLEANUP_FREE char *buf = NULL, *err = NULL; char generation_str[64]; buf = sysroot_path (filename); @@ -805,13 +755,10 @@ do_set_e2generation (const char *filename, int64_t generation) "%" PRIu64, (uint64_t) generation); r = command (NULL, &err, str_chattr, "-v", generation_str, "--", buf, NULL); - free (buf); if (r == -1) { reply_with_error ("%s: %s: %s", "chattr", filename, err); - free (err); return -1; } - free (err); return 0; } @@ -858,7 +805,7 @@ do_mke2fs (const char *device, /* 0 */ int uninitbg) { int r; - char *err = NULL; + CLEANUP_FREE char *err = NULL; const char *argv[MAX_ARGS]; char blockscount_s[64]; char blocksize_s[64]; @@ -868,7 +815,7 @@ do_mke2fs (const char *device, /* 0 */ char bytesperinode_s[64]; char inodesize_s[64]; char journalsize_s[64]; - char *journaldevice_s = NULL; + CLEANUP_FREE char *journaldevice_s = NULL; char reservedblockspercentage_s[64]; char numberofinodes_s[64]; char mmpupdateinterval_s[84]; @@ -882,7 +829,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_BLOCKSIZE_BITMASK) { if (blocksize < 0) { reply_with_error ("blocksize must be >= 0"); - goto error; + return -1; } snprintf (blocksize_s, sizeof blocksize_s, "%" PRIi64, blocksize); ADD_ARG (argv, i, "-b"); @@ -891,7 +838,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_FRAGSIZE_BITMASK) { if (fragsize < 0) { reply_with_error ("fragsize must be >= 0"); - goto error; + return -1; } snprintf (fragsize_s, sizeof fragsize_s, "%" PRIi64, fragsize); ADD_ARG (argv, i, "-f"); @@ -904,7 +851,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_BLOCKSPERGROUP_BITMASK) { if (blockspergroup < 0) { reply_with_error ("blockspergroup must be >= 0"); - goto error; + return -1; } snprintf (blockspergroup_s, sizeof blockspergroup_s, "%" PRIi64, blockspergroup); @@ -914,7 +861,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_NUMBEROFGROUPS_BITMASK) { if (numberofgroups < 0) { reply_with_error ("numberofgroups must be >= 0"); - goto error; + return -1; } snprintf (numberofgroups_s, sizeof numberofgroups_s, "%" PRIi64, numberofgroups); @@ -924,7 +871,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_BYTESPERINODE_BITMASK) { if (bytesperinode < 0) { reply_with_error ("bytesperinode must be >= 0"); - goto error; + return -1; } snprintf (bytesperinode_s, sizeof bytesperinode_s, "%" PRIi64, bytesperinode); ADD_ARG (argv, i, "-i"); @@ -933,7 +880,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_INODESIZE_BITMASK) { if (inodesize < 0) { reply_with_error ("inodesize must be >= 0"); - goto error; + return -1; } snprintf (inodesize_s, sizeof inodesize_s, "%" PRIi64, inodesize); ADD_ARG (argv, i, "-I"); @@ -942,7 +889,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_JOURNALSIZE_BITMASK) { if (journalsize < 0) { reply_with_error ("journalsize must be >= 0"); - goto error; + return -1; } snprintf (journalsize_s, sizeof journalsize_s, "size=" "%" PRIi64, journalsize); @@ -958,12 +905,12 @@ do_mke2fs (const char *device, /* 0 */ journaldevice_s = malloc (strlen (journaldevice) + 8); if (!journaldevice_s) { reply_with_perror ("malloc"); - goto error; + return -1; } sprintf (journaldevice_s, "device=%s", journaldevice); if (STRPREFIX (&journaldevice_s[7], "/dev/")) - RESOLVE_DEVICE (&journaldevice_s[7], , goto error); + RESOLVE_DEVICE (&journaldevice_s[7], , return -1); ADD_ARG (argv, i, "-J"); ADD_ARG (argv, i, journaldevice_s); @@ -978,7 +925,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_RESERVEDBLOCKSPERCENTAGE_BITMASK) { if (reservedblockspercentage < 0) { reply_with_error ("reservedblockspercentage must be >= 0"); - goto error; + return -1; } snprintf (reservedblockspercentage_s, sizeof reservedblockspercentage_s, "%" PRIi32, reservedblockspercentage); @@ -994,7 +941,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_NUMBEROFINODES_BITMASK) { if (numberofinodes < 0) { reply_with_error ("numberofinodes must be >= 0"); - goto error; + return -1; } snprintf (numberofinodes_s, sizeof numberofinodes_s, "%" PRIi64, numberofinodes); @@ -1032,7 +979,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_MMPUPDATEINTERVAL_BITMASK) { if (mmpupdateinterval < 0) { reply_with_error ("mmpupdateinterval must be >= 0"); - goto error; + return -1; } snprintf (mmpupdateinterval_s, sizeof mmpupdateinterval_s, "mmp_update_interval=" "%" PRIi32, mmpupdateinterval); @@ -1042,7 +989,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_STRIDESIZE_BITMASK) { if (stridesize < 0) { reply_with_error ("stridesize must be >= 0"); - goto error; + return -1; } snprintf (stridesize_s, sizeof stridesize_s, "stride=" "%" PRIi64, stridesize); @@ -1052,7 +999,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_STRIPEWIDTH_BITMASK) { if (stripewidth< 0) { reply_with_error ("stripewidth must be >= 0"); - goto error; + return -1; } snprintf (stripewidth_s, sizeof stripewidth_s, "stripe_width=" "%" PRIi64, stripewidth); @@ -1062,7 +1009,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_MAXONLINERESIZE_BITMASK) { if (maxonlineresize < 0) { reply_with_error ("maxonlineresize must be >= 0"); - goto error; + return -1; } snprintf (maxonlineresize_s, sizeof maxonlineresize_s, "resize=" "%" PRIi64, maxonlineresize); @@ -1173,7 +1120,7 @@ do_mke2fs (const char *device, /* 0 */ if (optargs_bitmask & GUESTFS_MKE2FS_BLOCKSCOUNT_BITMASK) { if (blockscount < 0) { reply_with_error ("blockscount must be >= 0"); - goto error; + return -1; } snprintf (blockscount_s, sizeof blockscount_s, "%" PRIi64, blockscount); ADD_ARG (argv, i, blockscount_s); @@ -1184,23 +1131,16 @@ do_mke2fs (const char *device, /* 0 */ r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s: %s", device, err); - goto error; + return -1; } - free (journaldevice_s); - free (err); return 0; - -error: - free (journaldevice_s); - free (err); - return -1; } int do_mklost_and_found (const char *mountpoint) { - char *cmd; + CLEANUP_FREE char *cmd = NULL; int r; if (asprintf_nowarn (&cmd, "cd %R && mklost+found", mountpoint) == -1) { @@ -1211,15 +1151,12 @@ do_mklost_and_found (const char *mountpoint) r = system (cmd); if (r == -1) { reply_with_perror ("system"); - free (cmd); return -1; } if (!WIFEXITED (r) || WEXITSTATUS (r) != 0) { reply_with_error ("%s: command failed", cmd); - free (cmd); return -1; } - free (cmd); return 0; } diff --git a/daemon/file.c b/daemon/file.c index 5ca9ccfa9..df78b77d2 100644 --- a/daemon/file.c +++ b/daemon/file.c @@ -440,7 +440,7 @@ do_pwrite_device (const char *device, const char *content, size_t size, char * do_file (const char *path) { - char *buf = NULL; + CLEANUP_FREE char *buf = NULL; const char *display_path = path; int is_dev = STRPREFIX (path, "/dev/"); @@ -459,15 +459,12 @@ do_file (const char *path) struct stat statbuf; if (lstat (path, &statbuf) == -1) { reply_with_perror ("lstat: %s", display_path); - free (buf); return NULL; } if (! S_ISREG (statbuf.st_mode)) { char *ret; - free (buf); - if (S_ISDIR (statbuf.st_mode)) ret = strdup ("directory"); else if (S_ISCHR (statbuf.st_mode)) @@ -494,17 +491,15 @@ do_file (const char *path) */ const char *flags = is_dev ? "-zbsL" : "-zb"; - char *out, *err; + char *out; + CLEANUP_FREE char *err; int r = command (&out, &err, str_file, flags, path, NULL); - free (buf); if (r == -1) { free (out); reply_with_error ("%s: %s", display_path, err); - free (err); return NULL; } - free (err); /* We need to remove the trailing \n from output of file(1). */ size_t len = strlen (out); @@ -520,7 +515,7 @@ do_zfile (const char *method, const char *path) { size_t len; const char *zcat; - char *cmd; + CLEANUP_FREE char *cmd = NULL; FILE *fp; char line[256]; @@ -544,12 +539,9 @@ do_zfile (const char *method, const char *path) fp = popen (cmd, "r"); if (fp == NULL) { reply_with_perror ("%s", cmd); - free (cmd); return NULL; } - free (cmd); - if (fgets (line, sizeof line, fp) == NULL) { reply_with_perror ("fgets"); fclose (fp); diff --git a/daemon/find.c b/daemon/find.c index 060d58476..3ea40f65e 100644 --- a/daemon/find.c +++ b/daemon/find.c @@ -66,8 +66,8 @@ do_find0 (const char *dir) struct stat statbuf; int r; FILE *fp; - char *cmd; - char *sysrootdir; + CLEANUP_FREE char *cmd = NULL; + CLEANUP_FREE char *sysrootdir = NULL; size_t sysrootdirlen, len; char str[GUESTFS_MAX_CHUNK_SIZE]; @@ -80,12 +80,10 @@ do_find0 (const char *dir) r = stat (sysrootdir, &statbuf); if (r == -1) { reply_with_perror ("%s", dir); - free (sysrootdir); return -1; } if (!S_ISDIR (statbuf.st_mode)) { reply_with_error ("%s: not a directory", dir); - free (sysrootdir); return -1; } @@ -93,10 +91,8 @@ do_find0 (const char *dir) if (asprintf_nowarn (&cmd, "%s %Q -print0", str_find, sysrootdir) == -1) { reply_with_perror ("asprintf"); - free (sysrootdir); return -1; } - free (sysrootdir); if (verbose) fprintf (stderr, "%s\n", cmd); @@ -104,10 +100,8 @@ do_find0 (const char *dir) fp = popen (cmd, "r"); if (fp == NULL) { reply_with_perror ("%s", cmd); - free (cmd); return -1; } - free (cmd); /* Now we must send the reply message, before the file contents. After * this there is no opportunity in the protocol to send any error diff --git a/daemon/findfs.c b/daemon/findfs.c index 3dd74b45e..a5047cb89 100644 --- a/daemon/findfs.c +++ b/daemon/findfs.c @@ -31,6 +31,10 @@ GUESTFSD_EXT_CMD(str_findfs, findfs); static char * findfs (const char *tag, const char *label_or_uuid) { + char *out; + CLEANUP_FREE char *err = NULL; + int r; + /* Kill the cache file, forcing blkid to reread values from the * original filesystems. In blkid there is a '-p' option which is * supposed to do this, but (a) it doesn't work and (b) that option @@ -43,17 +47,13 @@ findfs (const char *tag, const char *label_or_uuid) char arg[len]; snprintf (arg, len, "%s=%s", tag, label_or_uuid); - char *out, *err; - int r = command (&out, &err, str_findfs, arg, NULL); + r = command (&out, &err, str_findfs, arg, NULL); if (r == -1) { reply_with_error ("%s", err); free (out); - free (err); return NULL; } - free (err); - /* Trim trailing \n if present. */ len = strlen (out); if (len > 0 && out[len-1] == '\n') diff --git a/daemon/fsck.c b/daemon/fsck.c index aa3537e5b..540f779d3 100644 --- a/daemon/fsck.c +++ b/daemon/fsck.c @@ -31,16 +31,14 @@ GUESTFSD_EXT_CMD(str_fsck, fsck); int do_fsck (const char *fstype, const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = commandr (NULL, &err, str_fsck, "-a", "-t", fstype, device, NULL); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); return r; } diff --git a/daemon/fstrim.c b/daemon/fstrim.c index ea47c9581..cb844d1c2 100644 --- a/daemon/fstrim.c +++ b/daemon/fstrim.c @@ -46,7 +46,7 @@ do_fstrim (const char *path, const char *argv[MAX_ARGS]; size_t i = 0; char offset_s[64], length_s[64], mfe_s[64]; - char *err; + CLEANUP_FREE char *err = NULL; int r; ADD_ARG (argv, i, str_fstrim); @@ -90,10 +90,8 @@ do_fstrim (const char *path, r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } diff --git a/daemon/grep.c b/daemon/grep.c index d0fd42bcd..6dd9a99e9 100644 --- a/daemon/grep.c +++ b/daemon/grep.c @@ -36,7 +36,7 @@ grep (const char *regex, const char *path, { const char *argv[MAX_ARGS]; size_t i = 0; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; int fd, flags, r; char **lines; @@ -78,15 +78,10 @@ grep (const char *regex, const char *path, r = commandrvf (&out, &err, flags, argv); if (r == -1 || r > 1) { reply_with_error ("%s: %s", regex, err); - free (out); - free (err); return NULL; } - free (err); - lines = split_lines (out); - free (out); if (lines == NULL) return NULL; return lines; diff --git a/daemon/grub.c b/daemon/grub.c index cb1fac245..da2061a3f 100644 --- a/daemon/grub.c +++ b/daemon/grub.c @@ -38,8 +38,7 @@ int do_grub_install (const char *root, const char *device) { int r; - char *err; - char *buf; + CLEANUP_FREE char *err = NULL, *buf = NULL; if (asprintf_nowarn (&buf, "--root-directory=%R", root) == -1) { reply_with_perror ("asprintf"); @@ -47,14 +46,11 @@ do_grub_install (const char *root, const char *device) } r = command (NULL, &err, str_grub_install, buf, device, NULL); - free (buf); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index c037ef5b9..dfa5ae2c7 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -657,7 +657,8 @@ int commandf (char **stdoutput, char **stderror, int flags, const char *name, ...) { va_list args; - const char **argv; + /* NB: Mustn't free the strings which are on the stack. */ + CLEANUP_FREE const char **argv; char *s; size_t i; int r; @@ -678,7 +679,6 @@ commandf (char **stdoutput, char **stderror, int flags, const char *name, ...) const char **p = realloc (argv, sizeof (char *) * (++i)); if (p == NULL) { perror ("realloc"); - free (argv); va_end (args); return -1; } @@ -691,9 +691,6 @@ commandf (char **stdoutput, char **stderror, int flags, const char *name, ...) r = commandvf (stdoutput, stderror, flags, (const char * const*) argv); - /* NB: Mustn't free the strings which are on the stack. */ - free (argv); - return r; } @@ -705,7 +702,7 @@ int commandrf (char **stdoutput, char **stderror, int flags, const char *name, ...) { va_list args; - const char **argv; + CLEANUP_FREE const char **argv; char *s; int i, r; @@ -725,7 +722,6 @@ commandrf (char **stdoutput, char **stderror, int flags, const char *name, ...) const char **p = realloc (argv, sizeof (char *) * (++i)); if (p == NULL) { perror ("realloc"); - free (argv); va_end (args); return -1; } @@ -738,9 +734,6 @@ commandrf (char **stdoutput, char **stderror, int flags, const char *name, ...) r = commandrvf (stdoutput, stderror, flags, argv); - /* NB: Mustn't free the strings which are on the stack. */ - free (argv); - return r; } diff --git a/daemon/headtail.c b/daemon/headtail.c index ce59d1740..16140743d 100644 --- a/daemon/headtail.c +++ b/daemon/headtail.c @@ -31,7 +31,7 @@ static char ** headtail (const char *prog, const char *flag, const char *n, const char *path) { - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; int fd, flags, r; char **lines; @@ -48,13 +48,9 @@ headtail (const char *prog, const char *flag, const char *n, const char *path) r = commandf (&out, &err, flags, prog, flag, n, NULL); if (r == -1) { reply_with_error ("%s %s %s: %s", prog, flag, n, err); - free (out); - free (err); return NULL; } - free (err); - #if 0 /* Split it at the first whitespace. */ len = strcspn (out, " \t\n"); @@ -62,7 +58,6 @@ headtail (const char *prog, const char *flag, const char *n, const char *path) #endif lines = split_lines (out); - free (out); if (lines == NULL) return NULL; return lines; diff --git a/daemon/hexdump.c b/daemon/hexdump.c index 7fa5fbd83..3afa48f16 100644 --- a/daemon/hexdump.c +++ b/daemon/hexdump.c @@ -31,7 +31,8 @@ char * do_hexdump (const char *path) { int fd, flags, r; - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; CHROOT_IN; fd = open (path, O_RDONLY|O_CLOEXEC); @@ -46,12 +47,9 @@ do_hexdump (const char *path) r = commandf (&out, &err, flags, "hexdump", "-C", NULL); if (r == -1) { reply_with_error ("%s: %s", path, err); - free (err); free (out); return NULL; } - free (err); - return out; /* caller frees */ } diff --git a/daemon/hivex.c b/daemon/hivex.c index 27a9c5c80..971d7c278 100644 --- a/daemon/hivex.c +++ b/daemon/hivex.c @@ -70,7 +70,7 @@ hivex_finalize (void) int do_hivex_open (const char *filename, int verbose, int debug, int write) { - char *buf; + CLEANUP_FREE char *buf = NULL; int flags = 0; if (h) { @@ -100,11 +100,9 @@ do_hivex_open (const char *filename, int verbose, int debug, int write) h = hivex_open (buf, flags); if (!h) { reply_with_perror ("hivex failed to open %s", filename); - free (buf); return -1; } - free (buf); return 0; } @@ -155,7 +153,7 @@ guestfs_int_hivex_node_list * do_hivex_node_children (int64_t nodeh) { guestfs_int_hivex_node_list *ret; - hive_node_h *r; + CLEANUP_FREE hive_node_h *r = NULL; size_t i, len; NEED_HANDLE (NULL); @@ -173,7 +171,6 @@ do_hivex_node_children (int64_t nodeh) ret = malloc (sizeof *ret); if (!ret) { reply_with_perror ("malloc"); - free (r); return NULL; } @@ -183,15 +180,12 @@ do_hivex_node_children (int64_t nodeh) if (ret->guestfs_int_hivex_node_list_val == NULL) { reply_with_perror ("malloc"); free (ret); - free (r); return NULL; } for (i = 0; i < len; ++i) ret->guestfs_int_hivex_node_list_val[i].hivex_node_h = r[i]; - free (r); - return ret; } @@ -232,7 +226,7 @@ guestfs_int_hivex_value_list * do_hivex_node_values (int64_t nodeh) { guestfs_int_hivex_value_list *ret; - hive_value_h *r; + CLEANUP_FREE hive_value_h *r = NULL; size_t i, len; NEED_HANDLE (NULL); @@ -250,7 +244,6 @@ do_hivex_node_values (int64_t nodeh) ret = malloc (sizeof *ret); if (!ret) { reply_with_perror ("malloc"); - free (r); return NULL; } @@ -260,15 +253,12 @@ do_hivex_node_values (int64_t nodeh) if (ret->guestfs_int_hivex_value_list_val == NULL) { reply_with_perror ("malloc"); free (ret); - free (r); return NULL; } for (i = 0; i < len; ++i) ret->guestfs_int_hivex_value_list_val[i].hivex_value_h = (int64_t) r[i]; - free (r); - return ret; } diff --git a/daemon/hotplug.c b/daemon/hotplug.c index 05367e3b1..7ff4ced17 100644 --- a/daemon/hotplug.c +++ b/daemon/hotplug.c @@ -83,7 +83,7 @@ do_internal_hot_remove_drive_precheck (const char *label) size_t len = strlen (label); char path[len+64]; int r; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; /* Ensure there are no requests in flight (thanks Paolo Bonzini). */ udev_settle (); @@ -94,11 +94,8 @@ do_internal_hot_remove_drive_precheck (const char *label) r = commandr (&out, &err, str_fuser, "-v", "-m", path, NULL); if (r == -1) { reply_with_error ("fuser: %s: %s", path, err); - free (out); - free (err); return -1; } - free (err); /* "fuser returns a non-zero return code if none of the specified * files is accessed or in case of a fatal error. If at least one @@ -112,13 +109,9 @@ do_internal_hot_remove_drive_precheck (const char *label) if (verbose) fprintf (stderr, "%s\n", out); - free (out); - return -1; } - free (out); - return 0; } diff --git a/daemon/initrd.c b/daemon/initrd.c index d9bc0f7ec..11a156a6d 100644 --- a/daemon/initrd.c +++ b/daemon/initrd.c @@ -37,7 +37,7 @@ char ** do_initrd_list (const char *path) { FILE *fp; - char *cmd; + CLEANUP_FREE char *cmd = NULL; char filename[PATH_MAX]; DECLARE_STRINGSBUF (filenames); size_t len; @@ -54,10 +54,8 @@ do_initrd_list (const char *path) fp = popen (cmd, "r"); if (fp == NULL) { reply_with_perror ("popen: %s", cmd); - free (cmd); return NULL; } - free (cmd); while (fgets (filename, sizeof filename, fp) != NULL) { len = strlen (filename); @@ -94,7 +92,7 @@ do_initrd_cat (const char *path, const char *filename, size_t *size_r) } /* "zcat /sysroot/ | cpio --quiet -id file", but paths must be quoted */ - char *cmd; + CLEANUP_FREE char *cmd; if (asprintf_nowarn (&cmd, "cd %Q && zcat %R | cpio --quiet -id %Q", tmpdir, path, filename) == -1) { reply_with_perror ("asprintf"); @@ -110,11 +108,9 @@ do_initrd_cat (const char *path, const char *filename, size_t *size_r) int r = system (cmd); if (r == -1) { reply_with_perror ("command failed: %s", cmd); - free (cmd); rmdir (tmpdir); return NULL; } - free (cmd); if (WEXITSTATUS (r) != 0) { reply_with_perror ("command failed with return code %d", WEXITSTATUS (r)); diff --git a/daemon/inotify.c b/daemon/inotify.c index 30a6f8322..dd10e88f6 100644 --- a/daemon/inotify.c +++ b/daemon/inotify.c @@ -154,7 +154,7 @@ int64_t do_inotify_add_watch (const char *path, int mask) { int64_t r; - char *buf; + CLEANUP_FREE char *buf = NULL; NEED_INOTIFY (-1); @@ -165,7 +165,6 @@ do_inotify_add_watch (const char *path, int mask) } r = inotify_add_watch (inotify_fd, buf, mask); - free (buf); if (r == -1) { reply_with_perror ("%s", path); return -1; diff --git a/daemon/isoinfo.c b/daemon/isoinfo.c index b37178f51..3e1acf848 100644 --- a/daemon/isoinfo.c +++ b/daemon/isoinfo.c @@ -239,10 +239,9 @@ parse_isoinfo (char **lines) static guestfs_int_isoinfo * isoinfo (const char *path) { - char *out = NULL, *err = NULL; int r; - char **lines = NULL; - guestfs_int_isoinfo *ret = NULL; + CLEANUP_FREE char *out = NULL, *err = NULL; + CLEANUP_FREE_STRING_LIST char **lines = NULL; /* --debug is necessary to get additional fields, in particular * the date & time fields. @@ -250,24 +249,14 @@ isoinfo (const char *path) r = command (&out, &err, str_isoinfo, "--debug", "-d", "-i", path, NULL); if (r == -1) { reply_with_error ("%s", err); - goto done; + return NULL; } lines = split_lines (out); if (lines == NULL) - goto done; + return NULL; - ret = parse_isoinfo (lines); - if (ret == NULL) - goto done; - - done: - free (out); - free (err); - if (lines) - free_strings (lines); - - return ret; + return parse_isoinfo (lines); } guestfs_int_isoinfo * @@ -279,17 +268,14 @@ do_isoinfo_device (const char *device) guestfs_int_isoinfo * do_isoinfo (const char *path) { - char *buf; guestfs_int_isoinfo *ret; - - buf = sysroot_path (path); + CLEANUP_FREE char *buf = sysroot_path (path); if (!buf) { reply_with_perror ("malloc"); return NULL; } ret = isoinfo (buf); - free (buf); return ret; } diff --git a/daemon/labels.c b/daemon/labels.c index ead6b46b6..2fda354c8 100644 --- a/daemon/labels.c +++ b/daemon/labels.c @@ -34,7 +34,7 @@ static int e2label (const char *device, const char *label) { int r; - char *err; + CLEANUP_FREE char *err = NULL; if (strlen (label) > EXT2_LABEL_MAX) { reply_with_error ("%s: ext2 labels are limited to %d bytes", @@ -45,11 +45,9 @@ e2label (const char *device, const char *label) r = command (NULL, &err, str_e2label, device, label, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } @@ -57,7 +55,7 @@ static int ntfslabel (const char *device, const char *label) { int r; - char *err; + CLEANUP_FREE char *err = NULL; /* XXX We should check if the label is longer than 128 unicode * characters and return an error. This is not so easy since we @@ -66,22 +64,19 @@ ntfslabel (const char *device, const char *label) r = command (NULL, &err, str_ntfslabel, device, label, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } int do_set_label (const char *device, const char *label) { - char *vfs_type; int r; /* How we set the label depends on the filesystem type. */ - vfs_type = do_vfs_type (device); + CLEANUP_FREE char *vfs_type = do_vfs_type (device); if (vfs_type == NULL) return -1; @@ -98,6 +93,5 @@ do_set_label (const char *device, const char *label) r = -1; } - free (vfs_type); return r; } diff --git a/daemon/ldm.c b/daemon/ldm.c index 135e5ebc9..b7ef30118 100644 --- a/daemon/ldm.c +++ b/daemon/ldm.c @@ -105,15 +105,13 @@ int do_ldmtool_create_all (void) { int r; - char *err; + CLEANUP_FREE char *err = NULL; r = command (NULL, &err, "ldmtool", "create", "all", NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } @@ -121,15 +119,13 @@ int do_ldmtool_remove_all (void) { int r; - char *err; + CLEANUP_FREE char *err = NULL; r = command (NULL, &err, "ldmtool", "remove", "all", NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } @@ -293,9 +289,9 @@ do_ldmtool_scan_devices (char * const * devices) { char **ret; size_t i, nr_devices; - const char **argv; + CLEANUP_FREE_STRING_LIST const char **argv = NULL; int r; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; nr_devices = count_strings (devices); argv = malloc ((3 + nr_devices) * sizeof (char *)); @@ -311,153 +307,113 @@ do_ldmtool_scan_devices (char * const * devices) argv[2+i] = NULL; r = commandv (&out, &err, argv); - free (argv); if (r == -1) { reply_with_error ("%s", err); - free (out); - free (err); return NULL; } - free (err); ret = parse_json_get_string_list (out, __func__, "ldmtool scan"); - free (out); return ret; } char * do_ldmtool_diskgroup_name (const char *diskgroup) { - char *ret; int r; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; r = command (&out, &err, str_ldmtool, "show", "diskgroup", diskgroup, NULL); if (r == -1) { reply_with_error ("%s", err); - free (out); - free (err); return NULL; } - free (err); - ret = parse_json_get_object_string (out, "name", 0, - __func__, "ldmtool show diskgroup"); - free (out); - return ret; + return parse_json_get_object_string (out, "name", 0, + __func__, "ldmtool show diskgroup"); } char ** do_ldmtool_diskgroup_volumes (const char *diskgroup) { - char **ret; int r; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; r = command (&out, &err, str_ldmtool, "show", "diskgroup", diskgroup, NULL); if (r == -1) { reply_with_error ("%s", err); - free (out); - free (err); return NULL; } free (err); - ret = parse_json_get_object_string_list (out, "volumes", - __func__, "ldmtool show diskgroup"); - free (out); - return ret; + return parse_json_get_object_string_list (out, "volumes", + __func__, "ldmtool show diskgroup"); } char ** do_ldmtool_diskgroup_disks (const char *diskgroup) { - char **ret; int r; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; r = command (&out, &err, str_ldmtool, "show", "diskgroup", diskgroup, NULL); if (r == -1) { reply_with_error ("%s", err); - free (out); - free (err); return NULL; } - free (err); - ret = parse_json_get_object_string_list (out, "disks", - __func__, "ldmtool show diskgroup"); - free (out); - return ret; + return parse_json_get_object_string_list (out, "disks", + __func__, "ldmtool show diskgroup"); } char * do_ldmtool_volume_type (const char *diskgroup, const char *volume) { - char *ret; int r; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; r = command (&out, &err, str_ldmtool, "show", "volume", diskgroup, volume, NULL); if (r == -1) { reply_with_error ("%s", err); - free (out); - free (err); return NULL; } - free (err); - ret = parse_json_get_object_string (out, "type", 0, - __func__, "ldmtool show volume"); - free (out); - return ret; + return parse_json_get_object_string (out, "type", 0, + __func__, "ldmtool show volume"); } char * do_ldmtool_volume_hint (const char *diskgroup, const char *volume) { - char *ret; int r; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; r = command (&out, &err, str_ldmtool, "show", "volume", diskgroup, volume, NULL); if (r == -1) { reply_with_error ("%s", err); - free (out); - free (err); return NULL; } - free (err); - ret = parse_json_get_object_string (out, "hint", GET_STRING_NULL_TO_EMPTY, - __func__, "ldmtool show volume"); - free (out); - return ret; + return parse_json_get_object_string (out, "hint", GET_STRING_NULL_TO_EMPTY, + __func__, "ldmtool show volume"); } char ** do_ldmtool_volume_partitions (const char *diskgroup, const char *volume) { - char **ret; int r; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; r = command (&out, &err, str_ldmtool, "show", "volume", diskgroup, volume, NULL); if (r == -1) { reply_with_error ("%s", err); - free (out); - free (err); return NULL; } - free (err); - ret = parse_json_get_object_string_list (out, "partitions", - __func__, "ldmtool show volume"); - free (out); - return ret; + return parse_json_get_object_string_list (out, "partitions", + __func__, "ldmtool show volume"); } #else /* !HAVE_YAJL */ diff --git a/daemon/link.c b/daemon/link.c index 7db2af80d..18b6bd6aa 100644 --- a/daemon/link.c +++ b/daemon/link.c @@ -141,8 +141,8 @@ static int _symlink (const char *flag, const char *target, const char *linkname) { int r; - char *err; - char *buf_linkname; + CLEANUP_FREE char *err = NULL; + CLEANUP_FREE char *buf_linkname = NULL; /* Prefix linkname with sysroot. */ buf_linkname = sysroot_path (linkname); @@ -154,16 +154,12 @@ _symlink (const char *flag, const char *target, const char *linkname) r = command (NULL, &err, str_ln, flag, "--", /* target could begin with '-' */ target, buf_linkname, NULL); - free (buf_linkname); if (r == -1) { reply_with_error ("ln %s: %s: %s: %s", flag, target, linkname, err); - free (err); return -1; } - free (err); - return 0; } diff --git a/daemon/ls.c b/daemon/ls.c index b2de9e556..3b49730dc 100644 --- a/daemon/ls.c +++ b/daemon/ls.c @@ -105,8 +105,9 @@ char * do_ll (const char *path) { int r; - char *out, *err; - char *spath; + char *out; + CLEANUP_FREE char *err = NULL; + CLEANUP_FREE char *spath = NULL; spath = sysroot_path (path); if (!spath) { @@ -115,15 +116,12 @@ do_ll (const char *path) } r = command (&out, &err, str_ls, "-la", spath, NULL); - free (spath); if (r == -1) { reply_with_error ("%s", err); free (out); - free (err); return NULL; } - free (err); return out; /* caller frees */ } @@ -131,8 +129,9 @@ char * do_llz (const char *path) { int r; - char *out, *err; - char *spath; + char *out; + CLEANUP_FREE char *err = NULL; + CLEANUP_FREE char *spath; spath = sysroot_path (path); if (!spath) { @@ -141,14 +140,11 @@ do_llz (const char *path) } r = command (&out, &err, str_ls, "-laZ", spath, NULL); - free (spath); if (r == -1) { reply_with_error ("%s", err); free (out); - free (err); return NULL; } - free (err); return out; /* caller frees */ } diff --git a/daemon/luks.c b/daemon/luks.c index 9ce8e2cf0..a720e2539 100644 --- a/daemon/luks.c +++ b/daemon/luks.c @@ -115,18 +115,15 @@ luks_open (const char *device, const char *key, const char *mapname, ADD_ARG (argv, i, mapname); ADD_ARG (argv, i, NULL); - char *err; + CLEANUP_FREE char *err = NULL; int r = commandv (NULL, &err, (const char * const *) argv); remove_temp (tempfile); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -155,16 +152,13 @@ do_luks_close (const char *device) const char *mapname = &device[12]; - char *err; + CLEANUP_FREE char *err = NULL; int r = command (NULL, &err, str_cryptsetup, "luksClose", mapname, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -196,18 +190,15 @@ luks_format (const char *device, const char *key, int keyslot, ADD_ARG (argv, i, tempfile); ADD_ARG (argv, i, NULL); - char *err; + CLEANUP_FREE char *err = NULL; int r = commandv (NULL, &err, (const char * const *) argv); remove_temp (tempfile); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -256,19 +247,16 @@ do_luks_add_key (const char *device, const char *key, const char *newkey, ADD_ARG (argv, i, newkeyfile); ADD_ARG (argv, i, NULL); - char *err; + CLEANUP_FREE char *err = NULL; int r = commandv (NULL, &err, (const char * const *) argv); remove_temp (keyfile); remove_temp (newkeyfile); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - return 0; } @@ -293,17 +281,14 @@ do_luks_kill_slot (const char *device, const char *key, int keyslot) ADD_ARG (argv, i, keyslot_s); ADD_ARG (argv, i, NULL); - char *err; + CLEANUP_FREE char *err = NULL; int r = commandv (NULL, &err, (const char * const *) argv); remove_temp (tempfile); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - return 0; } diff --git a/daemon/lvm-filter.c b/daemon/lvm-filter.c index 0048f29b7..d96fa3bf0 100644 --- a/daemon/lvm-filter.c +++ b/daemon/lvm-filter.c @@ -154,7 +154,7 @@ set_filter (const char *filter) return -1; } - char *line = NULL; + CLEANUP_FREE char *line = NULL; size_t len = 0; while (getline (&line, &len, ifp) != -1) { int r; @@ -168,14 +168,11 @@ set_filter (const char *filter) reply_with_error ("%s: write failed", lvm_conf_new); fclose (ifp); fclose (ofp); - free (line); unlink (lvm_conf_new); return -1; } } - free (line); - if (fclose (ifp) == EOF) { reply_with_perror ("close: %s", lvm_conf); unlink (lvm_conf_new); @@ -200,15 +197,13 @@ set_filter (const char *filter) static int vgchange (const char *vgchange_flag) { - char *err; + CLEANUP_FREE char *err = NULL; int r = command (NULL, &err, str_lvm, "vgchange", vgchange_flag, NULL); if (r == -1) { reply_with_error ("vgchange: %s", err); - free (err); return -1; } - free (err); return 0; } @@ -235,15 +230,13 @@ rescan (void) unlink (lvm_cache); - char *err; + CLEANUP_FREE char *err = NULL; int r = command (NULL, &err, str_lvm, "vgscan", NULL); if (r == -1) { reply_with_error ("vgscan: %s", err); - free (err); return -1; } - free (err); return 0; } @@ -295,17 +288,14 @@ make_filter_string (char *const *devices) int do_lvm_set_filter (char *const *devices) { - char *filter = make_filter_string (devices); + CLEANUP_FREE char *filter = make_filter_string (devices); if (filter == NULL) return -1; - if (deactivate () == -1) { - free (filter); + if (deactivate () == -1) return -1; - } int r = set_filter (filter); - free (filter); if (r == -1) return -1; diff --git a/daemon/lvm.c b/daemon/lvm.c index 5df2b0f44..31d6c59fb 100644 --- a/daemon/lvm.c +++ b/daemon/lvm.c @@ -103,7 +103,8 @@ convert_lvm_output (char *out, const char *prefix) char ** do_pvs (void) { - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; int r; r = command (&out, &err, @@ -111,19 +112,17 @@ do_pvs (void) if (r == -1) { reply_with_error ("%s", err); free (out); - free (err); return NULL; } - free (err); - return convert_lvm_output (out, NULL); } char ** do_vgs (void) { - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; int r; r = command (&out, &err, @@ -131,19 +130,17 @@ do_vgs (void) if (r == -1) { reply_with_error ("%s", err); free (out); - free (err); return NULL; } - free (err); - return convert_lvm_output (out, NULL); } char ** do_lvs (void) { - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; int r; r = command (&out, &err, @@ -153,12 +150,9 @@ do_lvs (void) if (r == -1) { reply_with_error ("%s", err); free (out); - free (err); return NULL; } - free (err); - return convert_lvm_output (out, "/dev/"); } @@ -187,19 +181,16 @@ do_lvs_full (void) int do_pvcreate (const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_lvm, "pvcreate", "--force", device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -208,9 +199,9 @@ do_pvcreate (const char *device) int do_vgcreate (const char *volgroup, char *const *physvols) { - char *err; int r, argc, i; - const char **argv; + CLEANUP_FREE char *err = NULL; + CLEANUP_FREE const char **argv = NULL; argc = count_strings (physvols) + 3; argv = malloc (sizeof (char *) * (argc + 1)); @@ -227,14 +218,9 @@ do_vgcreate (const char *volgroup, char *const *physvols) r = commandv (NULL, &err, (const char * const*) argv); if (r == -1) { reply_with_error ("%s", err); - free (err); - free (argv); return -1; } - free (err); - free (argv); - udev_settle (); return 0; @@ -243,7 +229,7 @@ do_vgcreate (const char *volgroup, char *const *physvols) int do_lvcreate (const char *logvol, const char *volgroup, int mbytes) { - char *err; + CLEANUP_FREE char *err = NULL; int r; char size[64]; @@ -254,12 +240,9 @@ do_lvcreate (const char *logvol, const char *volgroup, int mbytes) "-L", size, "-n", logvol, volgroup, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -268,7 +251,7 @@ do_lvcreate (const char *logvol, const char *volgroup, int mbytes) int do_lvcreate_free (const char *logvol, const char *volgroup, int percent) { - char *err; + CLEANUP_FREE char *err = NULL; int r; if (percent < 0 || percent > 100) { @@ -284,12 +267,9 @@ do_lvcreate_free (const char *logvol, const char *volgroup, int percent) "-l", size, "-n", logvol, volgroup, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -309,7 +289,7 @@ ignore_same_size_error (const char *err) int do_lvresize (const char *logvol, int mbytes) { - char *err; + CLEANUP_FREE char *err = NULL; int r; char size[64]; @@ -321,19 +301,17 @@ do_lvresize (const char *logvol, int mbytes) if (r == -1) { if (!ignore_same_size_error (err)) { reply_with_error ("%s", err); - free (err); return -1; } } - free (err); return 0; } int do_lvresize_free (const char *logvol, int percent) { - char *err; + CLEANUP_FREE char *err = NULL; int r; if (percent < 0 || percent > 100) { @@ -349,12 +327,10 @@ do_lvresize_free (const char *logvol, int percent) if (r == -1) { if (!ignore_same_size_error (err)) { reply_with_error ("%s", err); - free (err); return -1; } } - free (err); return 0; } @@ -364,71 +340,66 @@ do_lvresize_free (const char *logvol, int percent) int do_lvm_remove_all (void) { - char **xs; size_t i; int r; - char *err; - /* Remove LVs. */ - xs = do_lvs (); - if (xs == NULL) - return -1; - - for (i = 0; xs[i] != NULL; ++i) { - /* Deactivate the LV first. On Ubuntu, lvremove '-f' option - * does not remove active LVs reliably. - */ - (void) command (NULL, NULL, str_lvm, "lvchange", "-an", xs[i], NULL); - udev_settle (); - - r = command (NULL, &err, str_lvm, "lvremove", "-f", xs[i], NULL); - if (r == -1) { - reply_with_error ("lvremove: %s: %s", xs[i], err); - free (err); - free_strings (xs); + { + /* Remove LVs. */ + CLEANUP_FREE char *err = NULL; + CLEANUP_FREE_STRING_LIST char **xs = do_lvs (); + if (xs == NULL) return -1; + + for (i = 0; xs[i] != NULL; ++i) { + /* Deactivate the LV first. On Ubuntu, lvremove '-f' option + * does not remove active LVs reliably. + */ + (void) command (NULL, NULL, str_lvm, "lvchange", "-an", xs[i], NULL); + udev_settle (); + + r = command (NULL, &err, str_lvm, "lvremove", "-f", xs[i], NULL); + if (r == -1) { + reply_with_error ("lvremove: %s: %s", xs[i], err); + return -1; + } } - free (err); } - free_strings (xs); - /* Remove VGs. */ - xs = do_vgs (); - if (xs == NULL) - return -1; - - for (i = 0; xs[i] != NULL; ++i) { - /* Deactivate the VG first, see note above. */ - (void) command (NULL, NULL, str_lvm, "vgchange", "-an", xs[i], NULL); - udev_settle (); - - r = command (NULL, &err, str_lvm, "vgremove", "-f", xs[i], NULL); - if (r == -1) { - reply_with_error ("vgremove: %s: %s", xs[i], err); - free (err); - free_strings (xs); + { + /* Remove VGs. */ + CLEANUP_FREE char *err = NULL; + CLEANUP_FREE_STRING_LIST char **xs = do_vgs (); + if (xs == NULL) return -1; - } - free (err); - } - free_strings (xs); + for (i = 0; xs[i] != NULL; ++i) { + /* Deactivate the VG first, see note above. */ + (void) command (NULL, NULL, str_lvm, "vgchange", "-an", xs[i], NULL); + udev_settle (); + + r = command (NULL, &err, str_lvm, "vgremove", "-f", xs[i], NULL); + if (r == -1) { + reply_with_error ("vgremove: %s: %s", xs[i], err); + return -1; + } + } + } + + { /* Remove PVs. */ - xs = do_pvs (); - if (xs == NULL) - return -1; - - for (i = 0; xs[i] != NULL; ++i) { - r = command (NULL, &err, str_lvm, "pvremove", "-f", xs[i], NULL); - if (r == -1) { - reply_with_error ("pvremove: %s: %s", xs[i], err); - free (err); - free_strings (xs); + CLEANUP_FREE char *err = NULL; + CLEANUP_FREE_STRING_LIST char **xs = do_pvs (); + if (xs == NULL) return -1; + + for (i = 0; xs[i] != NULL; ++i) { + r = command (NULL, &err, str_lvm, "pvremove", "-f", xs[i], NULL); + if (r == -1) { + reply_with_error ("pvremove: %s: %s", xs[i], err); + return -1; + } } - free (err); } - free_strings (xs); udev_settle (); @@ -439,19 +410,16 @@ do_lvm_remove_all (void) int do_lvremove (const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_lvm, "lvremove", "-f", device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -460,19 +428,16 @@ do_lvremove (const char *device) int do_vgremove (const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_lvm, "vgremove", "-f", device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -481,19 +446,16 @@ do_vgremove (const char *device) int do_pvremove (const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_lvm, "pvremove", "-ff", device, NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -502,25 +464,23 @@ do_pvremove (const char *device) int do_pvresize (const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_lvm, "pvresize", device, NULL); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); return 0; } int do_pvresize_size (const char *device, int64_t size) { - char *err; + CLEANUP_FREE char *err = NULL; int r; char buf[32]; @@ -532,20 +492,18 @@ do_pvresize_size (const char *device, int64_t size) device, NULL); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); return 0; } int do_vg_activate (int activate, char *const *volgroups) { - char *err; int r, i, argc; - const char **argv; + CLEANUP_FREE char *err = NULL; + CLEANUP_FREE const char **argv = NULL; argc = count_strings (volgroups) + 4; argv = malloc (sizeof (char *) * (argc+1)); @@ -564,14 +522,9 @@ do_vg_activate (int activate, char *const *volgroups) r = commandv (NULL, &err, (const char * const*) argv); if (r == -1) { reply_with_error ("vgchange: %s", err); - free (err); - free (argv); return -1; } - free (err); - free (argv); - udev_settle (); return 0; @@ -587,7 +540,7 @@ do_vg_activate_all (int activate) int do_lvrename (const char *logvol, const char *newlogvol) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, @@ -595,12 +548,9 @@ do_lvrename (const char *logvol, const char *newlogvol) logvol, newlogvol, NULL); if (r == -1) { reply_with_error ("%s -> %s: %s", logvol, newlogvol, err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -609,7 +559,7 @@ do_lvrename (const char *logvol, const char *newlogvol) int do_vgrename (const char *volgroup, const char *newvolgroup) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, @@ -617,12 +567,9 @@ do_vgrename (const char *volgroup, const char *newvolgroup) volgroup, newvolgroup, NULL); if (r == -1) { reply_with_error ("%s -> %s: %s", volgroup, newvolgroup, err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -632,7 +579,7 @@ static char * get_lvm_field (const char *cmd, const char *field, const char *device) { char *out; - char *err; + CLEANUP_FREE char *err = NULL; int r = command (&out, &err, str_lvm, cmd, "--unbuffered", "--noheadings", "-o", field, @@ -640,12 +587,9 @@ get_lvm_field (const char *cmd, const char *field, const char *device) if (r == -1) { reply_with_error ("%s: %s", device, err); free (out); - free (err); return NULL; } - free (err); - trim (out); return out; /* Caller frees. */ } @@ -671,23 +615,18 @@ do_lvuuid (const char *device) static char ** get_lvm_fields (const char *cmd, const char *field, const char *device) { - char *out; - char *err; + CLEANUP_FREE char *out = NULL, *err = NULL; + int r = command (&out, &err, str_lvm, cmd, "--unbuffered", "--noheadings", "-o", field, device, NULL); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (out); - free (err); return NULL; } - free (err); - char **ret = split_lines (out); - free (out); if (ret == NULL) return NULL; @@ -714,18 +653,16 @@ do_vglvuuids (const char *vgname) int do_vgscan (void) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_lvm, "vgscan", NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } @@ -760,7 +697,7 @@ lv_canonical (const char *device, char **ret) return -1; } - char **lvs = do_lvs (); + CLEANUP_FREE_STRING_LIST char **lvs = do_lvs (); if (lvs == NULL) return -1; @@ -769,7 +706,6 @@ lv_canonical (const char *device, char **ret) r = stat (lvs[i], &stat2); if (r == -1) { reply_with_perror ("stat: %s", lvs[i]); - free_strings (lvs); return -1; } if (stat1.st_rdev == stat2.st_rdev) { /* found it */ @@ -777,17 +713,14 @@ lv_canonical (const char *device, char **ret) *ret = strdup (lvs[i]); if (*ret == NULL) { reply_with_perror ("strdup"); - free_strings (lvs); return -1; } } - free_strings (lvs); return 1; } } /* not found */ - free_strings (lvs); return 0; } @@ -894,7 +827,7 @@ do_list_dm_devices (void) char * do_vgmeta (const char *vg, size_t *size_r) { - char *err; + CLEANUP_FREE char *err = NULL; int fd, r; char tmp[] = "/tmp/vgmetaXXXXXX"; size_t alloc, size, max; @@ -913,10 +846,8 @@ do_vgmeta (const char *vg, size_t *size_r) r = command (NULL, &err, str_lvm, "vgcfgbackup", "-f", tmp, vg, NULL); if (r == -1) { reply_with_error ("vgcfgbackup: %s", err); - free (err); return NULL; } - free (err); /* Now read back the temporary file. */ fd = open (tmp, O_RDONLY|O_CLOEXEC); @@ -981,19 +912,16 @@ do_vgmeta (const char *vg, size_t *size_r) int do_pvchange_uuid (const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_lvm, "pvchange", "-u", device, NULL); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -1002,19 +930,16 @@ do_pvchange_uuid (const char *device) int do_pvchange_uuid_all (void) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_lvm, "pvchange", "-u", "-a", NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -1023,19 +948,16 @@ do_pvchange_uuid_all (void) int do_vgchange_uuid (const char *vg) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_lvm, "vgchange", "-u", vg, NULL); if (r == -1) { reply_with_error ("%s: %s", vg, err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -1044,19 +966,16 @@ do_vgchange_uuid (const char *vg) int do_vgchange_uuid_all (void) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_lvm, "vgchange", "-u", NULL); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); - udev_settle (); return 0; diff --git a/daemon/md.c b/daemon/md.c index 38f086b04..cda18874d 100644 --- a/daemon/md.c +++ b/daemon/md.c @@ -61,7 +61,7 @@ do_md_create (const char *name, char *const *devices, char chunk_s[32]; size_t j; int r; - char *err; + CLEANUP_FREE char *err = NULL; uint64_t umissingbitmap = (uint64_t) missingbitmap; /* Check the optional parameters and set defaults where appropriate. */ @@ -161,12 +161,9 @@ do_md_create (const char *name, char *const *devices, r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("mdadm: %s: %s", name, err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -241,8 +238,8 @@ do_md_detail(const char *md) size_t i; int r; - char *out = NULL, *err = NULL; - char **lines = NULL; + CLEANUP_FREE char *out = NULL, *err = NULL; + CLEANUP_FREE_STRING_LIST char **lines = NULL; DECLARE_STRINGSBUF (ret); @@ -295,20 +292,12 @@ do_md_detail(const char *md) } } - free (out); - free (err); - free_strings (lines); - if (end_stringsbuf (&ret) == -1) return NULL; return ret.argv; error: - free (out); - free (err); - if (lines) - free_strings (lines); if (ret.argv != NULL) free_stringslen (ret.argv, ret.size); @@ -319,16 +308,14 @@ int do_md_stop(const char *md) { int r; - char *err = NULL; + CLEANUP_FREE char *err = NULL; const char *mdadm[] = { str_mdadm, "--stop", md, NULL}; r = commandv(NULL, &err, mdadm); if (r == -1) { reply_with_error("%s", err); - free(err); return -1; } - free (err); return 0; } @@ -454,7 +441,7 @@ do_md_stat (const char *md) { size_t mdlen; FILE *fp; - char *line = NULL; + CLEANUP_FREE char *line = NULL; size_t len = 0; ssize_t n; guestfs_int_mdstat_list *ret = NULL; @@ -476,7 +463,6 @@ do_md_stat (const char *md) /* Found it. */ ret = parse_md_stat_line (&line[mdlen+3]); if (!ret) { - free (line); fclose (fp); return NULL; } @@ -488,8 +474,6 @@ do_md_stat (const char *md) } } - free (line); - if (fclose (fp) == EOF) { reply_with_perror ("fclose: %s", "/proc/mdstat"); xdr_free ((xdrproc_t) xdr_guestfs_int_mdstat_list, (char *) ret); diff --git a/daemon/mkfs.c b/daemon/mkfs.c index 4b2ea10be..64508ac11 100644 --- a/daemon/mkfs.c +++ b/daemon/mkfs.c @@ -44,7 +44,7 @@ do_mkfs (const char *fstype, const char *device, int blocksize, char inode_str[32]; char sectorsize_str[32]; int r; - char *err; + CLEANUP_FREE char *err = NULL; int extfs = 0; if (STREQ (fstype, "ext2") || STREQ (fstype, "ext3") || @@ -187,11 +187,9 @@ do_mkfs (const char *fstype, const char *device, int blocksize, r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s: %s: %s", fstype, device, err); - free (err); return -1; } - free (err); return 0; } diff --git a/daemon/modprobe.c b/daemon/modprobe.c index 3f45270c2..24d2a5b71 100644 --- a/daemon/modprobe.c +++ b/daemon/modprobe.c @@ -36,14 +36,13 @@ optgroup_linuxmodules_available (void) int do_modprobe (const char *module) { - char *err; + CLEANUP_FREE char *err = NULL; int r = command (NULL, &err, str_modprobe, module, NULL); if (r == -1) { reply_with_error ("%s", err); + return -1; } - free (err); - return r; } diff --git a/daemon/mount.c b/daemon/mount.c index c84faaf1a..5cee5d3cb 100644 --- a/daemon/mount.c +++ b/daemon/mount.c @@ -127,8 +127,8 @@ do_mount_vfs (const char *options, const char *vfstype, const char *device, const char *mountpoint) { int r; - char *mp; - char *error; + CLEANUP_FREE char *mp = NULL; + CLEANUP_FREE char *error = NULL; struct stat statbuf; ABS_PATH (mountpoint, , return -1); @@ -142,12 +142,10 @@ do_mount_vfs (const char *options, const char *vfstype, /* Check the mountpoint exists and is a directory. */ if (stat (mp, &statbuf) == -1) { reply_with_perror ("mount: %s", mountpoint); - free (mp); return -1; } if (!S_ISDIR (statbuf.st_mode)) { reply_with_perror ("mount: %s: mount point is not a directory", mountpoint); - free (mp); return -1; } @@ -157,15 +155,12 @@ do_mount_vfs (const char *options, const char *vfstype, else r = command (NULL, &error, str_mount, "-o", options, device, mp, NULL); - free (mp); if (r == -1) { reply_with_error ("%s on %s (options: '%s'): %s", device, mountpoint, options, error); - free (error); return -1; } - free (error); return 0; } @@ -194,8 +189,8 @@ do_umount (const char *pathordevice, int force, int lazyunmount) { int r; - char *err; - char *buf; + CLEANUP_FREE char *err = NULL; + CLEANUP_FREE char *buf = NULL; int is_dev; const char *argv[MAX_ARGS]; size_t i = 0; @@ -227,16 +222,12 @@ do_umount (const char *pathordevice, ADD_ARG (argv, i, NULL); r = commandv (NULL, &err, argv); - free (buf); if (r == -1) { reply_with_error ("%s: %s", pathordevice, err); - free (err); return -1; } - free (err); - return 0; } @@ -348,7 +339,7 @@ do_umount_all (void) FILE *fp; struct mntent *m; DECLARE_STRINGSBUF (mounts); - char *err; + CLEANUP_FREE char *err = NULL; size_t i; int r; @@ -388,11 +379,9 @@ do_umount_all (void) r = command (NULL, &err, str_umount, mounts.argv[i], NULL); if (r == -1) { reply_with_error ("umount: %s: %s", mounts.argv[i], err); - free (err); free_stringslen (mounts.argv, mounts.size); return -1; } - free (err); } free_stringslen (mounts.argv, mounts.size); @@ -408,8 +397,7 @@ int do_mount_loop (const char *file, const char *mountpoint) { int r; - char *buf, *mp; - char *error; + CLEANUP_FREE char *buf = NULL, *mp = NULL, *error = NULL; /* We have to prefix /sysroot on both the filename and the mountpoint. */ mp = sysroot_path (mountpoint); @@ -421,20 +409,15 @@ do_mount_loop (const char *file, const char *mountpoint) buf = sysroot_path (file); if (!buf) { reply_with_perror ("malloc"); - free (mp); return -1; } r = command (NULL, &error, str_mount, "-o", "loop", buf, mp, NULL); - free (mp); - free (buf); if (r == -1) { reply_with_error ("%s on %s: %s", file, mountpoint, error); - free (error); return -1; } - free (error); return 0; } diff --git a/daemon/ntfs.c b/daemon/ntfs.c index 613b9c3a6..fc466ea29 100644 --- a/daemon/ntfs.c +++ b/daemon/ntfs.c @@ -49,7 +49,7 @@ optgroup_ntfsprogs_available (void) int do_ntfs_3g_probe (int rw, const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; const char *rw_flag; @@ -58,11 +58,9 @@ do_ntfs_3g_probe (int rw, const char *device) r = commandr (NULL, &err, str_ntfs3g_probe, rw_flag, device, NULL); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); return r; } @@ -70,7 +68,7 @@ do_ntfs_3g_probe (int rw, const char *device) int do_ntfsresize (const char *device, int64_t size, int force) { - char *err; + CLEANUP_FREE char *err = NULL; int r; const char *argv[MAX_ARGS]; size_t i = 0; @@ -99,11 +97,9 @@ do_ntfsresize (const char *device, int64_t size, int force) r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); return 0; } @@ -121,7 +117,7 @@ do_ntfsfix (const char *device, int clearbadsectors) const char *argv[MAX_ARGS]; size_t i = 0; int r; - char *err; + CLEANUP_FREE char *err = NULL; ADD_ARG (argv, i, str_ntfsfix); @@ -135,10 +131,8 @@ do_ntfsfix (const char *device, int clearbadsectors) r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); return 0; } diff --git a/daemon/ntfsclone.c b/daemon/ntfsclone.c index bf97eaf96..7094f1039 100644 --- a/daemon/ntfsclone.c +++ b/daemon/ntfsclone.c @@ -69,7 +69,7 @@ do_ntfsclone_in (const char *device) { int err, r; FILE *fp; - char *cmd; + CLEANUP_FREE char *cmd = NULL; char error_file[] = "/tmp/ntfscloneXXXXXX"; int fd; @@ -102,10 +102,8 @@ do_ntfsclone_in (const char *device) errno = err; reply_with_perror ("%s", cmd); unlink (error_file); - free (cmd); return -1; } - free (cmd); /* The semantics of fwrite are too undefined, so write to the * file descriptor directly instead. @@ -115,9 +113,8 @@ do_ntfsclone_in (const char *device) r = receive_file (write_cb, &fd); if (r == -1) { /* write error */ cancel_receive (); - char *errstr = read_error_file (error_file); + CLEANUP_FREE char *errstr = read_error_file (error_file); reply_with_error ("write error on device: %s: %s", device, errstr); - free (errstr); unlink (error_file); pclose (fp); return -1; @@ -133,10 +130,9 @@ do_ntfsclone_in (const char *device) } if (pclose (fp) != 0) { - char *errstr = read_error_file (error_file); + CLEANUP_FREE char *errstr = read_error_file (error_file); reply_with_error ("ntfsclone subcommand failed on device: %s: %s", device, errstr); - free (errstr); unlink (error_file); return -1; } @@ -155,7 +151,7 @@ do_ntfsclone_out (const char *device, { int r; FILE *fp; - char *cmd; + CLEANUP_FREE char *cmd = NULL; char buf[GUESTFS_MAX_CHUNK_SIZE]; /* Construct the ntfsclone command. */ @@ -177,10 +173,8 @@ do_ntfsclone_out (const char *device, fp = popen (cmd, "r"); if (fp == NULL) { reply_with_perror ("%s", cmd); - free (cmd); return -1; } - free (cmd); /* Now we must send the reply message, before the file contents. After * this there is no opportunity in the protocol to send any error diff --git a/daemon/parted.c b/daemon/parted.c index dd4271c38..4fdcdc0ad 100644 --- a/daemon/parted.c +++ b/daemon/parted.c @@ -76,7 +76,7 @@ int do_part_init (const char *device, const char *parttype) { int r; - char *err; + CLEANUP_FREE char *err = NULL; parttype = check_parttype (parttype); if (!parttype) { @@ -90,10 +90,8 @@ do_part_init (const char *device, const char *parttype) str_parted, "-s", "--", device, "mklabel", parttype, NULL); if (r == -1) { reply_with_error ("parted: %s: %s", device, err); - free (err); return -1; } - free (err); udev_settle (); @@ -105,7 +103,7 @@ do_part_add (const char *device, const char *prlogex, int64_t startsect, int64_t endsect) { int r; - char *err; + CLEANUP_FREE char *err = NULL; char startstr[32]; char endstr[32]; @@ -146,10 +144,8 @@ do_part_add (const char *device, const char *prlogex, device, "mkpart", prlogex, startstr, endstr, NULL); if (r == -1) { reply_with_error ("parted: %s: %s", device, err); - free (err); return -1; } - free (err); udev_settle (); @@ -160,7 +156,7 @@ int do_part_del (const char *device, int partnum) { int r; - char *err; + CLEANUP_FREE char *err = NULL; if (partnum <= 0) { reply_with_error ("partition number must be >= 1"); @@ -176,10 +172,8 @@ do_part_del (const char *device, int partnum) str_parted, "-s", "--", device, "rm", partnum_str, NULL); if (r == -1) { reply_with_error ("parted: %s: %s", device, err); - free (err); return -1; } - free (err); udev_settle (); @@ -190,7 +184,7 @@ int do_part_disk (const char *device, const char *parttype) { int r; - char *err; + CLEANUP_FREE char *err = NULL; parttype = check_parttype (parttype); if (!parttype) { @@ -222,10 +216,8 @@ do_part_disk (const char *device, const char *parttype) startstr, endstr, NULL); if (r == -1) { reply_with_error ("parted: %s: %s", device, err); - free (err); return -1; } - free (err); udev_settle (); @@ -236,7 +228,7 @@ int do_part_set_bootable (const char *device, int partnum, int bootable) { int r; - char *err; + CLEANUP_FREE char *err = NULL; if (partnum <= 0) { reply_with_error ("partition number must be >= 1"); @@ -254,10 +246,8 @@ do_part_set_bootable (const char *device, int partnum, int bootable) device, "set", partstr, "boot", bootable ? "on" : "off", NULL); if (r == -1) { reply_with_error ("parted: %s: %s", device, err); - free (err); return -1; } - free (err); udev_settle (); @@ -268,7 +258,7 @@ int do_part_set_name (const char *device, int partnum, const char *name) { int r; - char *err; + CLEANUP_FREE char *err = NULL; if (partnum <= 0) { reply_with_error ("partition number must be >= 1"); @@ -285,10 +275,8 @@ do_part_set_name (const char *device, int partnum, const char *name) str_parted, "-s", "--", device, "name", partstr, name, NULL); if (r == -1) { reply_with_error ("parted: %s: %s", device, err); - free (err); return -1; } - free (err); udev_settle (); @@ -337,12 +325,11 @@ test_parted_m_opt (void) if (result >= 0) return result; - char *err = NULL; + CLEANUP_FREE char *err = NULL; int r = commandr (NULL, &err, str_parted, "-s", "-m", "/dev/null", NULL); if (r == -1) { /* Test failed, eg. missing or completely unusable parted binary. */ reply_with_error ("could not run 'parted' command"); - free (err); return -1; } @@ -350,14 +337,14 @@ test_parted_m_opt (void) result = 0; else result = 1; - free (err); return result; } static char * print_partition_table (const char *device, int parted_has_m_opt) { - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; int r; if (parted_has_m_opt) @@ -373,10 +360,8 @@ print_partition_table (const char *device, int parted_has_m_opt) /* Hack for parted 1.x which sends errors to stdout. */ *err ? err : out); free (out); - free (err); return NULL; } - free (err); return out; } @@ -388,7 +373,7 @@ do_part_get_parttype (const char *device) if (parted_has_m_opt == -1) return NULL; - char *out = print_partition_table (device, parted_has_m_opt); + CLEANUP_FREE char *out = print_partition_table (device, parted_has_m_opt); if (!out) return NULL; @@ -396,8 +381,7 @@ do_part_get_parttype (const char *device) /* New-style parsing using the "machine-readable" format from * 'parted -m'. */ - char **lines = split_lines (out); - free (out); + CLEANUP_FREE_STRING_LIST char **lines = split_lines (out); if (!lines) return NULL; @@ -405,13 +389,11 @@ do_part_get_parttype (const char *device) if (lines[0] == NULL || STRNEQ (lines[0], "BYT;")) { reply_with_error ("unknown signature, expected \"BYT;\" as first line of the output: %s", lines[0] ? lines[0] : "(signature was null)"); - free_strings (lines); return NULL; } if (lines[1] == NULL) { reply_with_error ("parted didn't return a line describing the device"); - free_strings (lines); return NULL; } @@ -420,12 +402,9 @@ do_part_get_parttype (const char *device) */ char *r = get_table_field (lines[1], 5); if (r == NULL) { - free_strings (lines); return NULL; } - free_strings (lines); - /* If "loop" return an error (RHBZ#634246). */ if (STREQ (r, "loop")) { free (r); @@ -440,7 +419,6 @@ do_part_get_parttype (const char *device) char *p = strstr (out, "\nPartition Table: "); if (!p) { reply_with_error ("parted didn't return Partition Table line"); - free (out); return NULL; } @@ -448,14 +426,12 @@ do_part_get_parttype (const char *device) char *q = strchr (p, '\n'); if (!q) { reply_with_error ("parted Partition Table has no end of line char"); - free (out); return NULL; } *q = '\0'; p = strdup (p); - free (out); if (!p) { reply_with_perror ("strdup"); return NULL; @@ -479,12 +455,11 @@ do_part_list (const char *device) if (parted_has_m_opt == -1) return NULL; - char *out = print_partition_table (device, parted_has_m_opt); + CLEANUP_FREE char *out = print_partition_table (device, parted_has_m_opt); if (!out) return NULL; - char **lines = split_lines (out); - free (out); + CLEANUP_FREE_STRING_LIST char **lines = split_lines (out); if (!lines) return NULL; @@ -505,7 +480,7 @@ do_part_list (const char *device) r = malloc (sizeof *r); if (r == NULL) { reply_with_perror ("malloc"); - goto error1; + return NULL; } r->guestfs_int_partition_list_len = nr_rows; r->guestfs_int_partition_list_val = @@ -542,7 +517,7 @@ do_part_list (const char *device) if (start == 0) { reply_with_error ("parted output has no \"Number\" line"); - goto error1; + return NULL; } for (row = start; lines[row] != NULL; ++row) @@ -553,7 +528,7 @@ do_part_list (const char *device) if (end == 0) { reply_with_error ("parted output has no blank after end of table"); - goto error1; + return NULL; } size_t nr_rows = end - start; @@ -561,7 +536,7 @@ do_part_list (const char *device) r = malloc (sizeof *r); if (r == NULL) { reply_with_perror ("malloc"); - goto error1; + return NULL; } r->guestfs_int_partition_list_len = nr_rows; r->guestfs_int_partition_list_val = @@ -585,15 +560,12 @@ do_part_list (const char *device) } } - free_strings (lines); return r; error3: free (r->guestfs_int_partition_list_val); error2: free (r); - error1: - free_strings (lines); return NULL; } @@ -609,12 +581,11 @@ do_part_get_bootable (const char *device, int partnum) if (parted_has_m_opt == -1) return -1; - char *out = print_partition_table (device, parted_has_m_opt); + CLEANUP_FREE char *out = print_partition_table (device, parted_has_m_opt); if (!out) return -1; - char **lines = split_lines (out); - free (out); + CLEANUP_FREE_STRING_LIST char **lines = split_lines (out); if (!lines) return -1; @@ -629,13 +600,11 @@ do_part_get_bootable (const char *device, int partnum) if (lines[0] == NULL || STRNEQ (lines[0], "BYT;")) { reply_with_error ("unknown signature, expected \"BYT;\" as first line of the output: %s", lines[0] ? lines[0] : "(signature was null)"); - free_strings (lines); return -1; } if (lines[1] == NULL) { reply_with_error ("parted didn't return a line describing the device"); - free_strings (lines); return -1; } @@ -644,7 +613,6 @@ do_part_get_bootable (const char *device, int partnum) for (row = 2; lines[row] != NULL; ++row) { if (sscanf (lines[row], "%d:", &pnum) != 1) { reply_with_error ("could not parse row from output of parted print command: %s", lines[row]); - free_strings (lines); return -1; } if (pnum == partnum) @@ -653,22 +621,14 @@ do_part_get_bootable (const char *device, int partnum) if (lines[row] == NULL) { reply_with_error ("partition number %d not found", partnum); - free_strings (lines); return -1; } - char *boot = get_table_field (lines[row], 6); - if (boot == NULL) { - free_strings (lines); + CLEANUP_FREE char *boot = get_table_field (lines[row], 6); + if (boot == NULL) return -1; - } - int r = STREQ (boot, "boot"); - - free (boot); - free_strings (lines); - - return r; + return STREQ (boot, "boot"); } else { /* Old-style: First look for the line matching "^Number". */ @@ -683,7 +643,6 @@ do_part_get_bootable (const char *device, int partnum) if (start == 0) { reply_with_error ("parted output has no \"Number\" line"); - free_strings (lines); return -1; } @@ -696,7 +655,6 @@ do_part_get_bootable (const char *device, int partnum) char *p = strstr (lines[header], "Flags"); if (!p) { reply_with_error ("parted output has no \"Flags\" field"); - free_strings (lines); return -1; } size_t col = p - lines[header]; @@ -708,7 +666,6 @@ do_part_get_bootable (const char *device, int partnum) for (row = start; lines[row] != NULL; ++row) { if (sscanf (lines[row], " %d", &pnum) != 1) { reply_with_error ("could not parse row from output of parted print command: %s", lines[row]); - free_strings (lines); return -1; } if (pnum == partnum) @@ -717,13 +674,10 @@ do_part_get_bootable (const char *device, int partnum) if (lines[row] == NULL) { reply_with_error ("partition number %d not found", partnum); - free_strings (lines); return -1; } - int r = STRPREFIX (&lines[row][col], "boot"); - free_strings (lines); - return r; + return STRPREFIX (&lines[row][col], "boot"); } } @@ -744,7 +698,7 @@ do_part_get_mbr_id (const char *device, int partnum) char partnum_str[16]; snprintf (partnum_str, sizeof partnum_str, "%d", partnum); - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; int r; udev_settle (); @@ -752,11 +706,8 @@ do_part_get_mbr_id (const char *device, int partnum) r = command (&out, &err, str_sfdisk, "--print-id", device, partnum_str, NULL); if (r == -1) { reply_with_error ("sfdisk --print-id: %s", err); - free (out); - free (err); return -1; } - free (err); udev_settle (); @@ -764,11 +715,9 @@ do_part_get_mbr_id (const char *device, int partnum) int id; if (sscanf (out, "%x", &id) != 1) { reply_with_error ("sfdisk --print-id: cannot parse output: %s", out); - free (out); return -1; } - free (out); return id; } @@ -786,7 +735,7 @@ do_part_set_mbr_id (const char *device, int partnum, int idbyte) char idbyte_str[16]; snprintf (idbyte_str, sizeof partnum_str, "%x", idbyte); /* NB: hex */ - char *err; + CLEANUP_FREE char *err = NULL; int r; udev_settle (); @@ -795,10 +744,8 @@ do_part_set_mbr_id (const char *device, int partnum, int idbyte) "--change-id", device, partnum_str, idbyte_str, NULL); if (r == -1) { reply_with_error ("sfdisk --change-id: %s", err); - free (err); return -1; } - free (err); udev_settle (); @@ -819,24 +766,20 @@ do_part_set_gpt_type(const char *device, int partnum, const char *guid) return -1; } - char *typecode = NULL; + CLEANUP_FREE char *typecode = NULL; if (asprintf (&typecode, "%i:%s", partnum, guid) == -1) { reply_with_perror ("asprintf"); return -1; } - char *err = NULL; + CLEANUP_FREE char *err = NULL; int r = commandf (NULL, &err, COMMAND_FLAG_FOLD_STDOUT_ON_STDERR, str_sgdisk, device, "-t", typecode, NULL); if (r == -1) { reply_with_error ("%s %s -t %s: %s", str_sgdisk, device, typecode, err); - free (typecode); - free (err); return -1; } - free (typecode); - free (err); return 0; } @@ -849,29 +792,25 @@ do_part_get_gpt_type(const char *device, int partnum) return NULL; } - char *partnum_str = NULL; + CLEANUP_FREE char *partnum_str = NULL; if (asprintf (&partnum_str, "%i", partnum) == -1) { reply_with_perror ("asprintf"); return NULL; } - char *err = NULL; + CLEANUP_FREE char *err = NULL; int r = commandf (NULL, &err, COMMAND_FLAG_FOLD_STDOUT_ON_STDERR, str_sgdisk, device, "-i", partnum_str, NULL); if (r == -1) { reply_with_error ("%s %s -i %s: %s", str_sgdisk, device, partnum_str, err); - free (partnum_str); - free (err); return NULL; } - free (partnum_str); char **lines = split_lines (err); if (lines == NULL) { reply_with_error ("'%s %s -i %i' returned no output", str_sgdisk, device, partnum); - free (err); return NULL; } @@ -915,7 +854,6 @@ do_part_get_gpt_type(const char *device, int partnum) memcpy (ret, value, value_len); ret[value_len] = '\0'; - free (err); return ret; } } else { @@ -927,7 +865,6 @@ do_part_get_gpt_type(const char *device, int partnum) } } } - free (err); /* If we got here it means we didn't find the Partition GUID code */ reply_with_error ("sgdisk output did not contain Partition GUID code. " diff --git a/daemon/proto.c b/daemon/proto.c index 286d5720c..22713cd25 100644 --- a/daemon/proto.c +++ b/daemon/proto.c @@ -363,7 +363,7 @@ receive_file (receive_cb cb, void *opaque) { guestfs_chunk chunk; char lenbuf[4]; - char *buf; + CLEANUP_FREE char *buf = NULL; XDR xdr; int r; uint32_t len; @@ -402,11 +402,9 @@ receive_file (receive_cb cb, void *opaque) memset (&chunk, 0, sizeof chunk); if (!xdr_guestfs_chunk (&xdr, &chunk)) { xdr_destroy (&xdr); - free (buf); return -1; } xdr_destroy (&xdr); - free (buf); if (verbose) fprintf (stderr, diff --git a/daemon/rsync.c b/daemon/rsync.c index e4a723779..d238d6174 100644 --- a/daemon/rsync.c +++ b/daemon/rsync.c @@ -46,7 +46,7 @@ rsync (const char *src, const char *src_orig, const char *argv[MAX_ARGS]; size_t i = 0; int r; - char *err; + CLEANUP_FREE char *err = NULL; ADD_ARG (argv, i, str_rsync); @@ -63,12 +63,9 @@ rsync (const char *src, const char *src_orig, r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("'%s' to '%s': %s", src_orig, dest_orig, err); - free (err); return -1; } - free (err); - return 0; } @@ -77,14 +74,13 @@ int do_rsync (const char *src_orig, const char *dest_orig, int archive, int deletedest) { - char *src = NULL, *dest = NULL; - int r = -1; + CLEANUP_FREE char *src = NULL, *dest = NULL; src = sysroot_path (src_orig); dest = sysroot_path (dest_orig); if (!src || !dest) { reply_with_perror ("malloc"); - goto out; + return -1; } if (!(optargs_bitmask & GUESTFS_RSYNC_ARCHIVE_BITMASK)) @@ -92,12 +88,7 @@ do_rsync (const char *src_orig, const char *dest_orig, if (!(optargs_bitmask & GUESTFS_RSYNC_DELETEDEST_BITMASK)) deletedest = 0; - r = rsync (src, src_orig, dest, dest_orig, archive, deletedest); - - out: - free (src); - free (dest); - return r; + return rsync (src, src_orig, dest, dest_orig, archive, deletedest); } /* Takes optional arguments, consult optargs_bitmask. */ @@ -105,13 +96,12 @@ int do_rsync_in (const char *remote, const char *dest_orig, int archive, int deletedest) { - char *dest = NULL; - int r = -1; + CLEANUP_FREE char *dest = NULL; dest = sysroot_path (dest_orig); if (!dest) { reply_with_perror ("malloc"); - goto out; + return -1; } if (!(optargs_bitmask & GUESTFS_RSYNC_IN_ARCHIVE_BITMASK)) @@ -119,11 +109,7 @@ do_rsync_in (const char *remote, const char *dest_orig, if (!(optargs_bitmask & GUESTFS_RSYNC_IN_DELETEDEST_BITMASK)) deletedest = 0; - r = rsync (remote, remote, dest, dest_orig, archive, deletedest); - - out: - free (dest); - return r; + return rsync (remote, remote, dest, dest_orig, archive, deletedest); } /* Takes optional arguments, consult optargs_bitmask. */ @@ -131,13 +117,12 @@ int do_rsync_out (const char *src_orig, const char *remote, int archive, int deletedest) { - char *src = NULL; - int r = -1; + CLEANUP_FREE char *src = NULL; src = sysroot_path (src_orig); if (!src) { reply_with_perror ("malloc"); - goto out; + return -1; } if (!(optargs_bitmask & GUESTFS_RSYNC_OUT_ARCHIVE_BITMASK)) @@ -145,9 +130,5 @@ do_rsync_out (const char *src_orig, const char *remote, if (!(optargs_bitmask & GUESTFS_RSYNC_OUT_DELETEDEST_BITMASK)) deletedest = 0; - r = rsync (src, src_orig, remote, remote, archive, deletedest); - - out: - free (src); - return r; + return rsync (src, src_orig, remote, remote, archive, deletedest); } diff --git a/daemon/scrub.c b/daemon/scrub.c index cce8da508..cd880b983 100644 --- a/daemon/scrub.c +++ b/daemon/scrub.c @@ -39,26 +39,23 @@ optgroup_scrub_available (void) int do_scrub_device (const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_scrub, device, NULL); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); - return 0; } int do_scrub_file (const char *file) { - char *buf; - char *err; + CLEANUP_FREE char *buf = NULL; + CLEANUP_FREE char *err = NULL; int r; /* Make the path relative to /sysroot. */ @@ -69,23 +66,19 @@ do_scrub_file (const char *file) } r = command (NULL, &err, str_scrub, "-r", buf, NULL); - free (buf); if (r == -1) { reply_with_error ("%s: %s", file, err); - free (err); return -1; } - free (err); - return 0; } int do_scrub_freespace (const char *dir) { - char *buf; - char *err; + CLEANUP_FREE char *buf = NULL; + CLEANUP_FREE char *err = NULL; int r; /* Make the path relative to /sysroot. */ @@ -96,14 +89,10 @@ do_scrub_freespace (const char *dir) } r = command (NULL, &err, str_scrub, "-X", buf, NULL); - free (buf); if (r == -1) { reply_with_error ("%s: %s", dir, err); - free (err); return -1; } - free (err); - return 0; } diff --git a/daemon/sfdisk.c b/daemon/sfdisk.c index 87ce4c311..e32e63707 100644 --- a/daemon/sfdisk.c +++ b/daemon/sfdisk.c @@ -135,19 +135,17 @@ do_sfdiskM (const char *device, char *const *lines) static char * sfdisk_flag (const char *device, const char *flag) { - char *out, *err; + char *out; + CLEANUP_FREE char *err = NULL; int r; r = command (&out, &err, str_sfdisk, flag, device, NULL); if (r == -1) { reply_with_error ("%s: %s", device, err); free (out); - free (err); return NULL; } - free (err); - udev_settle (); return out; /* caller frees */ diff --git a/daemon/statvfs.c b/daemon/statvfs.c index 4eff22d2c..a1f2f0858 100644 --- a/daemon/statvfs.c +++ b/daemon/statvfs.c @@ -80,7 +80,7 @@ do_statvfs (const char *path) #else /* !HAVE_STATVFS */ # if WIN32 - char *disk; + CLEANUP_FREE char *disk = NULL; guestfs_int_statvfs *ret; ULONGLONG free_bytes_available; /* for user - similar to bavail */ ULONGLONG total_number_of_bytes; @@ -97,10 +97,8 @@ do_statvfs (const char *path) (PULARGE_INTEGER) &total_number_of_bytes, (PULARGE_INTEGER) &total_number_of_free_bytes)) { reply_with_perror ("GetDiskFreeSpaceEx"); - free (disk); return NULL; } - free (disk); ret = malloc (sizeof *ret); if (ret == NULL) { @@ -142,7 +140,7 @@ do_statvfs (const char *path) # else /* !WIN32 */ - char *disk; + CLEANUP_FREE char *disk = NULL; int r; guestfs_int_statvfs *ret; struct fs_usage fsu; @@ -154,7 +152,6 @@ do_statvfs (const char *path) } r = get_fs_usage (disk, disk, &fsu); - free (disk); if (r == -1) { reply_with_perror ("get_fs_usage: %s", path); diff --git a/daemon/strings.c b/daemon/strings.c index 847b45c8e..332cba72e 100644 --- a/daemon/strings.c +++ b/daemon/strings.c @@ -31,7 +31,7 @@ char ** do_strings_e (const char *encoding, const char *path) { int fd, flags, r; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; char **lines; if (strlen (encoding) != 1 || @@ -53,17 +53,11 @@ do_strings_e (const char *encoding, const char *path) r = commandf (&out, &err, flags, "strings", "-e", encoding, NULL); if (r == -1) { reply_with_error ("%s: %s", path, err); - free (err); - free (out); return NULL; } - free (err); - /* Now convert the output to a list of lines. */ lines = split_lines (out); - free (out); - if (lines == NULL) return NULL; diff --git a/daemon/swap.c b/daemon/swap.c index cf25e2314..bf57ab31b 100644 --- a/daemon/swap.c +++ b/daemon/swap.c @@ -44,7 +44,7 @@ GUESTFSD_EXT_CMD(str_swapoff, swapoff); int optgroup_linuxfsuuid_available (void) { - char *err; + CLEANUP_FREE char *err = NULL; int av; /* Upstream util-linux have been gradually changing '--help' to go @@ -56,7 +56,6 @@ optgroup_linuxfsuuid_available (void) str_mkswap, "--help", NULL)); av = strstr (err, "-U") != NULL; - free (err); return av; } @@ -68,7 +67,7 @@ do_mkswap (const char *device, const char *label, const char *uuid) const char *argv[MAX_ARGS]; size_t i = 0; int r; - char *err; + CLEANUP_FREE char *err = NULL; ADD_ARG (argv, i, str_mkswap); ADD_ARG (argv, i, "-f"); @@ -95,12 +94,9 @@ do_mkswap (const char *device, const char *label, const char *uuid) r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); - udev_settle (); return 0; @@ -123,8 +119,7 @@ do_mkswap_U (const char *uuid, const char *device) int do_mkswap_file (const char *path) { - char *buf; - char *err; + CLEANUP_FREE char *buf = NULL, *err = NULL; int r; buf = sysroot_path (path); @@ -134,23 +129,19 @@ do_mkswap_file (const char *path) } r = command (NULL, &err, str_mkswap, "-f", buf, NULL); - free (buf); if (r == -1) { reply_with_error ("%s: %s", path, err); - free (err); return -1; } - free (err); - return r; } static int swaponoff (const char *cmd, const char *flag, const char *value) { - char *err; + CLEANUP_FREE char *err = NULL; int r; if (!flag) @@ -160,12 +151,9 @@ swaponoff (const char *cmd, const char *flag, const char *value) if (r == -1) { reply_with_error ("%s: %s", value, err); - free (err); return -1; } - free (err); - /* Possible fix for RHBZ#516096. It probably doesn't hurt to do * this in any case. */ @@ -189,8 +177,7 @@ do_swapoff_device (const char *device) int do_swapon_file (const char *path) { - char *buf; - int r; + CLEANUP_FREE char *buf = NULL; buf = sysroot_path (path); if (!buf) { @@ -198,16 +185,13 @@ do_swapon_file (const char *path) return -1; } - r = swaponoff (str_swapon, NULL, buf); - free (buf); - return r; + return swaponoff (str_swapon, NULL, buf); } int do_swapoff_file (const char *path) { - char *buf; - int r; + CLEANUP_FREE char *buf = NULL; buf = sysroot_path (path); if (!buf) { @@ -215,9 +199,7 @@ do_swapoff_file (const char *path) return -1; } - r = swaponoff (str_swapoff, NULL, buf); - free (buf); - return r; + return swaponoff (str_swapoff, NULL, buf); } int diff --git a/daemon/tar.c b/daemon/tar.c index 996ad4f7a..731dc1fe4 100644 --- a/daemon/tar.c +++ b/daemon/tar.c @@ -122,7 +122,7 @@ do_tar_in (const char *dir, const char *compress) const char *filter; int err, r; FILE *fp; - char *cmd; + CLEANUP_FREE char *cmd = NULL; char error_file[] = "/tmp/tarXXXXXX"; int fd, chown_supported; @@ -180,10 +180,8 @@ do_tar_in (const char *dir, const char *compress) errno = err; reply_with_perror ("%s", cmd); unlink (error_file); - free (cmd); return -1; } - free (cmd); /* The semantics of fwrite are too undefined, so write to the * file descriptor directly instead. @@ -193,9 +191,8 @@ do_tar_in (const char *dir, const char *compress) r = receive_file (write_cb, &fd); if (r == -1) { /* write error */ cancel_receive (); - char *errstr = read_error_file (error_file); + CLEANUP_FREE char *errstr = read_error_file (error_file); reply_with_error ("write error on directory: %s: %s", dir, errstr); - free (errstr); unlink (error_file); pclose (fp); return -1; @@ -211,10 +208,9 @@ do_tar_in (const char *dir, const char *compress) } if (pclose (fp) != 0) { - char *errstr = read_error_file (error_file); + CLEANUP_FREE char *errstr = read_error_file (error_file); reply_with_error ("tar subcommand failed on directory: %s: %s", dir, errstr); - free (errstr); unlink (error_file); return -1; } @@ -286,8 +282,8 @@ do_tar_out (const char *dir, const char *compress, int numericowner, const char *filter; int r; FILE *fp; - char *excludes_args; - char *cmd; + CLEANUP_FREE char *excludes_args = NULL; + CLEANUP_FREE char *cmd = NULL; char buf[GUESTFS_MAX_CHUNK_SIZE]; if ((optargs_bitmask & GUESTFS_TAR_OUT_COMPRESS_BITMASK)) { @@ -330,10 +326,8 @@ do_tar_out (const char *dir, const char *compress, int numericowner, numericowner ? " --numeric-owner" : "", excludes_args) == -1) { reply_with_perror ("asprintf"); - free (excludes_args); return -1; } - free (excludes_args); if (verbose) fprintf (stderr, "%s\n", cmd); @@ -341,10 +335,8 @@ do_tar_out (const char *dir, const char *compress, int numericowner, fp = popen (cmd, "r"); if (fp == NULL) { reply_with_perror ("%s", cmd); - free (cmd); return -1; } - free (cmd); /* Now we must send the reply message, before the file contents. After * this there is no opportunity in the protocol to send any error diff --git a/daemon/wc.c b/daemon/wc.c index f27534699..454cdf35c 100644 --- a/daemon/wc.c +++ b/daemon/wc.c @@ -31,7 +31,7 @@ static int wc (const char *flag, const char *path) { - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; int fd, flags, r; CHROOT_IN; @@ -47,13 +47,9 @@ wc (const char *flag, const char *path) r = commandf (&out, &err, flags, "wc", flag, NULL); if (r == -1) { reply_with_error ("wc %s: %s", flag, err); - free (out); - free (err); return -1; } - free (err); - #if 0 /* Split it at the first whitespace. */ len = strcspn (out, " \t\n"); @@ -63,11 +59,9 @@ wc (const char *flag, const char *path) /* Parse the number. */ if (sscanf (out, "%d", &r) != 1) { reply_with_error ("cannot parse number: %s", out); - free (out); return -1; } - free (out); return r; } diff --git a/daemon/xattr.c b/daemon/xattr.c index 54ebb9ba1..bee5d64b7 100644 --- a/daemon/xattr.c +++ b/daemon/xattr.c @@ -120,7 +120,7 @@ getxattrs (const char *path, void *value, size_t size)) { ssize_t len, vlen; - char *buf = NULL; + CLEANUP_FREE char *buf = NULL; size_t i, j; guestfs_int_xattr_list *r = NULL; @@ -202,12 +202,9 @@ getxattrs (const char *path, } } - free (buf); - return r; error: - free (buf); if (r) { if (r->guestfs_int_xattr_list_val) { size_t k; @@ -275,7 +272,7 @@ do_internal_lxattrlist (const char *path, char *const *names) size_t i, j; size_t k, m, nr_attrs; ssize_t len, vlen; - char *buf = NULL; + CLEANUP_FREE char *buf = NULL; if (path_len >= PATH_MAX) { reply_with_perror ("path longer than PATH_MAX"); @@ -409,8 +406,6 @@ do_internal_lxattrlist (const char *path, char *const *names) } } - free (buf); buf = NULL; - char num[16]; snprintf (num, sizeof num, "%zu", nr_attrs); entry[0].attrval.attrval_len = strlen (num) + 1; @@ -425,7 +420,6 @@ do_internal_lxattrlist (const char *path, char *const *names) return ret; error: - free (buf); if (ret) { if (ret->guestfs_int_xattr_list_val) { for (k = 0; k < ret->guestfs_int_xattr_list_len; ++k) { diff --git a/daemon/xfs.c b/daemon/xfs.c index 86d9b50f1..e31da8fe0 100644 --- a/daemon/xfs.c +++ b/daemon/xfs.c @@ -106,7 +106,7 @@ static guestfs_int_xfsinfo * parse_xfs_info (char **lines) { guestfs_int_xfsinfo *ret; - char *buf = NULL, *p; + char *p; size_t i; ret = malloc (sizeof *ret); @@ -150,149 +150,128 @@ parse_xfs_info (char **lines) if (ret->xfs_mntpoint == NULL) goto error; } if ((p = strstr (lines[i], "isize="))) { - buf = split_strdup (p + 6); + CLEANUP_FREE char *buf = split_strdup (p + 6); if (buf == NULL) goto error; if (parse_uint32 (&ret->xfs_inodesize, buf) == -1) goto error; - free (buf); buf = NULL; } if ((p = strstr (lines[i], "agcount="))) { - buf = split_strdup (p + 8); + CLEANUP_FREE char *buf = split_strdup (p + 8); if (buf == NULL) goto error; if (parse_uint32 (&ret->xfs_agcount, buf) == -1) goto error; - free (buf); buf = NULL; } if ((p = strstr (lines[i], "agsize="))) { - buf = split_strdup (p + 7); + CLEANUP_FREE char *buf = split_strdup (p + 7); if (buf == NULL) goto error; if (parse_uint32 (&ret->xfs_agsize, buf) == -1) goto error; - free (buf); buf = NULL; } if ((p = strstr (lines[i], "sectsz="))) { - buf = split_strdup (p + 7); + CLEANUP_FREE char *buf = split_strdup (p + 7); if (buf == NULL) goto error; if (i == 1) { if (parse_uint32 (&ret->xfs_sectsize, buf) == -1) goto error; - free (buf); buf = NULL; } else if (i == 6) { if (parse_uint32 (&ret->xfs_logsectsize, buf) == -1) goto error; - free (buf); buf = NULL; } else goto error; } if ((p = strstr (lines[i], "attr="))) { - buf = split_strdup (p + 5); + CLEANUP_FREE char *buf = split_strdup (p + 5); if (buf == NULL) goto error; if (parse_uint32 (&ret->xfs_attr, buf) == -1) goto error; - free (buf); buf = NULL; } if ((p = strstr (lines[i], "bsize="))) { - buf = split_strdup (p + 6); + CLEANUP_FREE char *buf = split_strdup (p + 6); if (buf == NULL) goto error; if (i == 2) { if (parse_uint32 (&ret->xfs_blocksize, buf) == -1) goto error; - free (buf); buf = NULL; } else if (i == 4) { if (parse_uint32 (&ret->xfs_dirblocksize, buf) == -1) goto error; - free (buf); buf = NULL; } else if (i == 5) { if (parse_uint32 (&ret->xfs_logblocksize, buf) == -1) goto error; - free (buf); buf = NULL; } else goto error; } if ((p = strstr (lines[i], "blocks="))) { - buf = split_strdup (p + 7); + CLEANUP_FREE char *buf = split_strdup (p + 7); if (buf == NULL) goto error; if (i == 2) { if (parse_uint64 (&ret->xfs_datablocks, buf) == -1) goto error; - free (buf); buf = NULL; } else if (i == 5) { if (parse_uint32 (&ret->xfs_logblocks, buf) == -1) goto error; - free (buf); buf = NULL; } else if (i == 7) { if (parse_uint64 (&ret->xfs_rtblocks, buf) == -1) goto error; - free (buf); buf = NULL; } else goto error; } if ((p = strstr (lines[i], "imaxpct="))) { - buf = split_strdup (p + 8); + CLEANUP_FREE char *buf = split_strdup (p + 8); if (buf == NULL) goto error; if (parse_uint32 (&ret->xfs_imaxpct, buf) == -1) goto error; - free (buf); buf = NULL; } if ((p = strstr (lines[i], "sunit="))) { - buf = split_strdup (p + 6); + CLEANUP_FREE char *buf = split_strdup (p + 6); if (buf == NULL) goto error; if (i == 3) { if (parse_uint32 (&ret->xfs_sunit, buf) == -1) goto error; - free (buf); buf = NULL; } else if (i == 6) { if (parse_uint32 (&ret->xfs_logsunit, buf) == -1) goto error; - free (buf); buf = NULL; } else goto error; } if ((p = strstr (lines[i], "swidth="))) { - buf = split_strdup (p + 7); + CLEANUP_FREE char *buf = split_strdup (p + 7); if (buf == NULL) goto error; if (parse_uint32 (&ret->xfs_swidth, buf) == -1) goto error; - free (buf); buf = NULL; } if ((p = strstr (lines[i], "naming =version "))) { - buf = split_strdup (p + 18); + CLEANUP_FREE char *buf = split_strdup (p + 18); if (buf == NULL) goto error; if (parse_uint32 (&ret->xfs_dirversion, buf) == -1) goto error; - free (buf); buf = NULL; } if ((p = strstr (lines[i], "ascii-ci="))) { - buf = split_strdup (p + 9); + CLEANUP_FREE char *buf = split_strdup (p + 9); if (buf == NULL) goto error; if (parse_uint32 (&ret->xfs_cimode, buf) == -1) goto error; - free (buf); buf = NULL; } if ((p = strstr (lines[i], "log ="))) { ret->xfs_logname = split_strdup (p + 10); if (ret->xfs_logname == NULL) goto error; } if ((p = strstr (lines[i], "version="))) { - buf = split_strdup (p + 8); + CLEANUP_FREE char *buf = split_strdup (p + 8); if (buf == NULL) goto error; if (parse_uint32 (&ret->xfs_logversion, buf) == -1) goto error; - free (buf); buf = NULL; } if ((p = strstr (lines[i], "lazy-count="))) { - buf = split_strdup (p + 11); + CLEANUP_FREE char *buf = split_strdup (p + 11); if (buf == NULL) goto error; if (parse_uint32 (&ret->xfs_lazycount, buf) == -1) goto error; - free (buf); buf = NULL; } if ((p = strstr (lines[i], "realtime ="))) { ret->xfs_rtname = split_strdup (p + 10); if (ret->xfs_rtname == NULL) goto error; } if ((p = strstr (lines[i], "rtextents="))) { - buf = split_strdup (p + 10); + CLEANUP_FREE char *buf = split_strdup (p + 10); if (buf == NULL) goto error; if (parse_uint64 (&ret->xfs_rtextents, buf) == -1) goto error; - free (buf); buf = NULL; } } @@ -312,7 +291,6 @@ parse_xfs_info (char **lines) return ret; error: - free (buf); free (ret->xfs_mntpoint); free (ret->xfs_logname); free (ret->xfs_rtname); @@ -324,10 +302,9 @@ guestfs_int_xfsinfo * do_xfs_info (const char *pathordevice) { int r; - char *buf; - char *out = NULL, *err = NULL; - char **lines = NULL; - guestfs_int_xfsinfo *ret = NULL; + CLEANUP_FREE char *buf = NULL; + CLEANUP_FREE char *out = NULL, *err = NULL; + CLEANUP_FREE_STRING_LIST char **lines = NULL; int is_dev; is_dev = STREQLEN (pathordevice, "/dev/", 5); @@ -339,24 +316,16 @@ do_xfs_info (const char *pathordevice) } r = command (&out, &err, str_xfs_info, buf, NULL); - free (buf); if (r == -1) { reply_with_error ("%s", err); - goto error; + return NULL; } lines = split_lines (out); if (lines == NULL) - goto error; + return NULL; - ret = parse_xfs_info (lines); - -error: - free (err); - free (out); - if (lines) - free_strings (lines); - return ret; + return parse_xfs_info (lines); } int @@ -366,8 +335,7 @@ do_xfs_growfs (const char *path, int64_t rtextsize, int32_t maxpct) { int r; - char *buf; - char *err = NULL; + CLEANUP_FREE char *buf = NULL, *err = NULL; const char *argv[MAX_ARGS]; char datasize_s[64]; char logsize_s[64]; @@ -402,7 +370,7 @@ do_xfs_growfs (const char *path, if (optargs_bitmask & GUESTFS_XFS_GROWFS_DATASIZE_BITMASK) { if (datasize < 0) { reply_with_error ("datasize must be >= 0"); - goto error; + return -1; } snprintf (datasize_s, sizeof datasize_s, "%" PRIi64, datasize); ADD_ARG (argv, i, "-D"); @@ -412,7 +380,7 @@ do_xfs_growfs (const char *path, if (optargs_bitmask & GUESTFS_XFS_GROWFS_LOGSIZE_BITMASK) { if (logsize < 0) { reply_with_error ("logsize must be >= 0"); - goto error; + return -1; } snprintf(logsize_s, sizeof logsize_s, "%" PRIi64, logsize); ADD_ARG (argv, i, "-L"); @@ -422,7 +390,7 @@ do_xfs_growfs (const char *path, if (optargs_bitmask & GUESTFS_XFS_GROWFS_RTSIZE_BITMASK) { if (rtsize < 0) { reply_with_error ("rtsize must be >= 0"); - goto error; + return -1; } snprintf(rtsize_s, sizeof rtsize_s, "%" PRIi64, rtsize); ADD_ARG (argv, i, "-R"); @@ -432,7 +400,7 @@ do_xfs_growfs (const char *path, if (optargs_bitmask & GUESTFS_XFS_GROWFS_RTEXTSIZE_BITMASK) { if (rtextsize < 0) { reply_with_error ("rtextsize must be >= 0"); - goto error; + return -1; } snprintf(rtextsize_s, sizeof rtextsize_s, "%" PRIi64, rtextsize); ADD_ARG (argv, i, "-e"); @@ -442,7 +410,7 @@ do_xfs_growfs (const char *path, if (optargs_bitmask & GUESTFS_XFS_GROWFS_MAXPCT_BITMASK) { if (maxpct < 0) { reply_with_error ("maxpct must be >= 0"); - goto error; + return -1; } snprintf(maxpct_s, sizeof maxpct_s, "%" PRIi32, maxpct); ADD_ARG (argv, i, "-m"); @@ -453,19 +421,12 @@ do_xfs_growfs (const char *path, ADD_ARG (argv, i, NULL); r = commandv (NULL, &err, argv); - free (buf); if (r == -1) { reply_with_error ("%s: %s", path, err); - goto error; + return -1; } - free (err); return 0; - -error: - free (buf); - free (err); - return -1; } int @@ -475,7 +436,7 @@ do_xfs_admin (const char *device, int lazycounter, const char *label, const char *uuid) { int r; - char *err = NULL; + CLEANUP_FREE char *err = NULL; const char *argv[MAX_ARGS]; size_t i = 0; @@ -526,15 +487,10 @@ do_xfs_admin (const char *device, r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s: %s", device, err); - goto error; + return -1; } - free (err); return 0; - -error: - free (err); - return -1; } int @@ -546,9 +502,8 @@ do_xfs_repair (const char *device, const char *logdev, const char *rtdev) { int r; - char *err = NULL; + CLEANUP_FREE char *err = NULL, *buf = NULL; const char *argv[MAX_ARGS]; - char *buf = NULL; char maxmem_s[64]; char ihashsize_s[70]; char bhashsize_s[70]; @@ -581,7 +536,7 @@ do_xfs_repair (const char *device, if (optargs_bitmask & GUESTFS_XFS_REPAIR_MAXMEM_BITMASK) { if (maxmem < 0) { reply_with_error ("maxmem must be >= 0"); - goto error; + return -1; } snprintf(maxmem_s, sizeof maxmem_s, "%" PRIi64, maxmem); ADD_ARG (argv, i, "-m"); @@ -591,7 +546,7 @@ do_xfs_repair (const char *device, if (optargs_bitmask & GUESTFS_XFS_REPAIR_IHASHSIZE_BITMASK) { if (ihashsize < 0) { reply_with_error ("ihashsize must be >= 0"); - goto error; + return -1; } snprintf(ihashsize_s, sizeof ihashsize_s, "ihash=" "%" PRIi64, ihashsize); ADD_ARG (argv, i, "-o"); @@ -601,7 +556,7 @@ do_xfs_repair (const char *device, if (optargs_bitmask & GUESTFS_XFS_REPAIR_BHASHSIZE_BITMASK) { if (bhashsize < 0) { reply_with_error ("bhashsize must be >= 0"); - goto error; + return -1; } snprintf(bhashsize_s, sizeof bhashsize_s, "bhash=" "%" PRIi64, bhashsize); ADD_ARG (argv, i, "-o"); @@ -611,7 +566,7 @@ do_xfs_repair (const char *device, if (optargs_bitmask & GUESTFS_XFS_REPAIR_AGSTRIDE_BITMASK) { if (agstride < 0) { reply_with_error ("agstride must be >= 0"); - goto error; + return -1; } snprintf(agstride_s, sizeof agstride_s, "ag_stride=" "%" PRIi64, agstride); ADD_ARG (argv, i, "-o"); @@ -634,7 +589,7 @@ do_xfs_repair (const char *device, buf = sysroot_path (device); if (buf == NULL) { reply_with_perror ("malloc"); - goto error; + return -1; } ADD_ARG (argv, i, "-f"); ADD_ARG (argv, i, buf); @@ -645,16 +600,10 @@ do_xfs_repair (const char *device, ADD_ARG (argv, i, NULL); r = commandrv (NULL, &err, argv); - free (buf); if (r == -1) { reply_with_error ("%s: %s", device, err); - goto error; + return -1; } - free (err); return r; - -error: - free (err); - return -1; } diff --git a/daemon/zero.c b/daemon/zero.c index 4997583c6..6041b5541 100644 --- a/daemon/zero.c +++ b/daemon/zero.c @@ -88,19 +88,15 @@ wipefs_has_force_option (void) { static int flag = -1; int r; - char *out, *err; + CLEANUP_FREE char *out = NULL, *err = NULL; if (flag == -1) { r = command (&out, &err, "wipefs", "--help", NULL); if (r == -1) { reply_with_error ("%s", err); - free (out); - free (err); return -1; } - free (err); flag = strstr (out, "--force") != NULL; - free (out); } return flag; @@ -111,7 +107,7 @@ do_wipefs (const char *device) { int force; int r; - char *err = NULL; + CLEANUP_FREE char *err = NULL; const size_t MAX_ARGS = 16; const char *argv[MAX_ARGS]; size_t i = 0; @@ -130,11 +126,9 @@ do_wipefs (const char *device) r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s", err); - free (err); return -1; } - free (err); return 0; } diff --git a/daemon/zerofree.c b/daemon/zerofree.c index 17338f48b..4ba17dd81 100644 --- a/daemon/zerofree.c +++ b/daemon/zerofree.c @@ -39,17 +39,14 @@ optgroup_zerofree_available (void) int do_zerofree (const char *device) { - char *err; + CLEANUP_FREE char *err = NULL; int r; r = command (NULL, &err, str_zerofree, device, NULL); if (r == -1) { reply_with_error ("%s: %s", device, err); - free (err); return -1; } - free (err); - return 0; }