mirror of
https://github.com/rclone/rclone.git
synced 2026-09-16 16:37:16 -04:00
Before this change the transport could still be reading the request body when Call returned, in two ways: - the goroutine writing a multipart upload form was never stopped or waited for, so after a failed request it kept reading the file body while the caller retried - the transport itself is documented to close the request body, possibly in a different goroutine after the request has finished, and hiding the body's Close method removed any way to wait for that Both of these raced with callers which seek to the start of a pooled buffer and retry the request, corrupting the retried body, and the abandoned multipart goroutine could read pooled pages after they had been returned to the pool. Call now waits for the transport to finish with the request body before returning, and the multipart form writer is stopped and waited for once the request has finished.