From f38f001bad18f011c37e6167e052027dedbf51da Mon Sep 17 00:00:00 2001 From: Raj Singh Date: Fri, 4 Sep 2026 00:01:32 +0000 Subject: [PATCH] api/s3: don't panic when final multipart version has no blocks CompleteMultipartUpload builds the final version and then reads `final_version.blocks.items()[0]` unconditionally. When the assembled version ends up with an empty block list the index panics and the process dies before it can answer the request: panicked at src/api/s3/multipart.rs:479:3: index out of bounds: the len is 0 but the index is 0 Use `.first()` and return an internal error instead, matching how the rest of this file handles missing data. The empty-block case is an internal consistency condition rather than a malformed request, so it maps to an internal error rather than a 4xx. The same panic was reported earlier in #1403, at multipart.rs:483 on v2.2.0. That report was closed without a fix after the reporter moved off consistency_mode = "dangerous". Closes #1521 --- src/api/s3/multipart.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/api/s3/multipart.rs b/src/api/s3/multipart.rs index 16c8b6aa..1f493a24 100644 --- a/src/api/s3/multipart.rs +++ b/src/api/s3/multipart.rs @@ -476,7 +476,13 @@ pub async fn handle_complete_multipart_upload( size: total_size, etag: etag.clone(), }, - final_version.blocks.items()[0].1.hash, + final_version + .blocks + .items() + .first() + .ok_or_internal_error("Multipart completion produced a final version with no blocks")? + .1 + .hash, )); let final_object = Object::new(*bucket_id, key.clone(), vec![object_version]);