Eighteen patches, each breaking one function of the playlist side and naming the cases that must fail: adjacency (another program date-time, a larger discontinuity sequence), rendering (parts after EXTINF, layer lines after the URI), bandwidth rounding, duration rounding, a delta update read, the session-data line before #EXTM3U, the render digest left out of the signed payload, a receipt under another name, an unchecked parent, the open segment's parts not read for cids, the integer log without interpolation, a waiting utility rule, a look-ahead blind to stalls, an unlabelled figure taken as zero, per-layer bytes as a depth's, and size-blind entry order. falsify/run.sh builds with http and video_manifest and runs the eleven new Python mutations. A depth case at 150 kb/s sits between layer boundaries. Co-Authored-By: Claude Opus 5.5 <[email protected]>
15 lines
763 B
Diff
15 lines
763 B
Diff
# must fail: playlist_parse_rounding
|
|
# durations truncated to the millisecond, not rounded (hls::decimal_ms)
|
|
diff --git a/wai/wai-rs/src/http_binding/hls.rs b/wai/wai-rs/src/http_binding/hls.rs
|
|
index 2623644b..552dbde8 100644
|
|
--- a/wai/wai-rs/src/http_binding/hls.rs
|
|
+++ b/wai/wai-rs/src/http_binding/hls.rs
|
|
@@ -92,7 +92,7 @@ pub fn decimal_ms(s: &str) -> Option<u64> {
|
|
let digit = |i: usize| f.as_bytes().get(i).map_or(0, |b| u64::from(b - b'0'));
|
|
let whole: u64 = int.parse().ok()?;
|
|
let ms = whole.checked_mul(1000)?.checked_add(digit(0) * 100 + digit(1) * 10 + digit(2))?;
|
|
- if digit(3) >= 5 { ms.checked_add(1) } else { Some(ms) }
|
|
+ if digit(3) >= 10 { ms.checked_add(1) } else { Some(ms) }
|
|
}
|
|
|
|
fn decimal_int(s: &str) -> Option<u64> {
|