Skip to content

Fix setjmp/longjmp table matching to survive raw jmp_buf save/restore#1297

Open
qianxichen233 wants to merge 2 commits into
mainfrom
fix-setjmp-buf
Open

Fix setjmp/longjmp table matching to survive raw jmp_buf save/restore#1297
qianxichen233 wants to merge 2 commits into
mainfrom
fix-setjmp-buf

Conversation

@qianxichen233

Copy link
Copy Markdown
Contributor

buf[0] previously stored the jmp_buf's own fixed address as the key testSetjmp matches against. For a jmp_buf that lives in a long-lived buffer and gets saved/restored as raw bytes by an unwind-protect-style helper (memcpy(&saved, &buf, sizeof(buf)) and back), the address never changes, so every registration on that buffer was indistinguishable. A caller that restores an older snapshot before re-throwing therefore kept matching its own already-fired registration, causing an unbounded catch/rethrow loop that silently exhausted the null-collected GC heap.

Replace the address-based key with a fresh per-call monotonic token stored in buf[0], and stop clearing matched table entries (which broke legitimate repeated longjmps to a still-live buffer with no intervening setjmp). Tokens make raw byte restoration meaningful again: an outer, still-live registration's token correctly falls through the inner frame's table and resolves in the outer frame's own table, matching native register/stack snapshot restoration semantics.

buf[0] previously stored the jmp_buf's own fixed address as the key
testSetjmp matches against. For a jmp_buf that lives in a long-lived
buffer and gets saved/restored as raw bytes by an unwind-protect-style
helper (memcpy(&saved, &buf, sizeof(buf)) and back), the address never
changes, so every registration on that buffer was indistinguishable.
A caller that restores an older snapshot before re-throwing therefore
kept matching its own already-fired registration, causing an unbounded
catch/rethrow loop that silently exhausted the null-collected GC heap.

Replace the address-based key with a fresh per-call monotonic token
stored in buf[0], and stop clearing matched table entries (which broke
legitimate repeated longjmps to a still-live buffer with no intervening
setjmp). Tokens make raw byte restoration meaningful again: an outer,
still-live registration's token correctly falls through the inner
frame's table and resolves in the outer frame's own table, matching
native register/stack snapshot restoration semantics.
@Yaxuan-w

Yaxuan-w commented Jul 5, 2026

Copy link
Copy Markdown
Member

Can you trigger another ci run?

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

End-to-End Test Report

Test Preview
grate harness

Grate Test Report

MetricValue
Total15
Success15
Failures0
Compile Failures0
Runtime Failures0
Timeout Failures0
Missing Pair Failures0

Cases

TestStatusError TypeOutput
concurrent-request/geteuid_grate.cSuccess
STDOUT:
[Grate|geteuid] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 3
[Cage | geteuid] PASS: 1000000 calls returned 10
[Grate|geteuid] PASS

STDERR:

concurrent-request/race-test_grate.cSuccess
STDOUT:
pass

STDERR:

concurrent-request/thread_race_grate.cSuccess
STDOUT:
[thread_race] Registering handler for cage 2 in grate 1 with fn ptr addr: 3
[thread_race] PASS: 20 threads x 100000 calls returned 10
[thread_race] PASS

STDERR:

copy-data-between-cages/cp-stncpy_grate.cSuccess
STDOUT:
[cage] pathname addr=0xfffb6ff9
[cage] pathname='random'
[Grate|open] intercepts open call: thiscage=1, arg1cage=2
[Grate|open] copied pathname: random
[cage] fd=10

STDERR:

copy-data-between-cages/cpdata_grate.cSuccess
STDOUT:
[Grate|open] intercepts open call: thiscage=1, arg1cage=2
[Grate|open] copied pathname: random
[cage] fd=10

STDERR:

interposing-calls/fork-with-newret_grate.cSuccess
STDOUT:
[Grate|interpose-fork] Registering fork handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|interpose-fork] Handling function ptr: 3 from cage: 1
[Grate|interpose-fork] In fork_grate 1 handler for cage: 1
[Cage] Forked process with PID: 10
[Grate|interpose-fork] PASS

STDERR:

interposing-calls/interpose-exec_grate.cSuccess
STDOUT:
[Grate|interpose-exec] Registering exec handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|interpose-exec] Handling function ptr: 3 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
[Grate|interpose-exec] Handling function ptr: 3 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
Exec successful, argv[1]: --execd
[Grate|interpose-exec] PASS

