Skip to content

Commit a2f783c

Browse files
committed
Avoid time operations that can panic
We have reports of runtime panics (linkerd/linkerd2#7748) that sound a lot like rust-lang/rust#86470. We don't have any evidence that these panics originate in h2, but there is one use of `Instant::sub` that could panic in this way. Even though this is almost definitely a bug in Rust, it seems most prudent to actively avoid the uses of `Instant` that are prone to this bug. These fixes should ultimately be made in the standard library, but this change lets us avoid this problem while we wait for those fixes. This change replaces uses of `Instant::elapsed` and `Instant::sub` with calls to `Instant::saturating_duration_since` to prevent this class of panic. See also hyperium/hyper#2746
1 parent b0d01bb commit a2f783c

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

src/proto/streams/recv.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,10 @@ impl Recv {
860860
let reset_duration = self.reset_duration;
861861
while let Some(stream) = self.pending_reset_expired.pop_if(store, |stream| {
862862
let reset_at = stream.reset_at.expect("reset_at must be set if in queue");
863-
now - reset_at > reset_duration
863+
// rust-lang/rust#86470 tracks a bug in the standard library where `Instant`
864+
// subtraction can panic (because, on some platforms, `Instant` isn't actually
865+
// monotonic). We use a saturating operation to avoid this panic here.
866+
now.saturating_duration_since(reset_at) > reset_duration
864867
}) {
865868
counts.transition_after(stream, true);
866869
}

0 commit comments

Comments
 (0)