diff options
author | Samuel Gaist <[email protected]> | 2025-05-24 21:07:37 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <[email protected]> | 2025-06-27 20:11:10 +0000 |
commit | f4822eec1855231f189e5348dffc29299f6edf93 (patch) | |
tree | d0c73b5d23632b0f60afee18c4b00fdcbe35eff0 | |
parent | c9f841473d64164dbc53f8e00a7129eaf7eede7a (diff) |
Add clamping to QColorTransferGenericFunction
This ensures that the inputs are within range for the use of these
function.
Depending on the values passed, they can trigger FE_INVALID errors
and thus NaN as return values.
This can happen for example when feeding an invalid ICC profile to
QColorSpace::fromIccProfile.
Credit to OSS-Fuzz
Fixes: QTBUG-137159
Pick-to: 6.8 6.5
Change-Id: I435a5768fbb7d3e6cb84d578703e7dde2e39a27e
Reviewed-by: Allan Sandfeld Jensen <[email protected]>
(cherry picked from commit f12d046383decf8f468de62732c9cff7d4303cbf)
Reviewed-by: Qt Cherry-pick Bot <[email protected]>
(cherry picked from commit 8706176f8f78df9bf5cc560fb80aefa3fda01d98)
-rw-r--r-- | src/gui/painting/qcolortransfergeneric_p.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/gui/painting/qcolortransfergeneric_p.h b/src/gui/painting/qcolortransfergeneric_p.h index 6caebceb1a4..c2ebd937a44 100644 --- a/src/gui/painting/qcolortransfergeneric_p.h +++ b/src/gui/painting/qcolortransfergeneric_p.h @@ -65,6 +65,7 @@ private: // HLG from linear [0-12] -> [0-1] static float hlgFromLinear(float x) { + x = std::clamp(x, 0.f, 12.f); if (x > 1.f) return m_hlg_a * std::log(x - m_hlg_b) + m_hlg_c; return std::sqrt(x * 0.25f); @@ -73,6 +74,7 @@ private: // HLG to linear [0-1] -> [0-12] static float hlgToLinear(float x) { + x = std::clamp(x, 0.f, 1.f); if (x < 0.5f) return (x * x) * 4.f; return std::exp((x - m_hlg_c) / m_hlg_a) + m_hlg_b; @@ -86,6 +88,7 @@ private: // PQ to linear [0-1] -> [0-64] static float pqToLinear(float e) { + e = std::clamp(e, 0.f, 1.f); // m2-th root of E' const float eRoot = std::pow(e, 1.f / m_pq_m2); // rational transform @@ -99,6 +102,7 @@ private: // PQ from linear [0-64] -> [0-1] static float pqFromLinear(float fd) { + fd = std::clamp(fd, 0.f, 64.f); // scale Fd to Y const float y = fd * (1.f / m_pq_f); // yRoot = Y^m1 -- "root" because m1 is <1 |