fix: restore multipart part order validation (without strict ETag check)

This commit is contained in:
asepharyana
2026-07-07 06:11:49 +07:00
parent bc806313b1
commit 1ef73fefa9
+4 -19
View File
@@ -930,32 +930,17 @@ const handleCompleteMultipartUpload = async (
const parts = parseCompleteMultipartBody(body);
const storedParts = await listMultipartParts(uploadId);
// Validate parts match stored parts in ascending order and correct ETags
const sortedParts = [...parts].sort((a, b) => a.partNumber - b.partNumber);
for (let i = 0; i < sortedParts.length; i++) {
if (sortedParts[i].partNumber !== i + 1) {
// Validate ascending part order
const partNumbers = parts.map((p) => p.partNumber);
if (partNumbers.length > 1 && partNumbers.some((n, i) => i > 0 && n <= partNumbers[i - 1])) {
return s3ErrorResponse(
'InvalidPartOrder',
'The list of parts was not in ascending order. Parts must be ordered by part number.',
'The list of parts was not in ascending order.',
`/${bucket}/${key}`,
400,
reqId,
);
}
}
const storedMap = new Map(storedParts.map((p) => [p.partNumber, p]));
for (const part of parts) {
const stored = storedMap.get(part.partNumber);
if (!stored || stored.etag !== part.etag) {
return s3ErrorResponse(
'InvalidPart',
'One or more specified parts could not be found. The part might not have been uploaded, or the specified ETag might not match.',
`/${bucket}/${key}`,
400,
reqId,
);
}
}
if (parts.length !== storedParts.length) {
return s3ErrorResponse(