On Sat, 20 Jul 2019 at 06:43, Omar Sandoval <osandov@xxxxxxxxxxx> wrote:
>
> From: Omar Sandoval <osandov@xxxxxx>
>
> In process_clone(), we're not checking the return value of strdup().
> But, there's no reason to strdup() in the first place: we just pass the
> path into path_cat_out(). Get rid of the strdup().
>
> Fixes: f1c24cd80dfd ("Btrfs-progs: add btrfs send/receive commands")
> Signed-off-by: Omar Sandoval <osandov@xxxxxxxxxxx>
> ---
> cmds/receive.c | 9 ++++-----
> 1 file changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/cmds/receive.c b/cmds/receive.c
> index b97850a7..a3e62985 100644
> --- a/cmds/receive.c
> +++ b/cmds/receive.c
> @@ -739,7 +739,7 @@ static int process_clone(const char *path, u64 offset, u64 len,
> struct btrfs_ioctl_clone_range_args clone_args;
> struct subvol_info *si = NULL;
> char full_path[PATH_MAX];
> - char *subvol_path = NULL;
> + char *subvol_path;
I think that should become const char *.
> char full_clone_path[PATH_MAX];
> int clone_fd = -1;
>
> @@ -760,7 +760,7 @@ static int process_clone(const char *path, u64 offset, u64 len,
> if (memcmp(clone_uuid, rctx->cur_subvol.received_uuid,
> BTRFS_UUID_SIZE) == 0) {
> /* TODO check generation of extent */
> - subvol_path = strdup(rctx->cur_subvol_path);
> + subvol_path = rctx->cur_subvol_path;
> } else {
> if (!si)
> ret = -ENOENT;
> @@ -794,14 +794,14 @@ static int process_clone(const char *path, u64 offset, u64 len,
> if (sub_len > root_len &&
> strstr(si->path, rctx->full_root_path) == si->path &&
> si->path[root_len] == '/') {
> - subvol_path = strdup(si->path + root_len + 1);
> + subvol_path = si->path + root_len + 1;
> } else {
> error("clone: source subvol path %s unreachable from %s",
> si->path, rctx->full_root_path);
> goto out;
> }
> } else {
> - subvol_path = strdup(si->path);
> + subvol_path = si->path;
> }
> }
>
> @@ -839,7 +839,6 @@ out:
> free(si->path);
> free(si);
> }
> - free(subvol_path);
> if (clone_fd != -1)
> close(clone_fd);
> return ret;
> --
> 2.22.0
>
Mike