STDERR:

interposing-calls/interpose-exit_grate.cSuccess
STDOUT:
[Grate|interpose-exit] Registering exit handler for cage 2 in grate 1 with fn ptr addr: 3
Exiting...

[Grate|interpose-exit] PASS

STDERR:

interposing-calls/interpose-fork_grate.cSuccess
STDOUT:
[Grate|interpose-fork] Registering fork handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|interpose-fork] Handling function ptr: 3 from cage: 1
[Grate|interpose-fork] In fork_grate 1 handler for cage: 1
[Grate|interpose-fork] PASS

STDERR:

interposing-calls/interpose-mmap_grate.cSuccess
STDOUT:
[Grate|interpose-mmap] Registering mmap handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|interpose-mmap] Handling function ptr: 3 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
[Grate|interpose-mmap] Handling function ptr: 3 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
[Grate|interpose-mmap] Handling function ptr: 3 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
[Grate|interpose-mmap] Handling function ptr: 3 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
[Grate|interpose-mmap] Handling function ptr: 3 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
mmap test: PASS
[Grate|interpose-mmap] PASS

STDERR:

interposing-calls/interpose-register_grate.cSuccess
STDOUT:
[Grate|interpose-register] Registering register_handler for cage 2 in grate 1 with fn ptr addr: 4
[cage] registering 107. grateid: 2 cageid: 3
[Grate|interpose-register] Handling function ptr: 4 from cage: 1
[Grate|interpose-register] In register_grate 1 handler for cage: 1
[Grate|geteuid] Registering geteuid handler for cage 1 in grate 1 with fn ptr addr: 3
[Grate|interpose-register] Handling function ptr: 3 from cage: 1
[Grate|interpose-register] In register_grate 1 handler for cage: 1
[Grate|interpose-register] PASS

STDERR:

multi-register_grate.cSuccess
STDOUT:
[Grate|multi-register_grate] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 4
[Grate|multi-register_grate] Registering getuid handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|multi-register_grate] Handling function ptr: 4 from cage: 1
[Grate|multi-register_grate] In multi-register_grate 1 handler for cage: 1
[Grate|multi-register_grate] Handling function ptr: 3 from cage: 1
[Grate|multi-register_grate] In multi-register_grate 1 handler for cage: 1
[Cage | multi-register] PASS: geteuid=10, getuid=20
[Grate|multi-register] PASS

STDERR:

simple-tests/copy-handler-table_grate.cSuccess
STDOUT:
[Grate|copy-handler-table] Registering geteuid handler for cage 2 in grate 1
[Grate|copy-handler-table] geteuid handler invoked for cage 1
[Grate|copy-handler-table] geteuid handler invoked for cage 1
[Cage|copy-handler-table] PASS: child inherited handler, then overwrite changed geteuid to 0
[Cage|copy-handler-table] PASS: parent=123 child_exit=0
[Grate|copy-handler-table] PASS

STDERR:

simple-tests/diff-cage-args_grate.cSuccess
STDOUT:
[Grate|diff-cage-args] Handling function ptr: 3 from cage: 1
[Grate|diff-cage-args] In open_grate 1 handler for cage: 1
Hello world. FD=-1
[Grate|diff-cage-args] Handling function ptr: 4 from cage: 1
Goodbye world! ret=4321 buf=helloworld
[Grate|diff-cage-args] PASS

STDERR:

simple-tests/geteuid_grate.cSuccess
STDOUT:
[Grate|geteuid] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|geteuid] Handling function ptr: 3 from cage: 1
[Grate|geteuid] In geteuid_grate 1 handler for cage: 1
[Cage | geteuid] PASS: geteuid ret = 10
[Grate|geteuid] PASS

STDERR:

static harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases3
Number of Successes3
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Static Tests
fork_simple.cSuccessNone0.050783s4.067935s
Success
thread.cSuccessNone0.043881s4.093833s
Success
tls_test.cSuccessNone0.045235s4.104303s
Success

Fail Tests

Summary

