From 044d25330642b4b13f0e51be19ba5d08782848d4 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sun, 14 Nov 2021 09:12:40 +1000 Subject: [PATCH] fix underflow in fuzz code, leading to large intervals https://forums.ankiweb.net/t/buried-cards-in-ankimobile-beta-20081-3/14753 --- rslib/src/scheduler/states/mod.rs | 2 +- rslib/src/scheduler/states/review.rs | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/rslib/src/scheduler/states/mod.rs b/rslib/src/scheduler/states/mod.rs index 8abc77979..831db55c9 100644 --- a/rslib/src/scheduler/states/mod.rs +++ b/rslib/src/scheduler/states/mod.rs @@ -156,7 +156,7 @@ fn constrained_fuzz_bounds(interval: f32, minimum: u32, maximum: u32) -> (u32, u if upper == lower && upper != 1 { upper = lower + 1; }; - (lower, upper.min(maximum)) + (lower, upper.min(maximum).max(lower)) } fn fuzz_bounds(interval: f32) -> (u32, u32) { diff --git a/rslib/src/scheduler/states/review.rs b/rslib/src/scheduler/states/review.rs index c810861b3..2aa6774b2 100644 --- a/rslib/src/scheduler/states/review.rs +++ b/rslib/src/scheduler/states/review.rs @@ -253,4 +253,25 @@ mod test { assert!(leech_threshold_met(2, 1)); assert!(leech_threshold_met(3, 1)); } + + #[test] + fn low_multiplier_fuzz() { + let mut ctx = StateContext::defaults_for_testing(); + // our calculations should work correctly with a low ease or non-default multiplier + let state = ReviewState { + scheduled_days: 1, + elapsed_days: 1, + ease_factor: 1.3, + lapses: 0, + leeched: false, + }; + ctx.fuzz_factor = Some(0.0); + assert_eq!(state.passing_review_intervals(&ctx), (2, 3, 4)); + + // this is a silly multiplier, but it shouldn't underflow + ctx.interval_multiplier = 0.1; + assert_eq!(state.passing_review_intervals(&ctx), (2, 3, 4)); + ctx.fuzz_factor = Some(0.99); + assert_eq!(state.passing_review_intervals(&ctx), (2, 3, 4)); + } }