huaweidrive: fix truncated files being uploaded successfully when the source ends early
The multipart upload copied the source into the request buffer without checking how many bytes it had read, so a source that supplied fewer bytes than its declared size was accepted by the server and reported as a success with a truncated file stored. Count the bytes actually read and fail the upload if they do not match the declared size. Signed-off-by: Rohit Behera <126186063+r0h1tb@users.noreply.github.com>
This commit is contained in:
committed by
Nick Craig-Wood
parent
d9aa903358
commit
83b143103c
@@ -33,6 +33,7 @@ import (
|
||||
"github.com/rclone/rclone/lib/encoder"
|
||||
"github.com/rclone/rclone/lib/oauthutil"
|
||||
"github.com/rclone/rclone/lib/pacer"
|
||||
"github.com/rclone/rclone/lib/readers"
|
||||
"github.com/rclone/rclone/lib/rest"
|
||||
"golang.org/x/oauth2"
|
||||
)
|
||||
@@ -1771,11 +1772,18 @@ func (o *Object) uploadMultipart(ctx context.Context, in io.Reader, leaf, direct
|
||||
}
|
||||
|
||||
// Read and write file content
|
||||
_, err = io.Copy(fileWriter, in)
|
||||
counter := readers.NewCountingReader(in)
|
||||
_, err = io.Copy(fileWriter, counter)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to copy file content: %w", err)
|
||||
}
|
||||
|
||||
// Check the source supplied the number of bytes it declared
|
||||
// otherwise a truncated file would be stored as a good upload.
|
||||
if int64(counter.BytesRead()) != size {
|
||||
return fmt.Errorf("expected %d bytes in input, but got %d: %w", size, counter.BytesRead(), io.ErrUnexpectedEOF)
|
||||
}
|
||||
|
||||
err = writer.Close()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to close multipart writer: %w", err)
|
||||
|
||||
Reference in New Issue
Block a user