Merge INT_MAX % -1 patch to pdfium
Upstream patch at https://crrev.com/772741
Bug: chromium:1086092
Change-Id: Idf9bd87bd833593a48ad4467c347e6623b2f9bb5
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/70131
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/third_party/base/numerics/checked_math_impl.h b/third_party/base/numerics/checked_math_impl.h
index 4d1d80d..3227817 100644
--- a/third_party/base/numerics/checked_math_impl.h
+++ b/third_party/base/numerics/checked_math_impl.h
@@ -252,13 +252,23 @@
using result_type = typename MaxExponentPromotion<T, U>::type;
template <typename V>
static constexpr bool Do(T x, U y, V* result) {
+ if (BASE_NUMERICS_UNLIKELY(!y))
+ return false;
+
using Promotion = typename BigEnoughPromotion<T, U>::type;
- if (BASE_NUMERICS_LIKELY(y)) {
- Promotion presult = static_cast<Promotion>(x) % static_cast<Promotion>(y);
- *result = static_cast<Promotion>(presult);
- return IsValueInRangeForNumericType<V>(presult);
+ if (BASE_NUMERICS_UNLIKELY(
+ (std::is_signed<T>::value && std::is_signed<U>::value &&
+ IsTypeInRangeForNumericType<T, Promotion>::value &&
+ static_cast<Promotion>(x) ==
+ std::numeric_limits<Promotion>::lowest() &&
+ y == static_cast<U>(-1)))) {
+ *result = 0;
+ return true;
}
- return false;
+
+ Promotion presult = static_cast<Promotion>(x) % static_cast<Promotion>(y);
+ *result = static_cast<Promotion>(presult);
+ return IsValueInRangeForNumericType<V>(presult);
}
};