Skip to content

Commit 1b14f91

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 894d036 commit 1b14f91

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)]
@@ -2191,6 +2202,21 @@ fn set_index_buffer(
21912202
Some(s) => offset + s.get(),
21922203
None => buffer.size,
21932204
};
2205+
2206+
let check_oob = |bound| {
2207+
if bound > buffer.size {
2208+
Err(RenderPassErrorInner::IndirectIndexBufferOverrun {
2209+
begin_offset: offset,
2210+
end_offset: end,
2211+
buffer_size: buffer.size,
2212+
})
2213+
} else {
2214+
Ok(())
2215+
}
2216+
};
2217+
check_oob(offset)?;
2218+
check_oob(end)?;
2219+
21942220
state.index.update_buffer(offset..end, index_format);
21952221

21962222
state

0 commit comments

Comments
 (0)