Skip to content

Commit b8d408f

Browse files
committed
Avoid panicking bounds check in lut_interp_linear_float
1 parent 8840161 commit b8d408f

File tree

2 files changed

+60
-30
lines changed

2 files changed

+60
-30
lines changed

src/chain.rs

Lines changed: 53 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -261,19 +261,34 @@ impl ModularTransform for Clut3x3 {
261261
.unwrap_or_else(unlikely_default)
262262
};
263263

264-
let input_clut_table_r = self.input_clut_table[0].as_ref().unwrap();
265-
let input_clut_table_g = self.input_clut_table[1].as_ref().unwrap();
266-
let input_clut_table_b = self.input_clut_table[2].as_ref().unwrap();
267-
let output_clut_table_r = self.output_clut_table[0].as_ref().unwrap();
268-
let output_clut_table_g = self.output_clut_table[1].as_ref().unwrap();
269-
let output_clut_table_b = self.output_clut_table[2].as_ref().unwrap();
264+
let input_clut_table_r = self.input_clut_table[0].as_ref().unwrap().as_slice();
265+
let input_clut_table_g = self.input_clut_table[1].as_ref().unwrap().as_slice();
266+
let input_clut_table_b = self.input_clut_table[2].as_ref().unwrap().as_slice();
267+
268+
// num_output_table_entries is checked to be in this range
269+
assert!(
270+
(2..4096).contains(&input_clut_table_r.len())
271+
&& input_clut_table_r.len() == input_clut_table_g.len()
272+
&& input_clut_table_r.len() == input_clut_table_b.len()
273+
);
274+
275+
let output_clut_table_r = self.output_clut_table[0].as_ref().unwrap().as_slice();
276+
let output_clut_table_g = self.output_clut_table[1].as_ref().unwrap().as_slice();
277+
let output_clut_table_b = self.output_clut_table[2].as_ref().unwrap().as_slice();
278+
279+
assert!(
280+
(2..4096).contains(&output_clut_table_r.len())
281+
&& output_clut_table_r.len() == output_clut_table_g.len()
282+
&& output_clut_table_r.len() == output_clut_table_b.len()
283+
);
284+
270285
for (dest, src) in dest.chunks_exact_mut(3).zip(src.chunks_exact(3)) {
271286
let device_r = src[0];
272287
let device_g = src[1];
273288
let device_b = src[2];
274-
let linear_r = lut_interp_linear_float(device_r, &input_clut_table_r);
275-
let linear_g = lut_interp_linear_float(device_g, &input_clut_table_g);
276-
let linear_b = lut_interp_linear_float(device_b, &input_clut_table_b);
289+
let linear_r = lut_interp_linear_float(device_r, input_clut_table_r);
290+
let linear_g = lut_interp_linear_float(device_g, input_clut_table_g);
291+
let linear_b = lut_interp_linear_float(device_b, input_clut_table_b);
277292
let x = (linear_r * grid_max).floor() as u32;
278293
let y = (linear_g * grid_max).floor() as u32;
279294
let z = (linear_b * grid_max).floor() as u32;
@@ -345,18 +360,33 @@ impl ModularTransform for Clut4x3 {
345360
.unwrap_or_else(unlikely_default)
346361
};
347362

348-
let input_clut_table_0 = self.input_clut_table[0].as_ref().unwrap();
349-
let input_clut_table_1 = self.input_clut_table[1].as_ref().unwrap();
350-
let input_clut_table_2 = self.input_clut_table[2].as_ref().unwrap();
351-
let input_clut_table_3 = self.input_clut_table[3].as_ref().unwrap();
352-
let output_clut_table_r = &self.output_clut_table[0].as_ref().unwrap();
353-
let output_clut_table_g = &self.output_clut_table[1].as_ref().unwrap();
354-
let output_clut_table_b = &self.output_clut_table[2].as_ref().unwrap();
363+
let input_clut_table_0 = self.input_clut_table[0].as_ref().unwrap().as_slice();
364+
let input_clut_table_1 = self.input_clut_table[1].as_ref().unwrap().as_slice();
365+
let input_clut_table_2 = self.input_clut_table[2].as_ref().unwrap().as_slice();
366+
let input_clut_table_3 = self.input_clut_table[3].as_ref().unwrap().as_slice();
367+
368+
assert!(
369+
(2..4096).contains(&input_clut_table_0.len())
370+
&& input_clut_table_0.len() == input_clut_table_1.len()
371+
&& input_clut_table_0.len() == input_clut_table_2.len()
372+
&& input_clut_table_0.len() == input_clut_table_3.len()
373+
);
374+
375+
let output_clut_table_r = self.output_clut_table[0].as_ref().unwrap().as_slice();
376+
let output_clut_table_g = self.output_clut_table[1].as_ref().unwrap().as_slice();
377+
let output_clut_table_b = self.output_clut_table[2].as_ref().unwrap().as_slice();
378+
379+
assert!(
380+
(2..4096).contains(&output_clut_table_r.len())
381+
&& output_clut_table_r.len() == output_clut_table_g.len()
382+
&& output_clut_table_r.len() == output_clut_table_b.len()
383+
);
384+
355385
for (dest, src) in dest.chunks_exact_mut(3).zip(src.chunks_exact(4)) {
356-
let linear_x = lut_interp_linear_float(src[0], &input_clut_table_0);
357-
let linear_y = lut_interp_linear_float(src[1], &input_clut_table_1);
358-
let linear_z = lut_interp_linear_float(src[2], &input_clut_table_2);
359-
let linear_w = lut_interp_linear_float(src[3], &input_clut_table_3);
386+
let linear_x = lut_interp_linear_float(src[0], input_clut_table_0);
387+
let linear_y = lut_interp_linear_float(src[1], input_clut_table_1);
388+
let linear_z = lut_interp_linear_float(src[2], input_clut_table_2);
389+
let linear_w = lut_interp_linear_float(src[3], input_clut_table_3);
360390

361391
let x = (linear_x * grid_max).floor() as u32;
362392
let y = (linear_y * grid_max).floor() as u32;
@@ -578,9 +608,9 @@ impl ModularTransform for GammaTable {
578608
let in_r = src[0];
579609
let in_g = src[1];
580610
let in_b = src[2];
581-
out_r = lut_interp_linear_float(in_r, &input_clut_table_r[..]);
582-
out_g = lut_interp_linear_float(in_g, &input_clut_table_g[..]);
583-
out_b = lut_interp_linear_float(in_b, &input_clut_table_b[..]);
611+
out_r = lut_interp_linear_float(in_r, input_clut_table_r);
612+
out_g = lut_interp_linear_float(in_g, input_clut_table_g);
613+
out_b = lut_interp_linear_float(in_b, input_clut_table_b);
584614

585615
dest[0] = clamp_float(out_r);
586616
dest[1] = clamp_float(out_g);

src/transform_util.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,16 @@ fn lut_interp_linear_precache_output(input_value: u32, table: &[u16]) -> u8 {
114114
}
115115
/* value must be a value between 0 and 1 */
116116
//XXX: is the above a good restriction to have?
117+
#[inline]
117118
pub fn lut_interp_linear_float(mut value: f32, table: &[f32]) -> f32 {
118-
value *= (table.len() - 1) as f32;
119+
let max_val = table.len() - 1;
120+
value *= max_val as f32;
119121

120-
let upper: i32 = value.ceil() as i32;
121-
let lower: i32 = value.floor() as i32;
122+
let upper = value.ceil();
123+
let lower = value.floor();
122124
//XXX: can we be more performant here?
123-
value = (table[upper as usize] as f64 * (1.0f64 - (upper as f32 - value) as f64)
124-
+ (table[lower as usize] * (upper as f32 - value)) as f64) as f32;
125-
/* scale the value */
126-
value
125+
(table[max_val.min(upper as usize)] as f64 * (1.0 - (upper - value) as f64)
126+
+ (table[max_val.min(lower as usize)] * (upper - value)) as f64) as f32
127127
}
128128

129129
fn compute_curve_gamma_table_type1(gamma_table: &mut [f32; 256], gamma: u16) {

0 commit comments

Comments
 (0)