From c4ca5c5f3f9bc4ccd25c4a640bd7052d8a0c2e67 Mon Sep 17 00:00:00 2001 From: David Sterba Date: Fri, 19 Dec 2014 16:55:32 +0100 Subject: btrfs-progs: check allocation result in add_clone_source Resolves-Coverity-CID: 1054894 Reviewed-by: Eric Sandeen Signed-off-by: David Sterba --- cmds-send.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'cmds-send.c') diff --git a/cmds-send.c b/cmds-send.c index b17b5e2c..9b32c1f0 100644 --- a/cmds-send.c +++ b/cmds-send.c @@ -172,11 +172,16 @@ out: return ret; } -static void add_clone_source(struct btrfs_send *s, u64 root_id) +static int add_clone_source(struct btrfs_send *s, u64 root_id) { s->clone_sources = realloc(s->clone_sources, sizeof(*s->clone_sources) * (s->clone_sources_count + 1)); + + if (!s->clone_sources) + return -ENOMEM; s->clone_sources[s->clone_sources_count++] = root_id; + + return 0; } static int write_buf(int fd, const void *buf, int size) @@ -475,7 +480,11 @@ int cmd_send(int argc, char **argv) goto out; } - add_clone_source(&send, root_id); + ret = add_clone_source(&send, root_id); + if (ret < 0) { + fprintf(stderr, "ERROR: not enough memory\n"); + goto out; + } subvol_uuid_search_finit(&send.sus); free(subvol); subvol = NULL; @@ -575,7 +584,11 @@ int cmd_send(int argc, char **argv) goto out; } - add_clone_source(&send, parent_root_id); + ret = add_clone_source(&send, parent_root_id); + if (ret < 0) { + fprintf(stderr, "ERROR: not enough memory\n"); + goto out; + } } for (i = optind; i < argc; i++) { @@ -671,7 +684,11 @@ int cmd_send(int argc, char **argv) goto out; /* done with this subvol, so add it to the clone sources */ - add_clone_source(&send, root_id); + ret = add_clone_source(&send, root_id); + if (ret < 0) { + fprintf(stderr, "ERROR: not enough memory\n"); + goto out; + } parent_root_id = 0; full_send = 0; -- cgit v1.2.3