From 2b7ddc6c09a7e77874ed9aefc47fbc445d2579ec Mon Sep 17 00:00:00 2001 From: Alexander Yastrebov Date: Tue, 26 Sep 2023 23:49:23 +0200 Subject: [PATCH] internal/zstd: allow stream consisting of skippable frames For #62513 --- src/internal/zstd/zstd.go | 3 ++- src/internal/zstd/zstd_test.go | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/internal/zstd/zstd.go b/src/internal/zstd/zstd.go index 60551a4371..055615f495 100644 --- a/src/internal/zstd/zstd.go +++ b/src/internal/zstd/zstd.go @@ -169,7 +169,7 @@ retry: // Read magic number. RFC 3.1.1. if _, err := io.ReadFull(r.r, r.scratch[:4]); err != nil { - // We require that the stream contain at least one frame. + // We require that the stream contains at least one frame. if err == io.EOF && !r.readOneFrame { err = io.ErrUnexpectedEOF } @@ -183,6 +183,7 @@ retry: if err := r.skipFrame(); err != nil { return err } + r.readOneFrame = true goto retry } diff --git a/src/internal/zstd/zstd_test.go b/src/internal/zstd/zstd_test.go index c2914bb1f4..8bdb341503 100644 --- a/src/internal/zstd/zstd_test.go +++ b/src/internal/zstd/zstd_test.go @@ -95,6 +95,17 @@ var tests = []struct { "", "\x28\xb5\x2f\xfd\x00\x00\x15\x00\x00\x00\x00", }, + { + "single skippable frame", + "", + "\x50\x2a\x4d\x18\x00\x00\x00\x00", + }, + { + "two skippable frames", + "", + "\x50\x2a\x4d\x18\x00\x00\x00\x00" + + "\x50\x2a\x4d\x18\x00\x00\x00\x00", + }, } func TestSamples(t *testing.T) {