MetricCount
Total Test Cases0
Number of Successes0
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0
wasm harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases234
Number of Successes234
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Dylink Tests
basic.cSuccessNone0.043090s0.101842s
Success
dlopen_fork.cSuccessNone0.042175s0.136660s
Success
dlopen_thread.cSuccessNone0.043089s0.133945s
Success
double_fork_dlopen.cSuccessNone0.045116s0.178990s
Success
fork_dlopen.cSuccessNone0.043232s0.133820s
Success
longjmp_dlopen.cSuccessNone0.039782s0.119260s
Success
rdynamic_main.cSuccessNone0.042769s0.124607s
Success
File Tests
chartests.cSuccessNone0.040548s0.136371s
Success
chdir_getcwd.cSuccessNone0.042269s0.106104s
Success
chmod.cSuccessNone0.044905s0.114039s
Success
clock_gettime_highlevel.cSuccessNone0.284852s0.180656s
Success
clock_gettime_simple.cSuccessNone0.036398s0.101768s
Success
cloexec.cSuccessNone0.043541s0.125597s
Success
close.cSuccessNone0.058678s0.119637s
Success
copy_file_range.cSuccessNone0.044818s0.124712s
Success
creat_access.cSuccessNone0.043176s0.110529s
Success
doubleclose.cSuccessNone0.037598s0.087965s
Success
dup.cSuccessNone0.037973s0.102191s
Success
dup2.cSuccessNone0.041540s0.100314s
Success
dup3.cSuccessNone0.042239s0.104303s
Success
dupwrite.cSuccessNone0.044186s0.113667s
Success
etc_conf.cSuccessNone0.039131s0.105423s
Success
faccessat.cSuccessNone0.041949s0.106405s
Success
fchdir.cSuccessNone0.046787s0.116913s
Success
fchmod.cSuccessNone0.045387s0.123842s
Success
fchmodat.cSuccessNone0.041778s0.110246s
Success
fcntl.cSuccessNone0.042994s0.125838s
Success
fcntl_dupfd.cSuccessNone0.037814s0.097416s
Success
fdatasync.cSuccessNone0.041803s0.108645s
Success
filetest.cSuccessNone0.042567s0.099103s
Success
filetest1000.cSuccessNone0.048436s0.118677s
Success
flock.cSuccessNone0.050132s0.159804s
Success
fstat.cSuccessNone0.043835s0.114424s
Success
fstatfs.cSuccessNone0.038553s0.104921s
Success
fsync.cSuccessNone0.042764s0.100660s
Success
ftruncate.cSuccessNone0.046759s0.193645s
Success
getcwd.cSuccessNone0.040631s0.101830s
Success
getcwd_null.cSuccessNone0.044456s0.110363s
Success
getpgid.cSuccessNone0.039786s0.094217s
Success
getrandom.cSuccessNone0.042638s0.119126s
Success
ioctl.cSuccessNone0.045350s0.107944s
Success
link.cSuccessNone0.046515s0.142888s
Success
locale_test.cSuccessNone0.054209s0.295931s
Success
lseek.cSuccessNone0.046407s0.171902s
Success
lstat.cSuccessNone0.048950s0.132460s
Success
mkdir_rmdir.cSuccessNone0.044604s0.111459s
Success
mkfifo_test.cSuccessNone0.048624s0.156889s
Success
mknod.cSuccessNone0.042458s0.110611s
Success
nocancel_io.cSuccessNone0.049761s0.126356s
Success
open.cSuccessNone0.039418s0.101041s
Success
openat.cSuccessNone0.041027s0.104535s
Success
path_conversion_safety.cSuccessNone0.047525s0.123654s
Success
ppoll.cSuccessNone0.047196s0.115916s
Success
pread_pwrite.cSuccessNone0.042446s0.127969s
Success
preadv_pwritev.cSuccessNone0.046726s0.126664s
Success
printf.cSuccessNone0.038640s0.095805s
Success
prlimit64.cSuccessNone0.040840s0.098829s
Success
read.cSuccessNone0.044514s0.127701s
Success
readbytes.cSuccessNone0.042296s0.096504s
Success
readdir_basic.cSuccessNone0.047173s0.135584s
Success
readlink.cSuccessNone0.045985s0.117176s
Success
readlinkat.cSuccessNone0.045712s0.112079s
Success
readv_writev_test.cSuccessNone0.044663s0.114704s
Success
rename.cSuccessNone0.046795s0.112254s
Success
renameat.cSuccessNone0.044099s0.121281s
Success
sc-writev.cSuccessNone0.044988s0.104780s
Success
stat.cSuccessNone0.044279s0.112973s
Success
statfs.cSuccessNone0.040922s0.097943s
Success
symlink.cSuccessNone0.045463s0.132422s
Success
sync_file_range.cSuccessNone0.043848s0.107952s
Success
timespec_time_t_compat.cSuccessNone0.043596s0.098523s
Success
trailing_slash.cSuccessNone0.043227s0.107623s
Success
truncate.cSuccessNone0.044202s0.121805s
Success
unlink.cSuccessNone0.047817s0.146582s
Success
unlinkat.cSuccessNone0.045664s0.120476s
Success
utimensat.cSuccessNone0.044459s0.127819s
Success
write.cSuccessNone0.037848s0.096010s
Success
writeloop.cSuccessNone0.045917s0.106163s
Success
writepartial.cSuccessNone0.045777s0.107538s
Success
writev.cSuccessNone0.046591s0.111367s
Success
Math Tests
math_link_smoke.cSuccessNone0.050090s0.095206s
Success
math_tests.cSuccessNone0.050650s0.126324s
Success
printf_float.cSuccessNone0.047549s0.126117s
Success
Memory Tests
brk.cSuccessNone0.042308s0.101313s
Success
fork_large_memory.cSuccessNone0.070533s0.426327s
Success
malloc.cSuccessNone0.042049s0.104630s
Success
malloc_large.cSuccessNone0.041071s0.091518s
Success
memcpy.cSuccessNone0.042458s0.095967s
Success
memory_error_test.cSuccessNone0.045607s0.128940s
Success
mmap.cSuccessNone0.038326s0.098724s
Success
mmap_address_truncation.cSuccessNone0.037363s0.097062s
Success
mmap_aligned.cSuccessNone0.038543s0.104345s
Success
mmap_complicated.cSuccessNone0.045301s0.129992s
Success
mmap_file.cSuccessNone0.043989s0.111463s
Success
mmap_shared.cSuccessNone0.042126s0.123682s
Success
mmaptest.cSuccessNone0.040137s0.097840s
Success
mprotect.cSuccessNone0.040919s0.097460s
Success
mprotect_boundary.cSuccessNone0.039139s0.103815s
Success
mprotect_end_region.cSuccessNone0.039285s0.104480s
Success
mprotect_middle_region.cSuccessNone0.039824s0.105583s
Success
mprotect_multiple_times.cSuccessNone0.036671s0.102739s
Success
mprotect_same_value.cSuccessNone0.038943s0.103733s
Success
mprotect_spanning_regions.cSuccessNone0.042119s0.124403s
Success
munmap_adjacent_shm.cSuccessNone0.041045s0.116930s
Success
sbrk.cSuccessNone0.039713s0.095557s
Success
segfault.cSuccessNone0.045995s0.138996s
Success
shm.cSuccessNone0.044240s0.130982s
Success
shmtest.cSuccessNone0.042321s0.101235s
Success
thread_malloc_sequential.cSuccessNone0.044999s0.170480s
Success
vtable.cSuccessNone0.049326s0.109828s
Success
Networking Tests
accept4.cSuccessNone0.046978s0.119091s
Success
dns_resolve_test.cSuccessNone0.087264s0.213607s
Success
dnstest.cSuccessNone0.047612s0.109563s
Success
epoll_badfd.cSuccessNone0.040056s0.096679s
Success
epoll_edge_triggered.cSuccessNone0.209992s0.391852s
Success
epollcreate1.cSuccessNone0.045852s0.116139s
Success
error_handling_net.cSuccessNone0.065882s0.200840s
Success
getaddrinfo_test.cSuccessNone0.063921s0.268512s
Success
getaddrinfo_unspec.cSuccessNone0.092548s0.158098s
Success
gethostname.cSuccessNone0.041460s0.101768s
Success
getifaddrs.cSuccessNone0.049135s0.142670s
Success
getsockname.cSuccessNone0.047819s0.118585s
Success
getsockopt.cSuccessNone0.046606s0.140111s
Success
ipv6_basic.cSuccessNone0.049120s0.140455s
Success
makepipe.cSuccessNone0.040275s0.100394s
Success
nonblocking_eagain.cSuccessNone0.050651s0.176238s
Success
pipe.cSuccessNone0.054413s0.149340s
Success
pipe2.cSuccessNone0.093264s0.184662s
Success
pipeinput.cSuccessNone0.073977s0.280404s
Success
pipeinput2.cSuccessNone0.049451s0.156774s
Success
pipeonestring.cSuccessNone0.046841s0.148684s
Success
pipepong.cSuccessNone0.046193s0.155261s
Success
pipewrite.cSuccessNone0.043631s0.125228s
Success
poll.cSuccessNone0.045848s0.102701s
Success
recvfrom-sendto.cSuccessNone0.047329s0.115099s
Success
sendmsg_recvmsg_test.cSuccessNone0.051491s0.124603s
Success
serverclient.cSuccessNone0.048860s0.124138s
Success
shutdown.cSuccessNone0.049552s0.123210s
Success
shutdown_fork.cSuccessNone0.045753s0.129922s
Success
simple-select.cSuccessNone0.052922s0.151816s
Success
simple_epoll.cSuccessNone0.046644s0.123104s
Success
socket.cSuccessNone0.045263s0.113419s
Success
socket_cloexec.cSuccessNone0.062158s0.117036s
Success
socket_options_advanced.cSuccessNone0.098142s0.277190s
Success
socketepoll.cSuccessNone0.044056s0.103063s
Success
socketpair.cSuccessNone0.070912s0.286234s
Success
socketselect.cSuccessNone0.043716s0.109966s
Success
udp_send_recv.cSuccessNone0.152213s0.286973s
Success
uds-getsockname.cSuccessNone0.047342s0.109032s
Success
uds-nb-select.cSuccessNone2.052074s2.191637s
Success
uds-serverclient.cSuccessNone0.051809s0.170627s
Success
uds-socketselect.cSuccessNone0.046363s0.113097s
Success
uds_listen_poll.cSuccessNone1.068980s1.158176s
Success
writev_socket.cSuccessNone0.047203s0.144270s
Success
Process Tests
barrier_test.cSuccessNone0.044582s0.128587s
Success
chain_thread.cSuccessNone1.045220s1.132301s
Success
ctor_syscall_test.cSuccessNone0.035878s0.090078s
Success
cxa_atexit_test.cSuccessNone0.041757s0.103399s
Success
exec_non_utf8.cSuccessNone0.043596s0.109436s
Success
execve_shebang.cSuccessNone0.045274s0.118357s
Success
exit.cSuccessNone0.040824s0.096996s
Success
exit_failure.cSuccessNone0.043613s0.126533s
Success
exit_group_thread.cSuccessNone0.050741s0.153699s
Success
exit_status_first_wins.cSuccessNone0.047611s0.145331s
Success
flockfile_test.cSuccessNone0.044918s0.142777s
Success
fork2malloc.cSuccessNone0.045250s0.132019s
Success
fork_select.cSuccessNone0.043923s0.139991s
Success
fork_simple.cSuccessNone0.042965s0.152015s
Success
fork_syscall.cSuccessNone0.045745s0.643412s
Success
fork_tls_ctype.cSuccessNone0.047524s0.147748s
Success
forkandopen.cSuccessNone0.044382s0.137120s
Success
forkdup.cSuccessNone0.051539s0.144685s
Success
forkexecuid.cSuccessNone0.041313s0.154286s
Success
forkexecv-arg.cSuccessNone0.042613s0.140634s
Success
forkexecv.cSuccessNone0.041767s0.137355s
Success
forkfiles.cSuccessNone0.044188s0.132513s
Success
forkmalloc.cSuccessNone0.043224s0.125011s
Success
forknodup.cSuccessNone0.044494s0.135701s
Success
function-ptr.cSuccessNone0.041508s0.093381s
Success
getegid_syscall.cSuccessNone0.044101s0.491169s
Success
getgid_syscall.cSuccessNone0.043539s0.474438s
Success
getpid.cSuccessNone0.039138s0.089995s
Success
getpid_syscall.cSuccessNone0.045295s0.491881s
Success
getppid.cSuccessNone0.047849s0.123020s
Success
getppid_syscall.cSuccessNone0.046638s0.389322s
Success
getuid.cSuccessNone0.046242s0.103543s
Success
getuid_syscall.cSuccessNone0.042673s0.253053s
Success
hello-arg.cSuccessNone0.036648s0.095318s
Success
hello.cSuccessNone0.037461s0.091163s
Success
longjmp.cSuccessNone0.039118s0.102542s
Success
mutex.cSuccessNone2.046665s2.122001s
Success
printf_deadlock_smoke.cSuccessNone0.051463s0.157247s
Success
printf_thread_test.cSuccessNone0.041304s0.131904s
Success
sem_forks.cSuccessNone0.045614s0.192748s
Success
setjmp_edge.cSuccessNone0.040289s0.169276s
Success
setsid.cSuccessNone0.040078s0.090622s
Success
template.cSuccessNone0.044114s0.182814s
Success
test_crossmodule_longjmp.cSuccessNone0.044946s0.131168s
Success
test_exec_nofork.cSuccessNone0.042111s0.120560s
Success
test_unlink_open_file.cSuccessNone0.040717s0.092111s
Success
thread-guard.cSuccessNone0.043189s0.128133s
Success
thread-test.cSuccessNone0.041034s0.107713s
Success
thread.cSuccessNone0.039875s0.109324s
Success
thread_cageid_race.cSuccessNone0.040064s0.297927s
Success
tls_test.cSuccessNone0.041895s0.150592s
Success
uname.cSuccessNone0.040267s0.093778s
Success
wait.cSuccessNone0.041995s0.143847s
Success
waitpid_anychild.cSuccessNone0.043830s0.132132s
Success
waitpid_syscall.cSuccessNone1.045726s1.219246s
Success
waitpid_wnohang.cSuccessNone0.044912s0.129060s
Success
Signal Tests
alarm.cSuccessNone7.043387s7.131020s
Success
eintr_fork_signal.cSuccessNone1.044395s1.133192s
Success
kill.cSuccessNone1.045248s1.128886s
Success
pause_test.cSuccessNone1.046579s1.136468s
Success
setitimer.cSuccessNone7.044582s7.132366s
Success
sigalrm.cSuccessNone2.045054s2.119536s
Success
sigaltstack.cSuccessNone0.047660s0.113506s
Success
sigchld.cSuccessNone1.045825s1.133752s
Success
signal-fork.cSuccessNone4.045567s4.121445s
Success
signal-simple.cSuccessNone0.044771s0.106549s
Success
signal_SIGCHLD.cSuccessNone0.043113s0.131142s
Success
signal_fork.cSuccessNone0.040834s0.131256s
Success
signal_int_ignored.cSuccessNone2.044951s2.126556s
Success
signal_kill_cleanup.cSuccessNone1.042800s1.120926s
Success
signal_procmask.cSuccessNone0.040776s0.102462s
Success
signal_read_interrupt.cSuccessNone0.546560s0.631156s
Success
signal_recursive.cSuccessNone0.039567s0.109603s
Success
signal_sa_mask.cSuccessNone0.046230s0.101403s
Success
signal_select_interrupt.cSuccessNone0.547616s0.635149s
Success
signal_write_interrupt.cSuccessNone1.046873s1.128358s
Success
sigpipe.cSuccessNone1.046440s1.134758s
Success
sigprocmask.cSuccessNone1.042930s1.121404s
Success
sigsuspend_test.cSuccessNone1.042579s1.135792s
Success
test_sigsetjmp.cSuccessNone0.045540s0.134139s
Success

