Skip to content

Commit e67b546

Browse files
wavm: fix function export bug. (#200)
Signed-off-by: chaoqin-li1123 <[email protected]>
1 parent 9699b32 commit e67b546

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

src/wavm/wavm.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,8 +443,10 @@ void getFunctionWavm(WasmVm *vm, std::string_view function_name,
443443
return;
444444
}
445445
if (!checkFunctionType(f, inferStdFunctionType(function))) {
446+
*function = nullptr;
446447
wavm->fail(FailState::UnableToInitializeCode,
447448
"Bad function signature for: " + std::string(function_name));
449+
return;
448450
}
449451
*function = [wavm, f, function_name](ContextBase *context, Args... args) -> R {
450452
WasmUntaggedValue values[] = {args...};
@@ -473,8 +475,10 @@ void getFunctionWavm(WasmVm *vm, std::string_view function_name,
473475
return;
474476
}
475477
if (!checkFunctionType(f, inferStdFunctionType(function))) {
478+
*function = nullptr;
476479
wavm->fail(FailState::UnableToInitializeCode,
477480
"Bad function signature for: " + std::string(function_name));
481+
return;
478482
}
479483
*function = [wavm, f, function_name](ContextBase *context, Args... args) {
480484
WasmUntaggedValue values[] = {args...};

test/runtime_test.cc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,35 @@ TEST_P(TestVM, StraceLogLevel) {
171171
EXPECT_NE(integration->trace_message_, "");
172172
}
173173

174+
TEST_P(TestVM, BadExportFunction) {
175+
auto source = readTestWasmFile("callback.wasm");
176+
ASSERT_TRUE(vm_->load(source, {}, {}));
177+
178+
TestContext context;
179+
vm_->registerCallback(
180+
"env", "callback", &callback,
181+
&ConvertFunctionWordToUint32<decltype(callback), callback>::convertFunctionWordToUint32);
182+
vm_->registerCallback(
183+
"env", "callback2", &callback2,
184+
&ConvertFunctionWordToUint32<decltype(callback2), callback2>::convertFunctionWordToUint32);
185+
ASSERT_TRUE(vm_->link(""));
186+
187+
WasmCallVoid<0> run;
188+
vm_->getFunction("non-existent", &run);
189+
EXPECT_TRUE(run == nullptr);
190+
191+
WasmCallWord<2> bad_signature_run;
192+
vm_->getFunction("run", &bad_signature_run);
193+
EXPECT_TRUE(bad_signature_run == nullptr);
194+
195+
vm_->getFunction("run", &run);
196+
EXPECT_TRUE(run != nullptr);
197+
for (auto i = 0; i < 100; i++) {
198+
run(&context);
199+
}
200+
ASSERT_EQ(context.counter, 100);
201+
}
202+
174203
TEST_P(TestVM, Callback) {
175204
auto source = readTestWasmFile("callback.wasm");
176205
ASSERT_TRUE(vm_->load(source, {}, {}));

0 commit comments

Comments
 (0)