mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-10 23:26:53 +00:00
fix(extract): treat tar mtime=0 as unset to fix unreadable entries (#4948)
An extracted entry whose tar header mtime is 0 was stored with mod_time = UNIX_EPOCH, which xl.meta encodes as 0 nanos (= no mod_time). On read-back the version failed valid() and parsing fell into the legacy rmp_serde fallback, so every read of the object returned 500 (invalid type: integer 0, expected an OffsetDateTime). Treat mtime 0 as unset (tar convention) and fall back to the upload time. Also fix two test-side issues uncovered behind the 500: the pax fixture must use a ustar header for its XHeader entry, and the SSE-S3 extract tests must provision RUSTFS_SSE_S3_MASTER_KEY. Re-admit the 19 quarantined tests to the e2e-full merge gate. Fixes #4842
This commit is contained in:
@@ -105,7 +105,11 @@ async fn make_tar_with_pax_entry(path: &str, data: &[u8], mtime: Option<u64>, pa
|
||||
pax_payload.extend(build_pax_record(key, value));
|
||||
}
|
||||
|
||||
let mut pax_header = tokio_tar::Header::new_gnu();
|
||||
// Pax extension entries must carry a POSIX ustar header — this is what real
|
||||
// tar writers emit, and the server-side reader rejects an XHeader typeflag on
|
||||
// GNU-format headers ("extension typeflag is not permitted on an unrecognized
|
||||
// header").
|
||||
let mut pax_header = tokio_tar::Header::new_ustar();
|
||||
pax_header.set_entry_type(tokio_tar::EntryType::XHeader);
|
||||
pax_header.set_size(pax_payload.len() as u64);
|
||||
pax_header.set_mode(0o644);
|
||||
@@ -5041,7 +5045,9 @@ async fn test_signed_put_object_extract_preserves_sse_s3_and_redirect() -> Resul
|
||||
init_logging();
|
||||
|
||||
let mut env = RustFSTestEnvironment::new().await?;
|
||||
env.start_rustfs_server(vec![]).await?;
|
||||
let sse_master_key = base64::engine::general_purpose::STANDARD.encode([0x42u8; 32]);
|
||||
env.start_rustfs_server_with_env(vec![], &[("RUSTFS_SSE_S3_MASTER_KEY", sse_master_key.as_str())])
|
||||
.await?;
|
||||
|
||||
let bucket = "signed-extract-sse-s3-redirect";
|
||||
let archive_key = "encrypted-metadata.tar";
|
||||
@@ -5318,7 +5324,9 @@ async fn test_signed_put_object_extract_uses_bucket_default_sse_s3() -> Result<(
|
||||
init_logging();
|
||||
|
||||
let mut env = RustFSTestEnvironment::new().await?;
|
||||
env.start_rustfs_server(vec![]).await?;
|
||||
let sse_master_key = base64::engine::general_purpose::STANDARD.encode([0x42u8; 32]);
|
||||
env.start_rustfs_server_with_env(vec![], &[("RUSTFS_SSE_S3_MASTER_KEY", sse_master_key.as_str())])
|
||||
.await?;
|
||||
|
||||
let bucket = "signed-extract-default-sse-s3";
|
||||
let archive_key = "default-encryption.tar";
|
||||
|
||||
Reference in New Issue
Block a user