Fail Tests

Summary

MetricCount
Total Test Cases6
Number of Successes6
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Dylink Tests
dlerror.cSuccessNone0.036733s0.094724s
Success
Memory Tests
invalid_access_direct.cSuccessNone0.086385s0.107223s
Success
invalid_access_fork.cSuccessNone0.111136s0.258335s
Success
mmap-negative1.cSuccessNone0.110024s0.100143s
Success
mmap-negative2.cSuccessNone0.129688s0.270886s
Success
Signal Tests
signal_resethand.cSuccessNone1.044259s1.123355s
Success

C++ harness

Summary

MetricValue
Total1
Success1
Failures0
Compile failures0
Runtime failures0
Output mismatch0
Timeouts0

Cases

TestStatusError typeNative timeWasm timeOutput
tests/unit-tests/cpp/sort.cppSuccess0.378785s8.364650s
LIBCPP_SORT_OK 1 2 3

@Yaxuan-w Yaxuan-w left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that possible to have a unit test case for this?

Comment on lines +75 to +76
int token = ++g_setjmp_token;
if (token == 0) token = ++g_setjmp_token; /* skip the 0 sentinel on wraparound */

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In C, signed integer overflow is UB, so the program has already entered UB before we get to the if (token == 0) sentinel check. Maybe we can consider uint32_t in this case?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

theoritically this should never happen, gc heap overflow would happen before token overflow, as roughly ten million setjmp invocation would exhaust gc heap with even 4GB size (maximum possible size), an overflow of token would take 2 billion invocation

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants