From fd06bd6f96f1be5c14f30314b9c8c323b19219ed Mon Sep 17 00:00:00 2001 From: Yanqiang Miao Date: Sat, 8 Apr 2017 13:17:33 +0800 Subject: [PATCH] Reset the position of all readers before reading the data Signed-off-by: Yanqiang Miao --- pkg/ioutils/multireader.go | 3 ++- pkg/ioutils/multireader_test.go | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/ioutils/multireader.go b/pkg/ioutils/multireader.go index d7b97486c6..edb043ddc3 100644 --- a/pkg/ioutils/multireader.go +++ b/pkg/ioutils/multireader.go @@ -152,7 +152,8 @@ func (r *multiReadSeeker) getOffsetToReader(rdr io.ReadSeeker) (int64, error) { func (r *multiReadSeeker) Read(b []byte) (int, error) { if r.pos == nil { - r.pos = &pos{0, 0} + // make sure all readers are at 0 + r.Seek(0, os.SEEK_SET) } bLen := int64(len(b)) diff --git a/pkg/ioutils/multireader_test.go b/pkg/ioutils/multireader_test.go index 65309a9565..ef52b48c3b 100644 --- a/pkg/ioutils/multireader_test.go +++ b/pkg/ioutils/multireader_test.go @@ -55,6 +55,20 @@ func TestMultiReadSeekerReadAll(t *testing.T) { if string(b) != expected { t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected) } + + // The positions of some readers are not 0 + s1.Seek(0, os.SEEK_SET) + s2.Seek(0, os.SEEK_END) + s3.Seek(0, os.SEEK_SET) + mr = MultiReadSeeker(s1, s2, s3) + b, err = ioutil.ReadAll(mr) + if err != nil { + t.Fatal(err) + } + + if string(b) != expected { + t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected) + } } func TestMultiReadSeekerReadEach(t *testing.T) {