fix: prevent panic in ParseCopySource on empty input

ParseCopySource indexes into copySourceHeader[0] without checking
for an empty string, causing an index-out-of-range panic.

The three backend callers (azure, posix) pass the x-amz-copy-source
header value directly, so a malformed or missing header propagates
an empty string into ParseCopySource.

Add an empty-string guard at the top of the function that returns
an InvalidArgCopySourceBucket error, consistent with the existing
error returned when the source path has no bucket/object separator.

Add a table-driven test case that reproduces the panic without the
fix and verifies the correct error with the fix.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>
This commit is contained in:
Sebastien Tardif
2026-06-08 12:04:03 -07:00
parent aa52aa08d7
commit 422b5a7024
2 changed files with 13 additions and 0 deletions
+4
View File
@@ -230,6 +230,10 @@ func ParseCopySourceRange(size int64, acceptRange string) (int64, int64, error)
// ParseCopySource parses x-amz-copy-source header and returns source bucket,
// source object, versionId, error respectively
func ParseCopySource(copySourceHeader string) (string, string, string, error) {
if copySourceHeader == "" {
return "", "", "", s3err.GetInvalidArgumentErr(s3err.InvalidArgCopySourceBucket, copySourceHeader)
}
if copySourceHeader[0] == '/' {
copySourceHeader = copySourceHeader[1:]
}
+9
View File
@@ -223,6 +223,15 @@ func TestParseCopySource(t *testing.T) {
wantErr: true,
wantErrValue: s3err.GetInvalidArgumentErr(s3err.InvalidArgCopySourceEncoding, "mybucket/object%ZZ"),
},
{
name: "empty string",
copySourceHeader: "",
wantBucket: "",
wantObject: "",
wantVersionId: "",
wantErr: true,
wantErrValue: s3err.GetInvalidArgumentErr(s3err.InvalidArgCopySourceBucket, ""),
},
{
name: "missing object",
copySourceHeader: "mybucket",