@@ -144,9 +144,14 @@ func Copy(ctx context.Context, cw Writer, r io.Reader, size int64, expected dige
144144 }
145145 }
146146
147- if _ , err := copyWithBuffer (cw , r ); err != nil {
147+ copied , err := copyWithBuffer (cw , r )
148+ if err != nil {
148149 return errors .Wrap (err , "failed to copy" )
149150 }
151+ if size != 0 && copied < size - ws .Offset {
152+ // Short writes would return its own error, this indicates a read failure
153+ return errors .Wrapf (io .ErrUnexpectedEOF , "failed to read expected number of bytes" )
154+ }
150155
151156 if err := cw .Commit (ctx , size , expected , opts ... ); err != nil {
152157 if ! errdefs .IsAlreadyExists (err ) {
@@ -165,8 +170,15 @@ func CopyReaderAt(cw Writer, ra ReaderAt, n int64) error {
165170 return err
166171 }
167172
168- _ , err = copyWithBuffer (cw , io .NewSectionReader (ra , ws .Offset , n ))
169- return err
173+ copied , err := copyWithBuffer (cw , io .NewSectionReader (ra , ws .Offset , n ))
174+ if err != nil {
175+ return errors .Wrap (err , "failed to copy" )
176+ }
177+ if copied < n {
178+ // Short writes would return its own error, this indicates a read failure
179+ return errors .Wrap (io .ErrUnexpectedEOF , "failed to read expected number of bytes" )
180+ }
181+ return nil
170182}
171183
172184// CopyReader copies to a writer from a given reader, returning
0 commit comments