btrfs-progs: check: original mode: Check inline extent size
[platform/upstream/btrfs-progs.git] / send-stream.c
index d2de9d3..78f2571 100644 (file)
@@ -33,6 +33,12 @@ struct btrfs_send_stream {
        struct btrfs_tlv_header *cmd_attrs[BTRFS_SEND_A_MAX + 1];
        u32 version;
 
+       /*
+        * end of last successful read, equivalent to start of current
+        * malformated part of block
+        */
+       size_t stream_pos;
+
        struct btrfs_send_ops *ops;
        void *user;
 };
@@ -61,13 +67,20 @@ static int read_buf(struct btrfs_send_stream *sctx, char *buf, size_t len)
                }
                if (rbytes == 0) {
                        ret = 1;
-                       goto out;
+                       goto out_eof;
                }
                pos += rbytes;
        }
-
        ret = 0;
 
+out_eof:
+       if (0 < pos && pos < len) {
+               error("short read from stream: expected %zu read %zu", len, pos);
+               ret = -EIO;
+       } else {
+               sctx->stream_pos += pos;
+       }
+
 out:
        return ret;
 }
@@ -473,12 +486,13 @@ int btrfs_read_and_process_send_stream(int fd,
        sctx.fd = fd;
        sctx.ops = ops;
        sctx.user = user;
+       sctx.stream_pos = 0;
 
        ret = read_buf(&sctx, (char*)&hdr, sizeof(hdr));
        if (ret < 0)
                goto out;
        if (ret) {
-               ret = 1;
+               ret = -ENODATA;
                goto out;
        }