Skip to content

Commit f976380

Browse files
committed
wasm2c: Mmap+guard on big-endian won't move memory (fix #2599)
1 parent c17a204 commit f976380

File tree

12 files changed

+95
-67
lines changed

12 files changed

+95
-67
lines changed

src/prebuilt/wasm2c_source_declarations.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ R"w2c_template(// A pointer for an object of size n.
3131
)w2c_template"
3232
R"w2c_template(#if WABT_BIG_ENDIAN
3333
)w2c_template"
34-
R"w2c_template(#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
34+
R"w2c_template(#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
3535
)w2c_template"
3636
R"w2c_template(#else
3737
)w2c_template"
38-
R"w2c_template(#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
38+
R"w2c_template(#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
3939
)w2c_template"
4040
R"w2c_template(#endif
4141
)w2c_template"
@@ -194,7 +194,7 @@ R"w2c_template( if (UNLIKELY(add_overflow(offset, len, &res))) \
194194
)w2c_template"
195195
R"w2c_template( TRAP(OOB); \
196196
)w2c_template"
197-
R"w2c_template( if (UNLIKELY(res > mem->size)) \
197+
R"w2c_template( if (UNLIKELY(res > (mem)->size)) \
198198
)w2c_template"
199199
R"w2c_template( TRAP(OOB); \
200200
)w2c_template"

src/template/wasm2c.declarations.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
// Result:
1616
// A pointer for an object of size n.
1717
#if WABT_BIG_ENDIAN
18-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
18+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
1919
#else
20-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
20+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
2121
#endif
2222

2323
// We can only use Segue for this module if it uses a single unshared imported
@@ -104,7 +104,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
104104
uint64_t res; \
105105
if (UNLIKELY(add_overflow(offset, len, &res))) \
106106
TRAP(OOB); \
107-
if (UNLIKELY(res > mem->size)) \
107+
if (UNLIKELY(res > (mem)->size)) \
108108
TRAP(OOB); \
109109
} while (0);
110110

test/wasm2c/add.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ u32 w2c_test_add(w2c_test*, u32, u32);
8282
// Result:
8383
// A pointer for an object of size n.
8484
#if WABT_BIG_ENDIAN
85-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
85+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
8686
#else
87-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
87+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
8888
#endif
8989

9090
// We can only use Segue for this module if it uses a single unshared imported
@@ -171,7 +171,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
171171
uint64_t res; \
172172
if (UNLIKELY(add_overflow(offset, len, &res))) \
173173
TRAP(OOB); \
174-
if (UNLIKELY(res > mem->size)) \
174+
if (UNLIKELY(res > (mem)->size)) \
175175
TRAP(OOB); \
176176
} while (0);
177177

test/wasm2c/check-imports.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ extern const u32 wasm2c_test_pagesize_env_0x5F_linear_memory;
107107
// Result:
108108
// A pointer for an object of size n.
109109
#if WABT_BIG_ENDIAN
110-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
110+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
111111
#else
112-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
112+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
113113
#endif
114114

115115
// We can only use Segue for this module if it uses a single unshared imported
@@ -196,7 +196,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
196196
uint64_t res; \
197197
if (UNLIKELY(add_overflow(offset, len, &res))) \
198198
TRAP(OOB); \
199-
if (UNLIKELY(res > mem->size)) \
199+
if (UNLIKELY(res > (mem)->size)) \
200200
TRAP(OOB); \
201201
} while (0);
202202

test/wasm2c/export-names.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ void w2c_test_0xE20x9D0xA40xEF0xB80x8F(w2c_test*);
107107
// Result:
108108
// A pointer for an object of size n.
109109
#if WABT_BIG_ENDIAN
110-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
110+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
111111
#else
112-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
112+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
113113
#endif
114114

115115
// We can only use Segue for this module if it uses a single unshared imported
@@ -196,7 +196,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
196196
uint64_t res; \
197197
if (UNLIKELY(add_overflow(offset, len, &res))) \
198198
TRAP(OOB); \
199-
if (UNLIKELY(res > mem->size)) \
199+
if (UNLIKELY(res > (mem)->size)) \
200200
TRAP(OOB); \
201201
} while (0);
202202

test/wasm2c/hello.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@ void w2c_test_0x5Fstart(w2c_test*);
114114
// Result:
115115
// A pointer for an object of size n.
116116
#if WABT_BIG_ENDIAN
117-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
117+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
118118
#else
119-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
119+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
120120
#endif
121121

122122
// We can only use Segue for this module if it uses a single unshared imported
@@ -203,7 +203,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
203203
uint64_t res; \
204204
if (UNLIKELY(add_overflow(offset, len, &res))) \
205205
TRAP(OOB); \
206-
if (UNLIKELY(res > mem->size)) \
206+
if (UNLIKELY(res > (mem)->size)) \
207207
TRAP(OOB); \
208208
} while (0);
209209

test/wasm2c/minimal.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ wasm_rt_func_type_t wasm2c_test_get_func_type(uint32_t param_count, uint32_t res
7676
// Result:
7777
// A pointer for an object of size n.
7878
#if WABT_BIG_ENDIAN
79-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
79+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
8080
#else
81-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
81+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
8282
#endif
8383

8484
// We can only use Segue for this module if it uses a single unshared imported
@@ -165,7 +165,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
165165
uint64_t res; \
166166
if (UNLIKELY(add_overflow(offset, len, &res))) \
167167
TRAP(OOB); \
168-
if (UNLIKELY(res > mem->size)) \
168+
if (UNLIKELY(res > (mem)->size)) \
169169
TRAP(OOB); \
170170
} while (0);
171171

test/wasm2c/tail-calls.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ void wasm_tailcall_w2c_test_tailcaller(void **instance_ptr, void *tail_call_stac
106106
// Result:
107107
// A pointer for an object of size n.
108108
#if WABT_BIG_ENDIAN
109-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
109+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
110110
#else
111-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
111+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
112112
#endif
113113

114114
// We can only use Segue for this module if it uses a single unshared imported
@@ -195,7 +195,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
195195
uint64_t res; \
196196
if (UNLIKELY(add_overflow(offset, len, &res))) \
197197
TRAP(OOB); \
198-
if (UNLIKELY(res > mem->size)) \
198+
if (UNLIKELY(res > (mem)->size)) \
199199
TRAP(OOB); \
200200
} while (0);
201201

wasm2c/benchmarks/dhrystone/main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ typedef uint32_t u32;
1818
typedef uint64_t u64;
1919

2020
#if WABT_BIG_ENDIAN
21-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
21+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
2222
#else
23-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
23+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
2424
#endif
2525

2626
#define MEM_ADDR_MEMOP(mem, addr, n) MEM_ADDR(mem, addr, n)

wasm2c/examples/fac/fac.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@
3434
// Result:
3535
// A pointer for an object of size n.
3636
#if WABT_BIG_ENDIAN
37-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
37+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
3838
#else
39-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
39+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
4040
#endif
4141

4242
// We can only use Segue for this module if it uses a single unshared imported
@@ -123,7 +123,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
123123
uint64_t res; \
124124
if (UNLIKELY(add_overflow(offset, len, &res))) \
125125
TRAP(OOB); \
126-
if (UNLIKELY(res > mem->size)) \
126+
if (UNLIKELY(res > (mem)->size)) \
127127
TRAP(OOB); \
128128
} while (0);
129129

0 commit comments

Comments
 (0)