diff --git a/backend/s3/s3.go b/backend/s3/s3.go index 9aba03a3f..d869efb8d 100644 --- a/backend/s3/s3.go +++ b/backend/s3/s3.go @@ -57,6 +57,7 @@ import ( "github.com/rclone/rclone/lib/readers" "github.com/rclone/rclone/lib/rest" "github.com/rclone/rclone/lib/version" + "golang.org/x/net/http/httpguts" "golang.org/x/sync/errgroup" ) @@ -5241,6 +5242,20 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op } } + // Check metadata keys and values are valid + for key, value := range req.Metadata { + if !httpguts.ValidHeaderFieldName(key) { + fs.Errorf(o, "Dropping invalid metadata key %q", key) + delete(req.Metadata, key) + } else if value == nil { + fs.Errorf(o, "Dropping nil metadata value for key %q", key) + delete(req.Metadata, key) + } else if !httpguts.ValidHeaderFieldValue(*value) { + fs.Errorf(o, "Dropping invalid metadata value %q for key %q", *value, key) + delete(req.Metadata, key) + } + } + var wantETag string // Multipart upload Etag to check var gotEtag string // Etag we got from the upload var lastModified time.Time // Time we got from the upload