]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: lzo: add error message for invalid headers
authorQu Wenruo <wqu@suse.com>
Sun, 7 Jun 2026 22:53:49 +0000 (08:23 +0930)
committerDavid Sterba <dsterba@suse.com>
Tue, 30 Jun 2026 00:02:02 +0000 (02:02 +0200)
Inside btrfs we always pair -EUCLEAN error with an error message to
indicate which data is corrupted.

However there are 3 cases inside lzo decompression where there is no
error message for corrupted headers.

Add those missing error messages to show exactly where the corruption
is.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/lzo.c

index 6e4aa22853aba20530e7cb17fca83cb7d1e2a164..1531adb117d15a975735593fc03c44535a89a2a6 100644 (file)
@@ -552,17 +552,26 @@ int lzo_decompress(struct list_head *ws, const u8 *data_in,
        size_t max_segment_len = workspace_buf_length(fs_info);
        int ret;
 
-       if (unlikely(srclen < LZO_LEN || srclen > max_segment_len + LZO_LEN * 2))
+       if (unlikely(srclen < LZO_LEN || srclen > max_segment_len + LZO_LEN * 2)) {
+               btrfs_err(fs_info, "invalid lzo header length, has %zu expect (%u, %zu)",
+                         srclen, LZO_LEN, max_segment_len + LZO_LEN * 2);
                return -EUCLEAN;
+       }
 
        in_len = get_unaligned_le32(data_in);
-       if (unlikely(in_len != srclen))
+       if (unlikely(in_len != srclen)) {
+               btrfs_err(fs_info, "invalid lzo header length, has %zu expect %zu",
+                         in_len, srclen);
                return -EUCLEAN;
+       }
        data_in += LZO_LEN;
 
        in_len = get_unaligned_le32(data_in);
-       if (unlikely(in_len != srclen - LZO_LEN * 2))
+       if (unlikely(in_len != srclen - LZO_LEN * 2)) {
+               btrfs_err(fs_info, "invalid lzo segment length, has %zu expect %zu",
+                         in_len, srclen - LZO_LEN * 2);
                return -EUCLEAN;
+       }
        data_in += LZO_LEN;
 
        out_len = sectorsize;