Sfoglia il codice sorgente

LibAudio: Prevent overflow in QOA LMS prediction

kleines Filmröllchen 1 anno fa
parent
commit
24f5914d18
1 ha cambiato i file con 4 aggiunte e 3 eliminazioni
  1. 4 3
      Userland/Libraries/LibAudio/QOATypes.cpp

+ 4 - 3
Userland/Libraries/LibAudio/QOATypes.cpp

@@ -38,10 +38,11 @@ LMSState::LMSState(u64 history_packed, u64 weights_packed)
 
 
 i32 LMSState::predict() const
 i32 LMSState::predict() const
 {
 {
-    i32 prediction = 0;
+    // The spec specifies that overflows are not allowed, but we do a safe thing anyways.
+    Checked<i32> prediction = 0;
     for (size_t i = 0; i < lms_history; ++i)
     for (size_t i = 0; i < lms_history; ++i)
-        prediction += history[i] * weights[i];
-    return prediction >> 13;
+        prediction.saturating_add(Checked<i32>::saturating_mul(history[i], weights[i]));
+    return prediction.value() >> 13;
 }
 }
 
 
 void LMSState::update(i32 sample, i32 residual)
 void LMSState::update(i32 sample, i32 residual)