- wai_http_vectors: op fetch_timed (a script of base / base_once / refinement / tick steps, each at a time on the caller's clock) and ten timed_OS_* cases, held at generation to their outcomes: the base ready at the first step; deadlines that pass exactly at verification plus the deadline whether the clock was never told, told 0, stepped back before or after, or near the end of u64; a refinement 200 carrying the whole object with a base or enhancement byte changed, after the base is ready and before. - http_verify.py: the session keeps the caller's clock (on_response carries it), the base and its time, frozen verified parts and a tick; a refinement's response keeps only its range; fetch_timed. Mutations base-at-done, tick-noop and refinement-unclipped each fail the timed cases; falsify/run.sh runs them. - Falsify patches: base-ready-at-done, tick-noop, refinement-200-whole, response-no-clock, deadline-wraps; reuse-stale regenerated for the moved context. Co-Authored-By: Claude Opus 5.5 <[email protected]>
15 lines
832 B
Diff
15 lines
832 B
Diff
# must fail: timed_OS_clock_saturates
|
|
# the deadline wraps past the end of u64 (session::FetchSession::tick)
|
|
diff --git a/wai/wai-rs/src/http_binding/session.rs b/wai/wai-rs/src/http_binding/session.rs
|
|
index ec31518e..d5f96691 100644
|
|
--- a/wai/wai-rs/src/http_binding/session.rs
|
|
+++ b/wai/wai-rs/src/http_binding/session.rs
|
|
@@ -398,7 +398,7 @@ impl FetchSession {
|
|
pub fn tick(&mut self, now_ms: u64) -> Vec<u32> {
|
|
self.now_ms = now_ms;
|
|
let (Some(at), Some(d)) = (self.base_ready_at(), self.policy.refinement_deadline_ms) else { return Vec::new() };
|
|
- if self.result.is_some() || now_ms < at.saturating_add(u64::from(d)) {
|
|
+ if self.result.is_some() || now_ms < at.wrapping_add(u64::from(d)) {
|
|
return Vec::new();
|
|
}
|
|
let ids = self.outstanding_of(Class::Refinement);
|