]> git.apps.os.sepia.ceph.com Git - ceph.git/commit
compressor/lz4: rebuild if buffer is not contiguous 35004/head
authorSage Weil <sage@redhat.com>
Thu, 27 Feb 2020 15:30:27 +0000 (09:30 -0600)
committerNathan Cutler <ncutler@suse.com>
Mon, 11 May 2020 16:41:04 +0000 (18:41 +0200)
commitc1d8ae5b3ac66cfc08b565de8963e2d3ff4e2c48
tree98959c75e29838ffae02a0ff71d5a72be51e19a8
parent171b41ead14e19450fb6124b57856bb6cac3f110
compressor/lz4: rebuild if buffer is not contiguous

In older versions of lz4 (specifically < 1.8.2) bit errors
can be introduced when compressing from fragmented memory.  The lz4
bug was fixed by this lz4 commit:

commit af127334670a5e7b710bbd6adb71aa7c3ef0cd72
Author: Yann Collet <cyan@fb.com>
Date:   Sat May 5 18:24:11 2018 -0700

    fixed frametest error

    The error can be reproduced using following command :
    ./frametest -v -i100000000 -s1659 -t31096808

    It's actually a bug in the stream LZ4 API,
    when starting a new stream
    and providing a first chunk to complete with size < MINMATCH.
    In which case, the chunk becomes a dictionary.
    No hash was generated and stored,
    but the chunk is accessible as default position 0 points to dictStart,
    and position 0 is still within MAX_DISTANCE.
    Then, next attempt to read 32-bits from position 0 fails.

    The issue would have been mitigated by starting from index 64 KB,
    effectively eliminating position 0 as too far away.

    The proper fix is to eliminate such "dictionary" as too small.
    Which is what this patch does.

This is a workaround to rebuild our input buffer into a continguos buffer
if it is not already contiguous.

Fixes: https://tracker.ceph.com/issues/39525
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 8e80f5f678915f18bdf873502283bf3e2020f904)
src/compressor/lz4/LZ4Compressor.h