Skip to content

Commit f8f58fd

Browse files
fixup! fix(core): validate start + size for buffer ops in more places
1 parent d282ee3 commit f8f58fd

1 file changed

Lines changed: 23 additions & 7 deletions

File tree

wgpu-core/src/resource.rs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -286,12 +286,20 @@ pub enum BufferAccessError {
286286
min: wgt::BufferAddress,
287287
},
288288
#[error(
289-
"Buffer access out of bounds: last index {index} would overrun the buffer (limit: {max})"
289+
"Buffer access out of bounds: start offset {index} would overrun the buffer (limit: {max})"
290290
)]
291-
OutOfBoundsOverrun {
291+
OutOfBoundsStartOffsetOverrun {
292292
index: wgt::BufferAddress,
293293
max: wgt::BufferAddress,
294294
},
295+
#[error(
296+
"Buffer access out of bounds: start offset {index} + size {size} would overrun the buffer (limit: {max})"
297+
)]
298+
OutOfBoundsEndOffsetOverrun {
299+
index: wgt::BufferAddress,
300+
size: wgt::BufferAddress,
301+
max: wgt::BufferAddress,
302+
},
295303
#[error("Buffer map range start {start} is greater than end {end}")]
296304
NegativeRange {
297305
start: wgt::BufferAddress,
@@ -335,7 +343,8 @@ impl WebGpuError for BufferAccessError {
335343
| Self::UnalignedOffset { .. }
336344
| Self::UnalignedRangeSize { .. }
337345
| Self::OutOfBoundsUnderrun { .. }
338-
| Self::OutOfBoundsOverrun { .. }
346+
| Self::OutOfBoundsStartOffsetOverrun { .. }
347+
| Self::OutOfBoundsEndOffsetOverrun { .. }
339348
| Self::NegativeRange { .. }
340349
| Self::MapAborted
341350
| Self::MapStartOffsetOverrun { .. }
@@ -660,7 +669,7 @@ impl Buffer {
660669
if range.end > self.size {
661670
return Err((
662671
op,
663-
BufferAccessError::OutOfBoundsOverrun {
672+
BufferAccessError::OutOfBoundsStartOffsetOverrun {
664673
index: range.end,
665674
max: self.size,
666675
},
@@ -766,15 +775,22 @@ impl Buffer {
766775
ref range,
767776
..
768777
} => {
778+
if offset > range.end {
779+
return Err(BufferAccessError::OutOfBoundsStartOffsetOverrun {
780+
index: offset,
781+
max: range.end,
782+
});
783+
}
769784
if offset < range.start {
770785
return Err(BufferAccessError::OutOfBoundsUnderrun {
771786
index: offset,
772787
min: range.start,
773788
});
774789
}
775-
if offset + range_size > range.end {
776-
return Err(BufferAccessError::OutOfBoundsOverrun {
777-
index: offset + range_size - 1,
790+
if range_size > offset - range.start {
791+
return Err(BufferAccessError::OutOfBoundsEndOffsetOverrun {
792+
index: offset,
793+
size: range_size,
778794
max: range.end,
779795
});
780796
}

0 commit comments

Comments
 (0)