pikpak: fix truncated files being created when the source ends early
If the source supplied fewer bytes than its declared size, the multipart upload was completed anyway, storing a truncated file and reporting a successful upload. Check the number of bytes read from the source against the declared size before finalising and abort the upload with an error if they do not match. This was found by the new FsPutShortEOF integration test.
This commit is contained in:
@@ -128,6 +128,13 @@ func (w *pikpakChunkWriter) Upload(ctx context.Context) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
// Check the source supplied the number of bytes it declared before
|
||||
// finalising, otherwise a truncated file would be stored as a good
|
||||
// upload. Returning an error here aborts the upload.
|
||||
if size >= 0 && off != size {
|
||||
return fmt.Errorf("multipart upload: expected %d bytes in input, but got %d: %w", size, off, io.ErrUnexpectedEOF)
|
||||
}
|
||||
|
||||
err = w.Close(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("multipart upload: failed to finalise: %w", err)
|
||||
|
||||
Reference in New Issue
Block a user