mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-21 04:49:04 +00:00
fix: coerce memory offsets to unsigned before typed array and DataView access
This commit is contained in:
committed by
Damian Gryski
parent
6682e41ab4
commit
6971b8a69e
@@ -221,6 +221,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
const loadSlice = (array, len, cap) => {
|
const loadSlice = (array, len, cap) => {
|
||||||
|
array >>>= 0;
|
||||||
|
len >>>= 0;
|
||||||
return new Uint8Array(this._inst.exports.memory.buffer, array, len);
|
return new Uint8Array(this._inst.exports.memory.buffer, array, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,6 +235,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
const loadString = (ptr, len) => {
|
const loadString = (ptr, len) => {
|
||||||
|
ptr >>>= 0;
|
||||||
|
len >>>= 0;
|
||||||
return decoder.decode(new DataView(this._inst.exports.memory.buffer, ptr, len));
|
return decoder.decode(new DataView(this._inst.exports.memory.buffer, ptr, len));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,6 +247,9 @@
|
|||||||
wasi_snapshot_preview1: {
|
wasi_snapshot_preview1: {
|
||||||
// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md
|
// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md
|
||||||
fd_write: function(fd, iovs_ptr, iovs_len, nwritten_ptr) {
|
fd_write: function(fd, iovs_ptr, iovs_len, nwritten_ptr) {
|
||||||
|
iovs_ptr >>>= 0;
|
||||||
|
iovs_len >>>= 0;
|
||||||
|
nwritten_ptr >>>= 0;
|
||||||
let nwritten = 0;
|
let nwritten = 0;
|
||||||
if (fd == 1) {
|
if (fd == 1) {
|
||||||
for (let iovs_i=0; iovs_i<iovs_len;iovs_i++) {
|
for (let iovs_i=0; iovs_i<iovs_len;iovs_i++) {
|
||||||
@@ -284,6 +291,8 @@
|
|||||||
throw wasmExit;
|
throw wasmExit;
|
||||||
},
|
},
|
||||||
random_get: (bufPtr, bufLen) => {
|
random_get: (bufPtr, bufLen) => {
|
||||||
|
bufPtr >>>= 0;
|
||||||
|
bufLen >>>= 0;
|
||||||
crypto.getRandomValues(loadSlice(bufPtr, bufLen));
|
crypto.getRandomValues(loadSlice(bufPtr, bufLen));
|
||||||
return 0;
|
return 0;
|
||||||
},
|
},
|
||||||
@@ -426,6 +435,8 @@
|
|||||||
|
|
||||||
// valueLoadString(v ref, b []byte)
|
// valueLoadString(v ref, b []byte)
|
||||||
"syscall/js.valueLoadString": (v_ref, slice_ptr, slice_len, slice_cap) => {
|
"syscall/js.valueLoadString": (v_ref, slice_ptr, slice_len, slice_cap) => {
|
||||||
|
slice_ptr >>>= 0;
|
||||||
|
slice_len >>>= 0;
|
||||||
const str = unboxValue(v_ref);
|
const str = unboxValue(v_ref);
|
||||||
loadSlice(slice_ptr, slice_len, slice_cap).set(str);
|
loadSlice(slice_ptr, slice_len, slice_cap).set(str);
|
||||||
},
|
},
|
||||||
@@ -437,6 +448,9 @@
|
|||||||
|
|
||||||
// func copyBytesToGo(dst []byte, src ref) (int, bool)
|
// func copyBytesToGo(dst []byte, src ref) (int, bool)
|
||||||
"syscall/js.copyBytesToGo": (ret_addr, dest_addr, dest_len, dest_cap, src_ref) => {
|
"syscall/js.copyBytesToGo": (ret_addr, dest_addr, dest_len, dest_cap, src_ref) => {
|
||||||
|
ret_addr >>>= 0;
|
||||||
|
dest_addr >>>= 0;
|
||||||
|
dest_len >>>= 0;
|
||||||
let num_bytes_copied_addr = ret_addr;
|
let num_bytes_copied_addr = ret_addr;
|
||||||
let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
|
let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
|
||||||
|
|
||||||
@@ -456,6 +470,9 @@
|
|||||||
// Originally copied from upstream Go project, then modified:
|
// Originally copied from upstream Go project, then modified:
|
||||||
// https://github.com/golang/go/blob/3f995c3f3b43033013013e6c7ccc93a9b1411ca9/misc/wasm/wasm_exec.js#L404-L416
|
// https://github.com/golang/go/blob/3f995c3f3b43033013013e6c7ccc93a9b1411ca9/misc/wasm/wasm_exec.js#L404-L416
|
||||||
"syscall/js.copyBytesToJS": (ret_addr, dst_ref, src_addr, src_len, src_cap) => {
|
"syscall/js.copyBytesToJS": (ret_addr, dst_ref, src_addr, src_len, src_cap) => {
|
||||||
|
ret_addr >>>= 0;
|
||||||
|
src_addr >>>= 0;
|
||||||
|
src_len >>>= 0;
|
||||||
let num_bytes_copied_addr = ret_addr;
|
let num_bytes_copied_addr = ret_addr;
|
||||||
let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
|
let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user