Skip to content

Commit 75caed4

Browse files
authored
Allow wild pointers in zero-sized memcpy with bulkmemory (#22789)
1 parent b8831d3 commit 75caed4

File tree

4 files changed

+20
-1
lines changed

4 files changed

+20
-1
lines changed

system/lib/libc/emscripten_memcpy.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ static void *__memcpy(void *dest, const void *src, size_t n) {
2222
#elif defined(__wasm_bulk_memory__)
2323

2424
static void *__memcpy(void *restrict dest, const void *restrict src, size_t n) {
25-
return _emscripten_memcpy_bulkmem(dest, src, n);
25+
return n ? _emscripten_memcpy_bulkmem(dest, src, n) : dest;
2626
}
2727

2828
#else

test/core/test_memcpy_zero_bytes.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include <stdio.h>
2+
#include <string.h>
3+
4+
#include <emscripten/heap.h>
5+
6+
int main() {
7+
char buf[1024];
8+
void* oob_address = (void*)(emscripten_get_heap_size() + 10);
9+
memcpy(buf, oob_address, 0);
10+
printf("done\n");
11+
}

test/core/test_memcpy_zero_bytes.out

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
done

test/test_core.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2686,6 +2686,13 @@ def test_copyop(self):
26862686
# (llvm-gcc copies items one by one).
26872687
self.do_core_test('test_copyop.cpp')
26882688

2689+
@parameterized({
2690+
'': ([],),
2691+
'bulkmem': (['-mbulk-memory'],),
2692+
})
2693+
def test_memcpy_zero_bytes(self, args):
2694+
self.do_core_test('test_memcpy_zero_bytes.c', emcc_args=['-fno-builtin'] + args)
2695+
26892696
def test_memcpy2(self):
26902697
self.do_core_test('test_memcpy2.c')
26912698

0 commit comments

Comments
 (0)