Skip to content

Commit 488121e

Browse files
MaxGraeydcodeIO
authored andcommitted
Fix TypedArray.wrap bounds checks (#1067)
1 parent 289ddb7 commit 488121e

File tree

4 files changed

+1345
-1299
lines changed

4 files changed

+1345
-1299
lines changed

std/assembly/typedarray.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1734,27 +1734,26 @@ function REVERSE<TArray extends ArrayBufferView, T>(array: TArray): TArray {
17341734
// @ts-ignore: decorator
17351735
@inline
17361736
function WRAP<TArray extends ArrayBufferView, T>(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): TArray {
1737+
var byteLength: i32;
17371738
var bufferByteLength = buffer.byteLength;
1738-
if (<u32>byteOffset >= <u32>bufferByteLength) {
1739+
const mask = sizeof<T>() - 1;
1740+
if (i32(<u32>byteOffset > <u32>bufferByteLength) | (byteOffset & mask)) {
17391741
throw new RangeError(E_INDEXOUTOFRANGE);
17401742
}
1741-
var byteLength: i32;
17421743
if (length < 0) {
17431744
if (length == -1) {
1744-
const mask = <i32>(1 << alignof<T>() - 1);
1745-
if (buffer.byteLength & mask) {
1745+
if (bufferByteLength & mask) {
17461746
throw new RangeError(E_INVALIDLENGTH);
1747-
} else {
1748-
byteLength = buffer.byteLength;
17491747
}
1748+
byteLength = bufferByteLength - byteOffset;
17501749
} else {
17511750
throw new RangeError(E_INVALIDLENGTH);
17521751
}
17531752
} else {
17541753
byteLength = length << alignof<T>();
1755-
}
1756-
if (byteOffset + byteLength > buffer.byteLength) {
1757-
throw new RangeError(E_INVALIDLENGTH);
1754+
if (byteOffset + byteLength > bufferByteLength) {
1755+
throw new RangeError(E_INVALIDLENGTH);
1756+
}
17581757
}
17591758
var out = __alloc(offsetof<TArray>(), idof<TArray>());
17601759
store<usize>(out, __retain(changetype<usize>(buffer)), offsetof<TArray>("buffer"));

0 commit comments

Comments
 (0)