Message ID | 20241212135000.1926110-1-zaslonko@linux.ibm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | btrfs: Fix avail_in bytes for s390 zlib HW compression path | expand |
On Thu, 2024-12-12 at 14:50 +0100, Mikhail Zaslonko wrote: > Since the input data length passed to zlib_compress_folios() can be > arbitrary, always setting strm.avail_in to a multiple of PAGE_SIZE > may > cause read-in bytes to exceed the input range. Currently this > triggers > an assert in btrfs_compress_folios() on the debug kernel. But it may > potentially lead to data corruption. > Fix strm.avail_in calculation for S390 hardware acceleration path. > > Signed-off-by: Mikhail Zaslonko <zaslonko@linux.ibm.com> > Fixes: fd1e75d0105d ("btrfs: make compression path to be subpage > compatible") > --- > fs/btrfs/zlib.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
diff --git a/fs/btrfs/zlib.c b/fs/btrfs/zlib.c index ddf0d5a448a7..c9e92c6941ec 100644 --- a/fs/btrfs/zlib.c +++ b/fs/btrfs/zlib.c @@ -174,10 +174,10 @@ int zlib_compress_folios(struct list_head *ws, struct address_space *mapping, copy_page(workspace->buf + i * PAGE_SIZE, data_in); start += PAGE_SIZE; - workspace->strm.avail_in = - (in_buf_folios << PAGE_SHIFT); } workspace->strm.next_in = workspace->buf; + workspace->strm.avail_in = min(bytes_left, + in_buf_folios << PAGE_SHIFT); } else { unsigned int pg_off; unsigned int cur_len;
Since the input data length passed to zlib_compress_folios() can be arbitrary, always setting strm.avail_in to a multiple of PAGE_SIZE may cause read-in bytes to exceed the input range. Currently this triggers an assert in btrfs_compress_folios() on the debug kernel. But it may potentially lead to data corruption. Fix strm.avail_in calculation for S390 hardware acceleration path. Signed-off-by: Mikhail Zaslonko <zaslonko@linux.ibm.com> Fixes: fd1e75d0105d ("btrfs: make compression path to be subpage compatible") --- fs/btrfs/zlib.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)