diff --git a/s2/encode_better.go b/s2/encode_better.go index e1d0d60616..6e15917340 100644 --- a/s2/encode_better.go +++ b/s2/encode_better.go @@ -183,6 +183,9 @@ func encodeBlockBetter(dst, src []byte) (d int) { if offset > 65535 && s-base <= 5 { // Bail if the match is equal or worse to the encoding. s = base + 3 + if s >= sLimit { + goto emitRemainder + } cv = load64(src, s) continue } diff --git a/s2/encode_test.go b/s2/encode_test.go index 907478255c..34b9dc7775 100644 --- a/s2/encode_test.go +++ b/s2/encode_test.go @@ -45,6 +45,20 @@ func TestEncoderRegression(t *testing.T) { t.Error(fmt.Errorf("MaxEncodedLen Exceed: input: %d, mel: %d, got %d", len(data), mel, len(comp))) return } + comp = EncodeBetter(make([]byte, MaxEncodedLen(len(data))), data) + decoded, err = Decode(nil, comp) + if err != nil { + t.Error(err) + return + } + if !bytes.Equal(data, decoded) { + t.Error("block decoder mismatch") + return + } + if mel := MaxEncodedLen(len(data)); len(comp) > mel { + t.Error(fmt.Errorf("MaxEncodedLen Exceed: input: %d, mel: %d, got %d", len(data), mel, len(comp))) + return + } // Test writer and use "better": var buf bytes.Buffer encBetter.Reset(&buf) @@ -131,7 +145,7 @@ func TestEncoderRegression(t *testing.T) { t.Error(err) return } - test(t, b) + test(t, b[:len(b):len(b)]) }) } } diff --git a/s2/testdata/enc_regressions.zip b/s2/testdata/enc_regressions.zip index 5fc2cfc520..bd5afa71e0 100644 Binary files a/s2/testdata/enc_regressions.zip and b/s2/testdata/enc_regressions.zip differ