]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commit
compressor/lz4: rebuild if buffer is not contiguous 33584/head
authorSage Weil <sage@redhat.com>
Thu, 27 Feb 2020 15:30:27 +0000 (09:30 -0600)
committerSage Weil <sage@redhat.com>
Mon, 2 Mar 2020 19:01:22 +0000 (13:01 -0600)
commit8e80f5f678915f18bdf873502283bf3e2020f904
treeff4bde1f1c2af6703bd38940b3d150bdc9762014
parent8c8fb59dcf02da7e2af8f3f5b1e49d73bb1dbe28
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>
src/compressor/lz4/LZ4Compressor.h