Skip to content

Commit dc21101

Browse files
authored
Handle foreign results null pointers as non-errors (proxy-wasm#15)
* Handle foreign results null pointers as non-errors if the foreign function returns no results. Signed-off-by: John Plevyak <[email protected]>
1 parent 2e1cfac commit dc21101

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
@@ -231,17 +231,25 @@ Word call_foreign_function(void *raw_context, Word function_name, Word function_
231231
uint64_t address = 0;
232232
void *result = nullptr;
233233
size_t result_size = 0;
234-
auto res = f(wasm, args, [&wasm, &address, &result, &result_size](size_t s) -> void * {
235-
result = wasm.allocMemory(s, &address);
234+
auto res = f(wasm, args, [&wasm, &address, &result, &result_size, results](size_t s) -> void * {
235+
if (results) {
236+
result = wasm.allocMemory(s, &address);
237+
} else {
238+
// If the caller does not want the results, allocate a temporary buffer for them.
239+
result = ::malloc(s);
240+
}
236241
result_size = s;
237242
return result;
238243
});
239-
if (!context->wasmVm()->setWord(results, Word(address))) {
244+
if (results && !context->wasmVm()->setWord(results, Word(address))) {
240245
return WasmResult::InvalidMemoryAccess;
241246
}
242-
if (!context->wasmVm()->setWord(results_size, Word(result_size))) {
247+
if (results_size && !context->wasmVm()->setWord(results_size, Word(result_size))) {
243248
return WasmResult::InvalidMemoryAccess;
244249
}
250+
if (!results) {
251+
::free(result);
252+
}
245253
return res;
246254
}
247255

0 commit comments

Comments
 (0)