0001-Make-cd_color_get_blackbody_rgb_full-safer.patch
This commit is contained in:
@@ -0,0 +1,67 @@
|
|||||||
|
From 6d7a6ae89bd12640e863a10fc88b6678f9dc9477 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <6d7a6ae89bd12640e863a10fc88b6678f9dc9477.1513518702.git.jan.steffens@gmail.com>
|
||||||
|
From: "Jan Alexander Steffens (heftig)" <jan.steffens@gmail.com>
|
||||||
|
Date: Sat, 16 Dec 2017 04:18:01 +0100
|
||||||
|
Subject: [PATCH] Make cd_color_get_blackbody_rgb_full safer
|
||||||
|
|
||||||
|
Validate arguments. If temp is divisible by 100, avoid interpolation
|
||||||
|
because it accesses beyond the data for temp == 10000.
|
||||||
|
---
|
||||||
|
lib/colord/cd-color.c | 23 +++++++++++++++--------
|
||||||
|
1 file changed, 15 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/colord/cd-color.c b/lib/colord/cd-color.c
|
||||||
|
index 6062595187616846..9960e7ecd247a289 100644
|
||||||
|
--- a/lib/colord/cd-color.c
|
||||||
|
+++ b/lib/colord/cd-color.c
|
||||||
|
@@ -1444,33 +1444,40 @@ cd_color_get_blackbody_rgb_full (gdouble temp,
|
||||||
|
CdColorBlackbodyFlags flags)
|
||||||
|
{
|
||||||
|
gboolean ret = TRUE;
|
||||||
|
- gdouble alpha;
|
||||||
|
- gint temp_index;
|
||||||
|
+ guint temp_quot, temp_rem;
|
||||||
|
const CdColorRGB *blackbody_func = blackbody_data_d65modified;
|
||||||
|
|
||||||
|
+ g_return_val_if_fail (!isnan (temp), FALSE);
|
||||||
|
+ g_return_val_if_fail (result != NULL, FALSE);
|
||||||
|
+
|
||||||
|
/* use modified curve */
|
||||||
|
if (flags & CD_COLOR_BLACKBODY_FLAG_USE_PLANCKIAN)
|
||||||
|
blackbody_func = blackbody_data_d65plankian;
|
||||||
|
|
||||||
|
/* check lower bound */
|
||||||
|
if (temp < 1000) {
|
||||||
|
ret = FALSE;
|
||||||
|
temp = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check upper bound */
|
||||||
|
if (temp > 10000) {
|
||||||
|
ret = FALSE;
|
||||||
|
temp = 10000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* bilinear interpolate the blackbody data */
|
||||||
|
- alpha = ((guint) temp % 100) / 100.0;
|
||||||
|
- temp_index = ((guint) temp - 1000) / 100;
|
||||||
|
- cd_color_rgb_interpolate (&blackbody_func[temp_index],
|
||||||
|
- &blackbody_func[temp_index + 1],
|
||||||
|
- alpha,
|
||||||
|
- result);
|
||||||
|
+ temp_quot = (guint) temp / 100;
|
||||||
|
+ temp_rem = (guint) temp % 100;
|
||||||
|
+
|
||||||
|
+ if (temp_rem == 0)
|
||||||
|
+ *result = blackbody_func[temp_quot - 10];
|
||||||
|
+ else
|
||||||
|
+ cd_color_rgb_interpolate (&blackbody_func[temp_quot - 10],
|
||||||
|
+ &blackbody_func[temp_quot - 9],
|
||||||
|
+ temp_rem / 100.0,
|
||||||
|
+ result);
|
||||||
|
+
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.15.1
|
||||||
Reference in New Issue
Block a user