Skip to content

Commit

Permalink
Catch integer overflows when computing the required array and mip cou…
Browse files Browse the repository at this point in the history
…nts.
  • Loading branch information
nical committed Aug 11, 2022
1 parent 5f976b2 commit d951579
Showing 1 changed file with 25 additions and 10 deletions.
35 changes: 25 additions & 10 deletions wgpu-core/src/device/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -948,8 +948,23 @@ impl<A: HalApi> Device<A> {
},
};

let required_level_count =
desc.range.base_mip_level + desc.range.mip_level_count.map_or(1, |count| count.get());
// Compute the required mip count avoiding overflow.
let mip_level_count = desc.range.mip_level_count.map_or(1, |count| count.get());
let base_mip = desc.range.base_mip_level;
let required_level_count = if std::u32::MAX - base_mip > mip_level_count {
base_mip + mip_level_count
} else {
std::u32::MAX
};

let level_end = texture.full_range.mips.end;
if required_level_count > level_end {
return Err(resource::CreateTextureViewError::TooManyMipLevels {
requested: required_level_count,
total: level_end,
});
};

let array_layer_count = match desc.range.array_layer_count {
Some(count) => count.get(),
None => match view_dim {
Expand All @@ -960,16 +975,16 @@ impl<A: HalApi> Device<A> {
_ => texture.desc.array_layer_count(),
},
};
let required_layer_count = array_layer_count + desc.range.base_array_layer;

let level_end = texture.full_range.mips.end;
// Compute the required layer count avoiding overflow.
let base_layer = desc.range.base_array_layer;
let required_layer_count = if std::u32::MAX - base_layer > array_layer_count {
base_layer + array_layer_count
} else {
std::u32::MAX
};

let layer_end = texture.full_range.layers.end;
if required_level_count > level_end {
return Err(resource::CreateTextureViewError::TooManyMipLevels {
requested: required_level_count,
total: level_end,
});
}
if required_layer_count > layer_end {
return Err(resource::CreateTextureViewError::TooManyArrayLayers {
requested: required_layer_count,
Expand Down

0 comments on commit d951579

Please sign in to comment.