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:
Alix Bott 2024-07-15 17:50:36 +02:00 committed by GitHub
parent ab255aefc6
commit a79df7b124
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -162,7 +162,7 @@ impl RenderLayers {
return None;
}
let next = buffer.trailing_zeros() + 1;
buffer >>= next;
buffer = buffer.checked_shr(next).unwrap_or(0);
layer += next as usize;
Some(layer - 1)
})
@ -359,4 +359,10 @@ mod rendering_mask_tests {
let layers = layers.without(77);
assert!(layers.0.len() == 1);
}
#[test]
fn render_layer_iter_no_overflow() {
let layers = RenderLayers::from_layers(&[63]);
layers.iter().count();
}
}