瀏覽代碼

LibAudio: Prevent overflow in QOA LMS prediction

kleines Filmröllchen 1 年之前
父節點
當前提交
24f5914d18
共有 1 個文件被更改,包括 4 次插入3 次删除
  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 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)
-        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)