Fix overflow in RenderLayers::iter_layers
(#14264)
# Objective - Fixes overflow when calling `RenderLayers::iter_layers` on layers of the form `k * 64 - 1` - Causes a panic in debug mode, and an infinite iterator in release mode ## Solution - Use `u64::checked_shr` instead of `>>=` ## Testing - Added a test case for this: `render_layer_iter_no_overflow`
This commit is contained in:
parent
524fb01457
commit
728c5b98d4
@ -162,7 +162,7 @@ impl RenderLayers {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let next = buffer.trailing_zeros() + 1;
|
let next = buffer.trailing_zeros() + 1;
|
||||||
buffer >>= next;
|
buffer = buffer.checked_shr(next).unwrap_or(0);
|
||||||
layer += next as usize;
|
layer += next as usize;
|
||||||
Some(layer - 1)
|
Some(layer - 1)
|
||||||
})
|
})
|
||||||
@ -359,4 +359,10 @@ mod rendering_mask_tests {
|
|||||||
let layers = layers.without(77);
|
let layers = layers.without(77);
|
||||||
assert!(layers.0.len() == 1);
|
assert!(layers.0.len() == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn render_layer_iter_no_overflow() {
|
||||||
|
let layers = RenderLayers::from_layers(&[63]);
|
||||||
|
layers.iter().count();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user