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 parts = parseCompleteMultipartBody(body);
const storedParts = await listMultipartParts(uploadId); const storedParts = await listMultipartParts(uploadId);
// Validate parts match stored parts in ascending order and correct ETags // Validate ascending part order
const sortedParts = [...parts].sort((a, b) => a.partNumber - b.partNumber); const partNumbers = parts.map((p) => p.partNumber);
for (let i = 0; i < sortedParts.length; i++) { if (partNumbers.length > 1 && partNumbers.some((n, i) => i > 0 && n <= partNumbers[i - 1])) {
if (sortedParts[i].partNumber !== i + 1) {
return s3ErrorResponse( return s3ErrorResponse(
'InvalidPartOrder', '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}`, `/${bucket}/${key}`,
400, 400,
reqId, 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) { if (parts.length !== storedParts.length) {
return s3ErrorResponse( return s3ErrorResponse(