Skip to content

Commit c58d420

Browse files
marcelamelaracmickeyb
authored andcommitted
Fix INTERP mode memory corruption in WAMR
Thanks to @wenyongh for the patch to WawakaInterpreter Signed-off-by: Marcela Melara <[email protected]>
1 parent fe16bb3 commit c58d420

File tree

3 files changed

+89
-11
lines changed

3 files changed

+89
-11
lines changed

build/tests/wawaka/memory-test.json

Lines changed: 83 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,46 +76,63 @@
7676
"expected":"1000"
7777
},
7878
{
79-
"description" : "big value test {KeywordParameters}",
79+
"description" : "big value test 2 KB",
8080
"MethodName": "big_value_test",
8181
"KeywordParameters": {
8282
"num_chars" : 2000
8383
},
8484
"expected": "2000"
8585
},
8686
{
87-
"description" : "big value test {KeywordParameters}",
87+
"description" : "big value test 4 KB",
8888
"MethodName": "big_value_test",
8989
"KeywordParameters": {
9090
"num_chars" : 4000
9191
},
9292
"expected": "4000"
9393
},
9494
{
95-
"description" : "big value test {KeywordParameters}",
95+
"description" : "big value test 8 KB",
9696
"MethodName": "big_value_test",
9797
"KeywordParameters": {
9898
"num_chars" : 8000
9999
},
100100
"expected": "8000"
101101
},
102102
{
103-
"description" : "big value test {KeywordParameters}",
103+
"description" : "big value test 16 KB",
104104
"MethodName": "big_value_test",
105105
"KeywordParameters": {
106106
"num_chars" : 16000
107107
},
108108
"expected": "16000"
109109
},
110110
{
111-
"description" : "big value test 64 KB should {invert} with \"out of memory\" exception",
111+
"description" : "big value test 32 KB",
112+
"MethodName": "big_value_test",
113+
"KeywordParameters": {
114+
"num_chars" : 32000
115+
},
116+
"expected": "32000"
117+
},
118+
{
119+
"description" : "big value test 64 KB should {invert} with WAMR \"out of memory\" exception",
112120
"MethodName": "big_value_test",
113121
"KeywordParameters": {
114122
"num_chars" : 64000
115123
},
116124
"invert": "fail",
117125
"expected": "internal pdo error"
118126
},
127+
{
128+
"description" : "big value test 128 KB should {invert} with WAMR \"out of memory\" exception",
129+
"MethodName": "big_value_test",
130+
"KeywordParameters": {
131+
"num_chars" : 128000
132+
},
133+
"invert": "fail",
134+
"expected": "internal pdo error"
135+
},
119136
{
120137
"description" : "deep recursion test {KeywordParameters}",
121138
"MethodName": "deep_recursion_test",
@@ -125,23 +142,39 @@
125142
"expected":"1000"
126143
},
127144
{
128-
"description" : "big key test {KeywordParameters}",
145+
"description" : "big key test 2 KB",
129146
"MethodName": "big_key_test",
130147
"KeywordParameters": {
131148
"num_chars" : 2000
132149
},
133150
"expected": "2000"
134151
},
135152
{
136-
"description" : "big key test {KeywordParameters}",
153+
"description" : "big key test 4 KB",
137154
"MethodName": "big_key_test",
138155
"KeywordParameters": {
139156
"num_chars" : 4000
140157
},
141158
"expected": "4000"
142159
},
143160
{
144-
"description" : "big key test 32 KB should {invert} with \"out of memory\" exception",
161+
"description" : "big key test 8 KB",
162+
"MethodName": "big_key_test",
163+
"KeywordParameters": {
164+
"num_chars" : 8000
165+
},
166+
"expected": "8000"
167+
},
168+
{
169+
"description" : "big key test 16 KB",
170+
"MethodName": "big_key_test",
171+
"KeywordParameters": {
172+
"num_chars" : 16000
173+
},
174+
"expected": "16000"
175+
},
176+
{
177+
"description" : "big key test 32 KB should {invert} with WAMR \"out of memory\" exception",
145178
"MethodName": "big_key_test",
146179
"KeywordParameters": {
147180
"num_chars" : 32000
@@ -150,7 +183,7 @@
150183
"expected": "internal pdo error"
151184
},
152185
{
153-
"description" : "big key test 64 KB should {invert} with \"out of memory\" exception",
186+
"description" : "big key test 64 KB should {invert} with WAMR \"out of memory\" exception",
154187
"MethodName": "big_key_test",
155188
"KeywordParameters": {
156189
"num_chars" : 64000
@@ -190,6 +223,38 @@
190223
},
191224
"expected": "4000"
192225
},
226+
{
227+
"description" : "many keys test 8K",
228+
"MethodName": "many_keys_test",
229+
"KeywordParameters": {
230+
"num_keys" : 8000
231+
},
232+
"expected": "8000"
233+
},
234+
{
235+
"description" : "many keys test 16K",
236+
"MethodName": "many_keys_test",
237+
"KeywordParameters": {
238+
"num_keys" : 16000
239+
},
240+
"expected": "16000"
241+
},
242+
{
243+
"description" : "many keys test 32K",
244+
"MethodName": "many_keys_test",
245+
"KeywordParameters": {
246+
"num_keys" : 32000
247+
},
248+
"expected": "32000"
249+
},
250+
{
251+
"description" : "many keys test 64K",
252+
"MethodName": "many_keys_test",
253+
"KeywordParameters": {
254+
"num_keys" : 64000
255+
},
256+
"expected": "64000"
257+
},
193258
{
194259
"description" : "deep recursion test {KeywordParameters}",
195260
"MethodName": "deep_recursion_test",
@@ -225,6 +290,15 @@
225290
},
226291
"expected": "100000"
227292
},
293+
{
294+
"description" : "many KV pairs test 1K * 1K",
295+
"MethodName": "many_kv_pairs_test",
296+
"KeywordParameters": {
297+
"num_keys" : 1000,
298+
"num_chars" : 1000
299+
},
300+
"expected": "1000000"
301+
},
228302
{
229303
"description" : "deep recursion test {KeywordParameters}",
230304
"MethodName": "deep_recursion_test",

common/interpreter/wawaka_wasm/WawakaInterpreter.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,10 @@ void WawakaInterpreter::load_contract_code(
142142
const std::string& code)
143143
{
144144
char error_buf[128];
145-
ByteArray binary_code = Base64EncodedStringToByteArray(code);
145+
binary_code_ = Base64EncodedStringToByteArray(code);
146146

147147
SAFE_LOG(PDO_LOG_DEBUG, "initialize the wasm interpreter");
148-
wasm_module = wasm_runtime_load((uint8*)binary_code.data(), binary_code.size(), error_buf, sizeof(error_buf));
148+
wasm_module = wasm_runtime_load((uint8*)binary_code_.data(), binary_code_.size(), error_buf, sizeof(error_buf));
149149
if (wasm_module == NULL)
150150
SAFE_LOG(PDO_LOG_CRITICAL, "load failed with error <%s>", error_buf);
151151

@@ -262,6 +262,9 @@ int32 WawakaInterpreter::evaluate_function(
262262
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
263263
void WawakaInterpreter::Finalize(void)
264264
{
265+
// Clear the code buffer
266+
binary_code_.clear();
267+
265268
// Destroy the environment
266269
if (wasm_exec_env != NULL)
267270
{

common/interpreter/wawaka_wasm/WawakaInterpreter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class WawakaInterpreter : public pc::ContractInterpreter
3838
wasm_module_t wasm_module = NULL;
3939
wasm_module_inst_t wasm_module_inst = NULL;
4040
wasm_exec_env_t wasm_exec_env = NULL;
41+
ByteArray binary_code_;
4142

4243
void parse_response_string(
4344
int32 response_app,

0 commit comments

Comments
 (0)