From 2458afeb131b8942907b1c62a9b1751387e2ed08 Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Thu, 9 Sep 2021 09:52:19 -0700 Subject: [PATCH] Fix content copy to not ignore unexpected EOF Signed-off-by: Derek McGowan --- content/helpers.go | 18 +++++++++++++++--- content/helpers_test.go | 3 ++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/content/helpers.go b/content/helpers.go index 4c4a35308..00fae1fc8 100644 --- a/content/helpers.go +++ b/content/helpers.go @@ -144,9 +144,14 @@ func Copy(ctx context.Context, cw Writer, r io.Reader, size int64, expected dige } } - if _, err := copyWithBuffer(cw, r); err != nil { + copied, err := copyWithBuffer(cw, r) + if err != nil { return errors.Wrap(err, "failed to copy") } + if size != 0 && copied < size-ws.Offset { + // Short writes would return its own error, this indicates a read failure + return errors.Wrapf(io.ErrUnexpectedEOF, "failed to read expected number of bytes") + } if err := cw.Commit(ctx, size, expected, opts...); err != nil { if !errdefs.IsAlreadyExists(err) { @@ -165,8 +170,15 @@ func CopyReaderAt(cw Writer, ra ReaderAt, n int64) error { return err } - _, err = copyWithBuffer(cw, io.NewSectionReader(ra, ws.Offset, n)) - return err + copied, err := copyWithBuffer(cw, io.NewSectionReader(ra, ws.Offset, n)) + if err != nil { + return errors.Wrap(err, "failed to copy") + } + if copied < n { + // Short writes would return its own error, this indicates a read failure + return errors.Wrap(io.ErrUnexpectedEOF, "failed to read expected number of bytes") + } + return nil } // CopyReader copies to a writer from a given reader, returning diff --git a/content/helpers_test.go b/content/helpers_test.go index 1b4e39926..be52f043e 100644 --- a/content/helpers_test.go +++ b/content/helpers_test.go @@ -65,10 +65,11 @@ func TestCopy(t *testing.T) { }, { name: "commit already exists", - source: defaultSource, + source: newCopySource("this already exists"), writer: fakeWriter{commitFunc: func() error { return errdefs.ErrAlreadyExists }}, + expected: "this already exists", }, }