summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.cz>2014-12-19 16:55:32 +0100
committerDavid Sterba <dsterba@suse.cz>2014-12-19 18:04:25 +0100
commitc4ca5c5f3f9bc4ccd25c4a640bd7052d8a0c2e67 (patch)
treef25b8773730241bb89439d929640a8e6e211cdbd
parent34350d11c1bf0723206972175f1f18b7e8840377 (diff)
btrfs-progs: check allocation result in add_clone_source
Resolves-Coverity-CID: 1054894 Reviewed-by: Eric Sandeen <sandeen@redhat.com> Signed-off-by: David Sterba <dsterba@suse.cz>
-rw-r--r--cmds-send.c25
1 files changed, 21 insertions, 4 deletions
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;