Skip to content

Commit 33b2e75

Browse files
authored
Don't overread buffers. (#303)
While there, make sure to write a return pointer and length when returning an empty buffer. Reported by Chris Ertl from Google Security. Signed-off-by: Piotr Sikora <[email protected]>
1 parent c3c1a8f commit 33b2e75

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

src/exports.cc

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -485,13 +485,21 @@ Word get_buffer_bytes(Word type, Word start, Word length, Word ptr_ptr, Word siz
485485
return WasmResult::BadArgument;
486486
}
487487
// Don't overread.
488-
if (start + length > buffer->size()) {
488+
if (start > buffer->size()) {
489+
length = 0;
490+
} else if (start + length > buffer->size()) {
489491
length = buffer->size() - start;
490492
}
491-
if (length > 0) {
492-
return buffer->copyTo(context->wasm(), start, length, ptr_ptr, size_ptr);
493+
if (length == 0) {
494+
if (!context->wasmVm()->setWord(ptr_ptr, Word(0))) {
495+
return WasmResult::InvalidMemoryAccess;
496+
}
497+
if (!context->wasmVm()->setWord(size_ptr, Word(0))) {
498+
return WasmResult::InvalidMemoryAccess;
499+
}
500+
return WasmResult::Ok;
493501
}
494-
return WasmResult::Ok;
502+
return buffer->copyTo(context->wasm(), start, length, ptr_ptr, size_ptr);
495503
}
496504

497505
Word get_buffer_status(Word type, Word length_ptr, Word flags_ptr) {

0 commit comments

Comments
 (0)