pierrec / lz4

LZ4 compression and decompression in pure Go
BSD 3-Clause "New" or "Revised" License
878 stars 142 forks source link

Java compress data can not be decompress #189

Closed LHRchina closed 2 years ago

LHRchina commented 2 years ago

I want to decompress data from java net.jpountz.lz4 compress, but failed : lz4: invalid source or destination buffer too short

zwbdzb commented 2 years ago

yes, I also find the question:

if bytes.EqualFold(contentEncoding, []byte("lz4")) {
        b = make([]byte, 200*1024*1024)
        _, err = lz4.UncompressBlock(remoteResp.Body(), b)
        if err != nil {
            checklist.CheckList("fetchAllDataFromMdbStore", "ReadAllDataFromMdbStoreClient-lz4-fail", checklist.Local_Ip, err.Error(), 1, 0)
            return 0
        }

debug stack:

call  len(remoteResp.Body())   18124338
call len(b)   209715200

the dst is enough larger than the encode/decode src. but still can not decode.

result in: invalid source or destination buffer too short

tomasz1986 commented 2 years ago

I think these errors that I've encountered in Syncthing (which uses this library to compress data in transfer) could possibly be related too.

In short, here the problem only seems to affect the i386 release, and also only occurs when decompressing specific files. The last working version is v4.1.13, while v4.1.15 is broken. There were 24 commits between https://github.com/pierrec/lz4/compare/v4.1.13...v4.1.15, so it's probably one of them that is likely the culprit.

calmh commented 2 years ago

Here's a test case to reproduce the failure: https://github.com/pierrec/lz4/pull/191

tomasz1986 commented 2 years ago

I've done more testing, and v4.1.14 also seems to work fine, so the issue is down to something changed between https://github.com/pierrec/lz4/compare/v4.1.14...v4.1.15.

tomasz1986 commented 2 years ago

It's the commit https://github.com/pierrec/lz4/commit/7e764f73f7cb74bcd418db52060b12cf76d1128e that broke it.