From 558fc1c09cb1a592f5879b7b727302ca21d082c4 Mon Sep 17 00:00:00 2001 From: M Alvee Date: Sat, 6 Sep 2025 10:34:38 -0700 Subject: [PATCH] fix: return error on conditional write for non existing object (#21550) --- cmd/erasure-object.go | 5 +++++ cmd/object-api-options.go | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/cmd/erasure-object.go b/cmd/erasure-object.go index 76e4d5269..6f603564c 100644 --- a/cmd/erasure-object.go +++ b/cmd/erasure-object.go @@ -1277,6 +1277,11 @@ func (er erasureObjects) putObject(ctx context.Context, bucket string, object st if err != nil && !isErrVersionNotFound(err) && !isErrObjectNotFound(err) && !isErrReadQuorum(err) { return objInfo, err } + + // if object doesn't exist and not a replication request return error for conditional requests + if err != nil && !opts.ReplicationRequest { + return objInfo, err + } } // Validate input data size and it can never be less than -1. diff --git a/cmd/object-api-options.go b/cmd/object-api-options.go index 1e0c10a75..3da831df7 100644 --- a/cmd/object-api-options.go +++ b/cmd/object-api-options.go @@ -414,12 +414,16 @@ func putOptsFromHeaders(ctx context.Context, hdr http.Header, metadata map[strin if err != nil { return ObjectOptions{}, err } - return ObjectOptions{ + op := ObjectOptions{ ServerSideEncryption: sseKms, UserDefined: metadata, MTime: mtime, PreserveETag: etag, - }, nil + } + if _, ok := hdr[xhttp.MinIOSourceReplicationRequest]; ok { + op.ReplicationRequest = true + } + return op, nil } // default case of passing encryption headers and UserDefined metadata to backend opts, err = getDefaultOpts(hdr, false, metadata)