@@ -210,6 +210,46 @@ func TestSnappy_ConvertEnwik9(t *testing.T) {
210210 t .Log ("Encoded content matched" )
211211}
212212
213+ // TestSnappy_ConvertMalformedLiteralStale verifies that a malformed compressed
214+ // chunk declaring a literal longer than the bytes present in the chunk is
215+ // rejected as corrupt, instead of reading stale bytes from the reused r.buf.
216+ func TestSnappy_ConvertMalformedLiteralStale (t * testing.T ) {
217+ framedCompressedBlock := func (payload []byte ) []byte {
218+ stream := []byte {0xff , 0x06 , 0x00 , 0x00 , 's' , 'N' , 'a' , 'P' , 'p' , 'Y' }
219+ chunkLen := snappyChecksumSize + len (payload )
220+ stream = append (stream , 0x00 , byte (chunkLen ), byte (chunkLen >> 8 ), byte (chunkLen >> 16 ))
221+ stream = append (stream , 0x00 , 0x00 , 0x00 , 0x00 ) // checksum, not verified for compressed chunks
222+ return append (stream , payload ... )
223+ }
224+ convert := func (conv * SnappyConverter , stream []byte ) ([]byte , error ) {
225+ var comp bytes.Buffer
226+ if _ , err := conv .Convert (bytes .NewReader (stream ), & comp ); err != nil && err != io .EOF {
227+ return nil , err
228+ }
229+ dec , err := NewReader (nil )
230+ if err != nil {
231+ t .Fatal (err )
232+ }
233+ defer dec .Close ()
234+ return dec .DecodeAll (comp .Bytes (), nil )
235+ }
236+
237+ var conv SnappyConverter
238+
239+ // Valid block: decoded length 4, 4-byte literal "PREV".
240+ first := []byte {0x04 , 0x0c , 'P' , 'R' , 'E' , 'V' }
241+ if _ , err := convert (& conv , framedCompressedBlock (first )); err != nil {
242+ t .Fatal (err )
243+ }
244+
245+ // Malformed block: declares a 4-byte literal but supplies none.
246+ // Must be rejected instead of returning "PREV" from the reused buffer.
247+ malformed := []byte {0x04 , 0x0c }
248+ if _ , err := convert (& conv , framedCompressedBlock (malformed )); err != ErrSnappyCorrupt {
249+ t .Fatalf ("expected ErrSnappyCorrupt, got %v" , err )
250+ }
251+ }
252+
213253func BenchmarkSnappy_ConvertXML (b * testing.B ) {
214254 f , err := os .Open ("testdata/xml.zst" )
215255 if err != nil {
0 commit comments