Skip to content

Commit 44e4c69

Browse files
fix(core): return valid. err. for OOB end in set_index_buffer
Exercised by `webgpu:api,validation,encoding,cmds,render,setIndexBuffer:offset_and_size_oob:*`, which was disovered to be failing in Firefox in [this `webgpu-backlog1` run on a Windows debug build in `try:bed05e732fb557b6173872c508612399b6bc365e`](https://treeherder.mozilla.org/jobs?repo=try&tier=1%2C2%2C3&author=egubler%40mozilla.com&selectedTaskRun=enQluY6MT36HfWG8-NnjAw.0).
1 parent bbff2c4 commit 44e4c69

1 file changed

Lines changed: 26 additions & 0 deletions

File tree

wgpu-core/src/command/render.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,17 @@ pub enum RenderPassErrorInner {
717717
end_count_offset: u64,
718718
count_buffer_size: u64,
719719
},
720+
#[error(
721+
"Requested indirect index buffer bytes {}..{} which overruns indirect buffer of size {}",
722+
begin_offset,
723+
end_offset,
724+
buffer_size
725+
)]
726+
IndirectIndexBufferOverrun {
727+
begin_offset: u64,
728+
end_offset: u64,
729+
buffer_size: u64,
730+
},
720731
#[error("Cannot pop debug group, because number of pushed debug groups is zero")]
721732
InvalidPopDebugGroup,
722733
#[error(transparent)]
@@ -2228,6 +2239,21 @@ fn set_index_buffer(
22282239
Some(s) => offset + s.get(),
22292240
None => buffer.size,
22302241
};
2242+
2243+
let check_oob = |bound| {
2244+
if bound > buffer.size {
2245+
Err(RenderPassErrorInner::IndirectIndexBufferOverrun {
2246+
begin_offset: offset,
2247+
end_offset: end,
2248+
buffer_size: buffer.size,
2249+
})
2250+
} else {
2251+
Ok(())
2252+
}
2253+
};
2254+
check_oob(offset)?;
2255+
check_oob(end)?;
2256+
22312257
state.index.update_buffer(offset..end, index_format);
22322258

22332259
state

0 commit comments

Comments
 (0)