Skip to content

Commit 1037d48

Browse files
google-labs-jules[bot]ChanTsune
authored andcommitted
🔒 Saturate timestamp nanosecond addition during entry parsing
Use `time::Duration::saturating_add` instead of `+` for ctime/mtime/atime when combining seconds (cTIM/mTIM/aTIM) with nanoseconds (cTNS/mTNS/aTNS) in `NormalEntry` parsing. `time::Duration` panics on i64 second overflow, but the upstream `nanos()` helper already rejects values `>= 1_000_000_000`, so the previous `+` cannot actually panic for any archive that passes existing chunk validation. The change is defense-in-depth: if `nanos()` is ever relaxed or upstream `time::Duration` semantics change, the parser stays total without introducing a new `InvalidData` error path that would reject archives that decode cleanly today. No behavior change for archives whose nanoseconds satisfy the existing 0..1_000_000_000 constraint.
1 parent a84eadf commit 1037d48

1 file changed

Lines changed: 6 additions & 3 deletions

File tree

lib/src/entry.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -681,9 +681,12 @@ where
681681
}
682682
}
683683
}
684-
let ctime = ctime.map(|t| t + Duration::nanoseconds(ctime_ns.unwrap_or(0) as _));
685-
let mtime = mtime.map(|t| t + Duration::nanoseconds(mtime_ns.unwrap_or(0) as _));
686-
let atime = atime.map(|t| t + Duration::nanoseconds(atime_ns.unwrap_or(0) as _));
684+
let ctime =
685+
ctime.map(|t| t.saturating_add(Duration::nanoseconds(ctime_ns.unwrap_or(0) as _)));
686+
let mtime =
687+
mtime.map(|t| t.saturating_add(Duration::nanoseconds(mtime_ns.unwrap_or(0) as _)));
688+
let atime =
689+
atime.map(|t| t.saturating_add(Duration::nanoseconds(atime_ns.unwrap_or(0) as _)));
687690

688691
Ok(Self {
689692
header,

0 commit comments

Comments
 (0)