diff --git a/cmds-receive.c b/cmds-receive.c index 62a79850..781dce9b 100644 --- a/cmds-receive.c +++ b/cmds-receive.c @@ -1061,6 +1061,7 @@ static int do_receive(struct btrfs_receive *r, const char *tomnt, char *dest_dir_full_path; char root_subvol_path[PATH_MAX]; int end = 0; + int count; dest_dir_full_path = realpath(tomnt, NULL); if (!dest_dir_full_path) { @@ -1155,6 +1156,7 @@ static int do_receive(struct btrfs_receive *r, const char *tomnt, if (ret < 0) goto out; + count = 0; while (!end) { if (r->cached_capabilities_len) { if (g_verbose >= 3) @@ -1169,6 +1171,13 @@ static int do_receive(struct btrfs_receive *r, const char *tomnt, max_errors); if (ret < 0) goto out; + /* Empty stream is invalid */ + if (ret && count == 0) { + error("empty stream is not considered valid"); + ret = -EINVAL; + goto out; + } + count++; if (ret) end = 1; diff --git a/send-stream.c b/send-stream.c index 920c7420..5a028cd9 100644 --- a/send-stream.c +++ b/send-stream.c @@ -74,7 +74,7 @@ static int read_buf(struct btrfs_send_stream *sctx, char *buf, size_t len) ret = 0; out_eof: - if (pos < len) { + if (0 < pos && pos < len) { error("short read from stream: expected %zu read %zu", len, pos); ret = -EIO; } else {