Merge pull request #5966 from dmcgowan/fix-unexpected-eof-handling

This commit is contained in:
Fu Wei 2021-09-11 09:28:12 +08:00 committed by GitHub
commit 94b86a6b97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 4 deletions

View File

@ -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") 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 err := cw.Commit(ctx, size, expected, opts...); err != nil {
if !errdefs.IsAlreadyExists(err) { if !errdefs.IsAlreadyExists(err) {
@ -165,8 +170,15 @@ func CopyReaderAt(cw Writer, ra ReaderAt, n int64) error {
return err return err
} }
_, err = copyWithBuffer(cw, io.NewSectionReader(ra, ws.Offset, n)) copied, err := copyWithBuffer(cw, io.NewSectionReader(ra, ws.Offset, n))
return err 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 // CopyReader copies to a writer from a given reader, returning

View File

@ -65,10 +65,11 @@ func TestCopy(t *testing.T) {
}, },
{ {
name: "commit already exists", name: "commit already exists",
source: defaultSource, source: newCopySource("this already exists"),
writer: fakeWriter{commitFunc: func() error { writer: fakeWriter{commitFunc: func() error {
return errdefs.ErrAlreadyExists return errdefs.ErrAlreadyExists
}}, }},
expected: "this already exists",
}, },
} }