Skip to content

Encode cageids to enable address translations: (arg, cageid) tuple independence from calling cages.#913

Merged
rennergade merged 21 commits intofix-targetcageidfrom
encode-argid
Mar 16, 2026
Merged

Encode cageids to enable address translations: (arg, cageid) tuple independence from calling cages.#913
rennergade merged 21 commits intofix-targetcageidfrom
encode-argid

Conversation

@stupendoussuperpowers
Copy link
Copy Markdown
Contributor

@stupendoussuperpowers stupendoussuperpowers commented Mar 10, 2026

Building on the discussion here: #896 (comment)

We now allow:

  1. Grates/cages to indicate to threei that the argument they are passing needs translation.
  2. Internally translate arguments on call to make_threei_call.
  3. Ensure support for existing ways to use make_threei_call both in glibc and cages are still supported.

How this works:

  1. The MSB of cageid for each argument in make_threei_call, when set to 1, translate the address in the argument to be host-coded.
  2. Example can be seen in the tests attached, when a grate wants to translate an address, it's indicated by modifying the cageid MSB.
  3. make_threei_call changes the cageid back to a a regular cageid so that existing behaviour is not broken.

Tests added try to pass a grate-local address to the make_threei_call invocation made on behalf of child, and ensure that copy_data_between_cages hasn't regressed:

lind@9a3542c81efe:~/lind-wasm$ sudo lind-boot diff-cage-args_grate.cwasm diff-cage-args.cwasm
[Grate|interpose-exec] Handling function ptr: 2 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
[rawposix|open] path="/tmp/redirected.txt" oflag=0 mode=0
Hello world. FD=3
[Grate|interpose-exec] Handling function ptr: 3 from cage: 1
Goodbye world! ret=4321 buf=helloworld
[Grate|interpose-exec] PASS

@JustinCappos
Copy link
Copy Markdown
Member

JustinCappos commented Mar 10, 2026 via email

@stupendoussuperpowers
Copy link
Copy Markdown
Contributor Author

My thoughts (as briefly discussed in today's meeting):

In the current model, the grate has no way to do this address translation, it has no information about its global address.

I am not sure whether exposing global address to cages would need some fresh evaluations on memory-safety vectors.

In the current system all address translations are done only in glibc, so this tries to stick with that model.

The change to cageid is only observed in within the make_threei_call function when called from a cage, and the original value is preserved for every other interface. My thinking is: 1. (arg, argcageid) were explicitly designed to be useful for address translations, so this tries to limit the scope of translations to this tuple, and 2. the current MAX_CAGEID (1024) is an i32, but the cageids we pass around are u64 (for compatibility reasons) so this should not affect the maximum range for cageids.

@JustinCappos
Copy link
Copy Markdown
Member

JustinCappos commented Mar 10, 2026 via email

@stupendoussuperpowers
Copy link
Copy Markdown
Contributor Author

The solutions you've pointed out all make sense to me and would be implementable albeit some might be more complicated than others given how things are currently written. I've had a bit of a think about this and went back to the original address translation issues/PR to dig deeper.

Just so that we all have a clearer picture of the scope and reason for this PR, I want to ensure we all start with the same set of assumptions about the system. I might be rehashing some old points but it should be helpful to ground the discussion.

First, copying of memory happens in two ways, and the way checks for these happen also differ.

  1. For copy_data_between_cages we have explicit checks to ensure the src/dst addresses provided belong to the cage that was mentioned and that the correct PROT flags are set for the entire range. If they aren't, we return an error.

  2. For rawposix a lot of syscalls do these checks implicitly. (e.g read_syscall). Rawposix assumes the address it was provided is correct and will call libc::read(..., buf_addr,...) to copy something into it. If the address is invalid, depending on the case it will either return -1 or panic. Unlike copy_data, it does not check whether a particular address belongs to a particular cage.

In both the above cases, our Rust codebase (lind, rawposix, threei, etc.) assumes no responsibility for address translations. At most they can detect an error but there is no attempt to "correct" the errors. (More on this later).

Coming to where address translations happen,

Post #469 which was addressing #435, for all regular syscalls addresses are translated to host-space in glibc before it reaches Rust.

Post #582, copy_data does the same.

The only remaining wrinkle left to iron-out in address-conversions is the make_threei_call wrapper, where no translations happen anywhere in the stack. Coming to the solutions you mentioned -

  1. Whether conversion happens inside a grate or in glibc, we need the grate to indicate that a particular arguments needs to be converted.
  • cage/grate is responsible: We don't expose to a cage it's base memory address. (Unsure if this was intentional, the discussion in Move Address Translation from RawPOSIX to libc #435 briefly mentioned some memory-safety issues with this but wasn't clear on it). If it's feasible to expose lind_get_memory_base as a public API, this would by far be the simplest change.
  • glibc is responsible: The grate must pass down information on when to convert an argument. This PR encoded that in the cageid, we could also encode this in the top-bits of the address, or pass down an extra parameter per (arg, cage) tuple.
  1. Every syscall leaving glibc already does address translation, apart from make_threei_call. The checks are only done terminally for both rawposix and copy_data. I am not sure if this addresses the point you made on this. Unclear on what the original meaning was.

  2. Coming back to the error-checking vs error-correcting mentioned earlier. Our Rust codebase is written assuming host-coded addresses. If it receives an address it will runs checks assuming it's host coded, if it fails, it won't retry it with a fresh assumption that it is user-coded.

    If addresses are not "fixed" before reaching Rust, for every possible path we will need to add additional validity-checking logic. First to run these checks assuming things are host-coded, and then to run these checks assuming they are uaddr-coded.

    This is a minor change for copy_data, but would require massive changes to rawposix since we'd need to ditch implicit checks and add these two-pronged checks for every syscall that interacts with a pointer. Implementing that would undo the work of moving address translations to glibc, it would also make the whole exercise of converting addresses in glibc for anything moot since we could just use uaddr for everything, and let rawposix and threei translate them for us on invocation.


Let me know if I misunderstood some of the points you were making.

Tagging @Yaxuan-w and @rennergade to double-check my assumptions about the current state of the codebase.

@rennergade
Copy link
Copy Markdown
Contributor

The memory base already is in userspace so exposing it in an easier way shouldnt be a problem.

@JustinCappos
Copy link
Copy Markdown
Member

JustinCappos commented Mar 10, 2026 via email

@stupendoussuperpowers
Copy link
Copy Markdown
Contributor Author

option 3 is the best for security since we should be doing those checks
anyways. Is there any other reason it would be a problem to do them in 3?

We could run checks at 3 through the various typemap helpers rawposix already uses but are currently no-ops. This should not be that big of a hurdle but might need some new negative unit tests.

But should the scope of these also be to try and convert the address to be host-coded? In which case, address translations are unnecessary at any stage.

One downside which is perhaps why we did it like this is that in theory we
could have a 64 bit grate, etc. and doing the translation once at call time
avoids us needing to do it again and again for different grates.

Yeah I think this point was brought up in the original issue as well.

* reorganize docs, add image, add clamping/stacking paragraphs

* add link

* Update docs/internal/grates.md

Co-authored-by: Justin Cappos <justincappos@gmail.com>

* 3i comment updates

* more 3i comment updates

* index update

* grate changes: more on clamping, motivation

* resolve grate comments

* add examples and more on clamping

* Update wasmtime doc

* Update wasmtime

* update example

* update clamping section

* add clamping doc

* Update docs/internal/clamping.md

Co-authored-by: Justin Cappos <justincappos@gmail.com>

* Apply suggestion from @JustinCappos

Co-authored-by: Justin Cappos <justincappos@gmail.com>

* resolve some comments

* resolve some comments

* fix unclear memory comment

---------

Co-authored-by: Justin Cappos <justincappos@gmail.com>
Co-authored-by: Alice W <wenyaxuan0925@outlook.com>
@Yaxuan-w
Copy link
Copy Markdown
Member

If I understand the previous discussion correctly, option 3 does not necessarily conflict with the current glibc-based translation approach. It can support both fixed and non-fixed addresses. In practice, it just adds an additional option where grate developers do not need to perform address translation in userspace before invoking the syscall.

Regarding performance, one possible approach could be to add a conditional compile flag. If a user prioritizes performance, we could disable the RawPOSIX-side checks and assume that all addresses have already been fixed before entering RawPOSIX.

From my perspective, based on what I understand about this PR, the work is important for supporting the chroot grate. For the current stage, the lowest-cost and fastest path to getting this working might be to perform the address translation in glibc so that it matches the existing RawPOSIX address checks. At the same time, we could document the design discussion and potential improvements in an issue and revisit it later (for example after the paper submission), when we have more time to refine the design.

As for where exactly the address translation should live if we keep it in glibc, I don't have a strong preference. From the discussion so far, one possible option would also be to let grate developers perform the translation before invoking the syscall. This might also help when testing new RawPOSIX functionality, since it makes the address assumptions explicit.

rennergade and others added 2 commits March 10, 2026 19:09
Programs that never call sigaction() (e.g. kill.c) would not link in
libc_sigaction.o, so signal_callback was missing from the wasm exports.
The epoch-based signal handler in wasmtime looks up this export at
runtime, causing a panic when delivering signals to such programs.

Fix: add a __attribute__((used)) reference to signal_callback in crt1.c
so it is always exported from every wasm binary.
…id in rawposix (#900)

* refactor traget cageid usage in 3i and rawposix

* Squashed commit of the following:

commit 5756372
Author: Nicholas Renner <nr2185@nyu.edu>
Date:   Tue Mar 10 09:58:37 2026 -0400

    Restore wasip linker for rust (#902)

    * restore wasip linker for rust

    * Deduplicate wasip1/lind environ linker functions, fix rustfmt

    Merge add_environ_to_linker and add_wasi_compat_to_linker into a single
    add_environ_funcs_to_linker that takes a module name parameter. Called
    twice with "lind" and "wasi_snapshot_preview1" to register identical
    implementations under both namespaces. Fixes cargo fmt lint failure.

commit fee8b37
Author: Nicholas Renner <nr2185@nyu.edu>
Date:   Mon Mar 9 22:54:30 2026 -0400

    Signal EINTR + Asyncify updates (349 update) (#906)

    * update PR to integrated signal EINTR with lind-boot

    * Remove spurious set_stack_pointer call in fork child path

    The set_stack_pointer call was carried over from the old asyncify branch
    but is not needed in the new architecture. The fork child's stack pointer
    is correctly managed by the asyncify rewind mechanism. Calling
    set_stack_pointer before the rewind interfered with the fork process,
    causing all fork-based tests to deadlock/timeout.

    * Rewrite eintr_fork_signal test to use spin loop instead of blocking read

    The original test used alarm(1) + blocking read(pipe), but RawPOSIX's
    read() calls host libc::read() directly, which blocks in the host kernel.
    Since SIGALRM is delivered via epoch callback (which requires wasm to be
    executing), the blocking read can never be interrupted. Rewrite to use a
    spin loop that allows the epoch to fire and deliver the signal.

commit f15676e
Author: Alice Wen <40227173+Yaxuan-w@users.noreply.github.com>
Date:   Mon Mar 9 21:28:46 2026 -0400

    Implement structured exit status handling and correct POSIX wait status encoding (#910)

    * Fix exit code handling to include signal termination

    * Revert fs_call

    * Remove redundant bit check

    * Not using sleep to sync in test

commit f135811
Author: Nicholas Renner <nr2185@nyu.edu>
Date:   Mon Mar 9 18:51:24 2026 -0400

    determinize resolve test (#912)

commit a8798b6
Author: Alice Wen <40227173+Yaxuan-w@users.noreply.github.com>
Date:   Mon Mar 9 17:58:01 2026 -0400

    Fix exit code mismatch between wasmtime and lind-boot exit (#856)

    * Fix exit code mismatch

    * Update skipped list

    * Skip test case

    * Handle system err return

    * Fix merge conflicts

commit 750ba9a
Author: Qianxi Chen <53324229+qianxichen233@users.noreply.github.com>
Date:   Mon Mar 9 13:58:23 2026 -0400

    unify execute_wasmtime and execute_with_lind (#903)

commit e5eb83c
Author: Qianxi Chen <53324229+qianxichen233@users.noreply.github.com>
Date:   Mon Mar 9 13:57:55 2026 -0400

    update wasm-opt for dylink support (#905)

commit 086224d
Author: Huong Hoang <68453624+celinehoang177@users.noreply.github.com>
Date:   Mon Mar 9 12:10:52 2026 -0400

    Replace hardcoded numbers in codebase with named constants (Rust + C) (#855)

    * replace hardcoded numbers in codebase with named constants

    * replace padding 0s with NOTUSED/UNUSED_ID/UNUSED_ARG

commit 89ef9bd
Author: Nicholas Renner <nr2185@nyu.edu>
Date:   Mon Mar 9 11:18:37 2026 -0400

    Fix remote DNS (#898)

    * dns remote resolv

    * add fionread

    * lint

* Refine 3i get_handler and solve exec/exit/clone issue

* Fix exec
@stupendoussuperpowers
Copy link
Copy Markdown
Contributor Author

For now, we can do either of these, and then pick something more robust later:

  1. Expose lind_get_memory_base to userspace, let grates convert their own addresses.
  2. This PR which lets glibc handle it, once indicated.

Both these are low effort changes (a few lines at best), and would enable chroot and similar grates to work properly. Let me know what the best approach is, and I can submit a PR for that.

For the longer run:

We need to decide a strict boundary on who is responsible for address translations, who does what checks, and why. Both the above stated approaches are inconsistent at best (grates must translate/indicate an address for make_threei_call, but mustn't for copy_data), and confusing for grate authors at worst (rawposix will crash on invalid address instead of reporting a proper error). My suggestion is that rawposix must receive only one kind of address, either user or host, having to support both at the same time will lead to a lot of unnecessary address-coercion codepaths.

@JustinCappos
Copy link
Copy Markdown
Member

JustinCappos commented Mar 11, 2026 via email

Yaxuan-w and others added 8 commits March 11, 2026 10:51
… /.github/workflows (#927)

* deps(gha)(deps): bump zizmorcore/zizmor-action in /.github/workflows

Bumps [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) from 0.5.0 to 0.5.2.
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](zizmorcore/zizmor-action@0dce257...71321a2)

---
updated-dependencies:
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* add dedicated environment for zizmor compatibility

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Natasha Hemmings <discount.yoyos@gmail.com>
* Fix getaddrinfo PF_UNSPEC: stub out sendmmsg for Lind-WASM

getaddrinfo() with PF_UNSPEC failed with "Temporary failure in name
resolution" because glibc's DNS resolver (res_send.c) tried to send
parallel A+AAAA queries using sendmmsg(), which is not implemented
in Lind. With __ASSUME_SENDMMSG defined, the fallback to individual
send() calls was compiled out, so the sendmmsg failure was fatal.

Fix:
- Stub __sendmmsg to return ENOSYS immediately (no syscall dispatch)
- Undefine __ASSUME_SENDMMSG in kernel-features.h so res_send.c
  compiles in the fallback path that uses individual __send() calls

When sendmmsg returns ENOSYS, res_send.c sets have_sendmmsg=-1 and
falls through to try_send, which sends each DNS query individually.
Subsequent calls skip sendmmsg entirely.

Closes #934

* Add getaddrinfo PF_UNSPEC test
* make test failure return error code in make file to stop process

* Add deliberately failing ci test file

* intentional failing tests should now force E2E_STATUS=fail

* Skip ci-test file to prevent actual failures

* move test location to ci folder

* update test harness to include the ci folder

* change skipped test location for ci test
@stupendoussuperpowers stupendoussuperpowers marked this pull request as ready for review March 13, 2026 18:13
@github-actions
Copy link
Copy Markdown
Contributor

End-to-End Test Report

Test Preview

Unified Test Report

grate harness

MetricValue
Total10
Success9
Failures1
Compile Failures0
Runtime Failures1
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: 2
[Cage | geteuid] PASS: 1000000 calls returned 10
[Grate|geteuid] PASS

STDERR:

diff-cage-args_grate.cFailureRuntime_Failure
Exception running grate test: 'utf-8' codec can't decode byte 0xff in position 238: invalid start byte
interpose-exec_grate.cSuccess
STDOUT:
[Grate|interpose-exec] Registering exec handler for cage 2 in grate 1 with fn ptr addr: 2
[Grate|interpose-exec] Handling function ptr: 2 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
[Grate|interpose-exec] Handling function ptr: 2 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
Exec successful, argv[1]: --execd
[Grate|interpose-exec] PASS

STDERR:

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

[Grate|interpose-exit] Handling function ptr: 2 from cage: 1
[Grate|interpose-exit] In exit_grate 1 handler for cage: 1
[Grate|interpose-exit] PASS

STDERR:

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

STDERR:

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

STDERR:

interpose-register_grate.cSuccess
STDOUT:
[Grate|interpose-register] Registering register_handler for cage 2 in grate 1 with fn ptr addr: 3
[Cage|interpose-register] In cage 2, about to register handler for geteuid
[Grate|interpose-register] Handling function ptr: 3 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: 2
[Grate|interpose-register] Handling function ptr: 2 from cage: 1
[Grate|interpose-register] In register_grate 1 handler for cage: 1
[Cage|interpose-register] PASS: geteuid ret = 10
[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: 2
[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: 2 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/cpdata_grate.cSuccess
STDOUT:
[Grate|open] intercepts open call: thiscage=1, arg1cage=2
[Grate|open] copied pathname: random
[cage] fd=10

STDERR:

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

STDERR:

wasm harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases189
Number of Successes188
Number of Failures1
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 Failure1
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
File Tests
chartests.cSuccessNone0.050280s4.261669s
Success
chdir_getcwd.cSuccessNone0.054259s4.298269s
Success
chmod.cSuccessNone0.055827s4.307378s
Success
clock_gettime_highlevel.cSuccessNone0.120894s4.509217s
Success
clock_gettime_simple.cSuccessNone0.044407s4.239271s
Success
cloexec.cSuccessNone0.055414s3.953899s
Success
close.cSuccessNone0.063565s4.305216s
Success
creat_access.cSuccessNone0.053409s4.299342s
Success
doubleclose.cSuccessNone0.046238s3.854068s
Success
dup.cSuccessNone0.046735s4.242100s
Success
dup2.cSuccessNone0.051894s3.894768s
Success
dup3.cSuccessNone0.050368s4.289558s
Success
dupwrite.cSuccessNone0.054450s3.886603s
Success
etc_conf.cSuccessNone0.048206s4.270202s
Success
fchdir.cSuccessNone0.057587s4.318686s
Success
fchmod.cSuccessNone0.057936s4.276204s
Success
fcntl.cSuccessNone0.052899s4.256564s
Success
fdatasync.cSuccessNone0.052350s4.257798s
Success
filetest.cSuccessNone0.052232s3.877769s
Success
filetest1000.cSuccessNone0.062532s3.901877s
Success
flock.cSuccessNone0.061756s4.342343s
Success
fstat.cSuccessNone0.055395s4.276943s
Success
fstatfs.cSuccessNone0.047321s4.259563s
Success
fsync.cSuccessNone0.051944s4.263974s
Success
ftruncate.cSuccessNone0.059721s4.324947s
Success
getcwd.cSuccessNone0.048773s4.291030s
Success
getrandom.cSuccessNone0.053324s4.270538s
Success
ioctl.cSuccessNone0.057739s4.273353s
Success
link.cSuccessNone0.056653s4.289130s
Success
locale_test.cSuccessNone0.067639s6.105846s
Success
lseek.cSuccessNone0.057711s4.319320s
Success
mkdir_rmdir.cSuccessNone0.054587s4.284884s
Success
mkfifo_test.cSuccessNone0.059283s4.350507s
Success
mknod.cSuccessNone0.052175s4.299837s
Success
nocancel_io.cSuccessNone0.056979s5.476573s
Success
open.cSuccessNone0.047789s4.247283s
Success
path_conversion_safety.cSuccessNone0.057948s4.278459s
Success
pread_pwrite.cSuccessNone0.051595s4.270905s
Success
printf.cSuccessNone0.044499s3.859076s
Success
read.cSuccessNone0.053283s4.251925s
Success
readbytes.cSuccessNone0.051105s3.840441s
Success
readlink.cSuccessNone0.053913s4.291847s
Success
readlinkat.cSuccessNone0.054815s4.254434s
Success
readv_writev_test.cSuccessNone0.055151s4.272148s
Success
rename.cSuccessNone0.055533s4.275503s
Success
sc-writev.cSuccessNone0.051395s4.247181s
Success
stat.cSuccessNone0.054963s4.269826s
Success
statfs.cSuccessNone0.048188s4.257496s
Success
sync_file_range.cSuccessNone0.051811s4.273524s
Success
truncate.cSuccessNone0.054335s4.285964s
Success
unlink.cSuccessNone0.055547s4.307766s
Success
unlinkat.cSuccessNone0.055269s4.318104s
Success
write.cSuccessNone0.046830s3.866538s
Success
writeloop.cSuccessNone0.056102s3.877213s
Success
writepartial.cSuccessNone0.054008s3.879677s
Success
writev.cSuccessNone0.054671s4.257050s
Success
Math Tests
math_link_smoke.cSuccessNone0.057048s3.948240s
Success
math_tests.cSuccessNone0.062618s4.051975s
Success
Memory Tests
brk.cSuccessNone0.054818s4.276876s
Success
fork_large_memory.cSuccessNone0.087129s4.426056s
Success
malloc.cSuccessNone0.048976s3.864938s
Success
malloc_large.cSuccessNone0.050078s4.269262s
Success
memcpy.cSuccessNone0.048535s3.860749s
Success
memory_error_test.cSuccessNone0.056022s4.246789s
Success
mmap.cSuccessNone0.045396s4.265612s
Success
mmap_aligned.cSuccessNone0.047468s4.251908s
Success
mmap_complicated.cSuccessNone0.053908s4.353164s
Success
mmap_file.cSuccessNone0.053246s4.295642s
Success
mmap_shared.cSuccessNone0.053392s4.290427s
Success
mmaptest.cSuccessNone0.049219s4.248791s
Success
mprotect.cSuccessNone0.047358s4.291602s
Success
mprotect_boundary.cSuccessNone0.047844s4.266136s
Success
mprotect_end_region.cSuccessNone0.046781s4.286408s
Success
mprotect_middle_region.cSuccessNone0.046551s4.256402s
Success
mprotect_multiple_times.cSuccessNone0.047703s4.266872s
Success
mprotect_same_value.cSuccessNone0.047438s4.256090s
Success
mprotect_spanning_regions.cSuccessNone0.047596s4.263787s
Success
sbrk.cSuccessNone0.048300s4.255199s
Success
segfault.cSuccessNone0.056165s4.327260s
Success
shm.cSuccessNone0.053291s4.325829s
Success
shmtest.cSuccessNone0.048257s4.296483s
Success
tcache_test.cFailureUnknown_Failure0.057342s4.437012s
tcache reuse: yes
failed to run main module

Caused by:
0: failed to invoke command default
1: memory fault at wasm address 0xfffbcba4 in linear memory of size 0x100000000
2: wasm trap: out of bounds memory access
Error: memory fault at wasm address 0xfff9d50c in linear memory of size 0x100000000

Caused by:
wasm trap: out of bounds memory access

thread_malloc_sequential.cSuccessNone0.055218s4.437006s
Success
vtable.cSuccessNone0.061401s3.898095s
Success
Networking Tests
dns_resolve_test.cSuccessNone0.053918s5.985868s
Success
dnstest.cSuccessNone0.054278s4.272791s
Success
epoll_edge_triggered.cSuccessNone0.211780s4.497272s
Success
epollcreate1.cSuccessNone0.055462s4.279549s
Success
error_handling_net.cSuccessNone0.063853s4.366398s
Success
getaddrinfo_test.cSuccessNone0.057722s6.002686s
Success
gethostname.cSuccessNone0.046979s3.862313s
Success
getifaddrs.cSuccessNone0.056315s4.343962s
Success
getsockname.cSuccessNone0.055802s4.293082s
Success
getsockopt.cSuccessNone0.057394s4.294355s
Success
ipv6_basic.cSuccessNone0.059109s4.316709s
Success
makepipe.cSuccessNone0.046677s3.878976s
Success
nonblocking_eagain.cSuccessNone0.058984s4.329667s
Success
pipe.cSuccessNone0.055926s4.296875s
Success
pipe2.cSuccessNone0.056664s4.262287s
Success
pipeinput.cSuccessNone0.057198s4.330332s
Success
pipeinput2.cSuccessNone0.057623s4.323779s
Success
pipeonestring.cSuccessNone0.058074s4.309990s
Success
pipepong.cSuccessNone0.056886s4.342838s
Success
pipewrite.cSuccessNone0.050189s4.259821s
Success
poll.cSuccessNone0.054163s4.264365s
Success
recvfrom-sendto.cSuccessNone0.055718s4.289836s
Success
sendmsg_recvmsg_test.cSuccessNone0.055450s4.382281s
Success
serverclient.cSuccessNone0.054862s3.917477s
Success
shutdown.cSuccessNone0.056367s3.917319s
Success
shutdown_fork.cSuccessNone0.054947s4.325805s
Success
simple-select.cSuccessNone0.056537s4.315691s
Success
simple_epoll.cSuccessNone0.054833s4.261348s
Success
socket.cSuccessNone0.053688s3.865768s
Success
socket_cloexec.cSuccessNone0.053202s4.247539s
Success
socket_options_advanced.cSuccessNone0.059593s4.304410s
Success
socketepoll.cSuccessNone0.053831s3.880753s
Success
socketpair.cSuccessNone0.052672s4.317060s
Success
socketselect.cSuccessNone0.053446s4.273252s
Success
tcp_connect_single.cSuccessNone0.054500s4.296733s
Success
udp_send_recv.cSuccessNone0.163604s4.451331s
Success
uds-getsockname.cSuccessNone0.055425s4.295609s
Success
uds-nb-select.cSuccessNone2.065407s6.504515s
Success
uds-serverclient.cSuccessNone0.058805s4.397464s
Success
uds-socketselect.cSuccessNone0.055667s3.889671s
Success
writev_socket.cSuccessNone0.057334s4.269561s
Success
Process Tests
barrier_test.cSuccessNone0.053184s4.437953s
Success
chain_thread.cSuccessNone1.055336s5.439333s
Success
ctor_syscall_test.cSuccessNone0.045022s4.277104s
Success
cxa_atexit_test.cSuccessNone0.050570s3.869717s
Success
exit.cSuccessNone0.051386s3.876884s
Success
exit_failure.cSuccessNone0.053408s3.927179s
Success
flockfile_test.cSuccessNone0.054412s4.450711s
Success
fork2malloc.cSuccessNone0.056019s4.348379s
Success
fork_select.cSuccessNone0.053418s4.326265s
Success
fork_simple.cSuccessNone0.052142s4.308859s
Success
fork_syscall.cSuccessNone0.060687s4.349358s
Success
fork_tls_ctype.cSuccessNone0.056933s4.330325s
Success
forkandopen.cSuccessNone0.055166s4.294780s
Success
forkdup.cSuccessNone0.056788s3.948789s
Success
forkexecuid.cSuccessNone0.052732s4.341745s
Success
forkexecv-arg.cSuccessNone0.052797s4.330382s
Success
forkexecv.cSuccessNone0.051582s4.311200s
Success
forkfiles.cSuccessNone0.055186s4.306078s
Success
forkmalloc.cSuccessNone0.067112s4.348805s
Success
forknodup.cSuccessNone0.056099s4.322152s
Success
function-ptr.cSuccessNone0.050391s4.263025s
Success
getegid_syscall.cSuccessNone0.056030s4.339933s
Success
getgid_syscall.cSuccessNone0.055299s4.345326s
Success
getpid.cSuccessNone0.047730s4.272456s
Success
getpid_syscall.cSuccessNone0.056732s4.382873s
Success
getppid.cSuccessNone0.056886s4.324776s
Success
getppid_syscall.cSuccessNone0.059071s4.349974s
Success
getuid.cSuccessNone0.055370s4.252904s
Success
getuid_syscall.cSuccessNone0.052952s4.329155s
Success
hello-arg.cSuccessNone0.044723s3.875063s
Success
hello.cSuccessNone0.044976s3.870044s
Success
longjmp.cSuccessNone0.045981s3.869018s
Success
mutex.cSuccessNone2.059740s6.558744s
Success
printf_deadlock_smoke.cSuccessNone0.063428s4.613300s
Success
printf_thread_test.cSuccessNone0.052790s4.457714s
Success
sem_forks.cSuccessNone0.057398s4.350836s
Success
setsid.cSuccessNone0.047355s3.874698s
Success
template.cSuccessNone0.055100s4.312511s
Success
test_exec_nofork.cSuccessNone0.053026s4.286905s
Success
test_unlink_open_file.cSuccessNone0.049097s3.872995s
Success
thread-test.cSuccessNone0.050695s4.406966s
Success
thread.cSuccessNone0.049390s4.424255s
Success
thread_cageid_race.cSuccessNone0.050510s4.426192s
Success
tls_test.cSuccessNone0.052675s4.443751s
Success
uname.cSuccessNone0.047692s4.266432s
Success
wait.cSuccessNone2.052186s5.918511s
Success
waitpid_anychild.cSuccessNone0.054019s4.300249s
Success
waitpid_syscall.cSuccessNone1.056915s5.399600s
Success
waitpid_wnohang.cSuccessNone0.055622s3.904125s
Success
Signal Tests
alarm.cSuccessNone7.053874s10.914539s
Success
eintr_fork_signal.cSuccessNone1.057161s5.339063s
Success
setitimer.cSuccessNone7.053802s10.904379s
Success
sigalrm.cSuccessNone2.055179s5.913219s
Success
sigchld.cSuccessNone1.056504s4.954238s
Success
signal-fork.cSuccessNone4.056252s7.967600s
Success
signal-simple.cSuccessNone0.055394s3.917451s
Success
signal_SIGCHLD.cSuccessNone0.053873s4.339271s
Success
signal_fork.cSuccessNone0.051916s4.335692s
Success
signal_int_ignored.cSuccessNone2.055009s6.350750s
Success
signal_procmask.cSuccessNone0.049277s4.305976s
Success
signal_recursive.cSuccessNone0.049591s3.908753s
Success
signal_sa_mask.cSuccessNone0.049473s3.911066s
Success
sigpipe.cSuccessNone1.057285s5.392515s
Success
sigprocmask.cSuccessNone1.054322s4.931165s
Success
Fail 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
Memory Tests
mmap-negative1.cSuccessNone0.117720s4.837162s
Success
mmap-negative2.cSuccessNone0.143208s4.422101s
Success
Signal Tests
signal_resethand.cSuccessNone1.054754s3.948811s
Success

rennergade and others added 3 commits March 13, 2026 14:50
)

lind-boot chroots to lindfs where /dev/urandom doesn't exist,
causing a panic in random_get. Route through 3i make_syscall to
the existing getrandom_syscall handler (syscall 318) in rawposix.

Fixes #919
@github-actions
Copy link
Copy Markdown
Contributor

End-to-End Test Report

Test Preview

Unified Test Report

grate harness

MetricValue
Total10
Success10
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: 2
[Cage | geteuid] PASS: 1000000 calls returned 10
[Grate|geteuid] PASS

STDERR:

diff-cage-args_grate.cSuccess
STDOUT:
[Grate|diff-cage-args] Handling function ptr: 2 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: 3 from cage: 1
Goodbye world! ret=4321 buf=helloworld
[Grate|diff-cage-args] PASS

STDERR:

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

STDERR:

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

[Grate|interpose-exit] Handling function ptr: 2 from cage: 1
[Grate|interpose-exit] In exit_grate 1 handler for cage: 1
[Grate|interpose-exit] PASS

STDERR:

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

STDERR:

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

STDERR:

interpose-register_grate.cSuccess
STDOUT:
[Grate|interpose-register] Registering register_handler for cage 2 in grate 1 with fn ptr addr: 3
[Cage|interpose-register] In cage 2, about to register handler for geteuid
[Grate|interpose-register] Handling function ptr: 3 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: 2
[Grate|interpose-register] Handling function ptr: 2 from cage: 1
[Grate|interpose-register] In register_grate 1 handler for cage: 1
[Cage|interpose-register] PASS: geteuid ret = 10
[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: 2
[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: 2 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/cpdata_grate.cSuccess
STDOUT:
[Grate|open] intercepts open call: thiscage=1, arg1cage=2
[Grate|open] copied pathname: random
[cage] fd=10

STDERR:

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

STDERR:

wasm harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases189
Number of Successes189
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
File Tests
chartests.cSuccessNone0.051043s4.289023s
Success
chdir_getcwd.cSuccessNone0.050381s4.298404s
Success
chmod.cSuccessNone0.056264s4.302681s
Success
clock_gettime_highlevel.cSuccessNone0.121914s4.491387s
Success
clock_gettime_simple.cSuccessNone0.045761s4.235179s
Success
cloexec.cSuccessNone0.056029s3.941040s
Success
close.cSuccessNone0.063571s4.326424s
Success
creat_access.cSuccessNone0.055270s4.349153s
Success
doubleclose.cSuccessNone0.045954s3.873349s
Success
dup.cSuccessNone0.046907s4.277390s
Success
dup2.cSuccessNone0.053035s3.907138s
Success
dup3.cSuccessNone0.050737s4.295391s
Success
dupwrite.cSuccessNone0.056081s3.928536s
Success
etc_conf.cSuccessNone0.048849s4.305358s
Success
fchdir.cSuccessNone0.056750s4.338299s
Success
fchmod.cSuccessNone0.059317s4.308862s
Success
fcntl.cSuccessNone0.053898s4.330656s
Success
fdatasync.cSuccessNone0.052785s4.263799s
Success
filetest.cSuccessNone0.053951s3.920304s
Success
filetest1000.cSuccessNone0.063992s3.978952s
Success
flock.cSuccessNone0.062162s4.422526s
Success
fstat.cSuccessNone0.056262s4.308970s
Success
fstatfs.cSuccessNone0.049808s4.311481s
Success
fsync.cSuccessNone0.055279s4.319691s
Success
ftruncate.cSuccessNone0.058397s4.398073s
Success
getcwd.cSuccessNone0.051367s4.308789s
Success
getrandom.cSuccessNone0.054226s4.268447s
Success
ioctl.cSuccessNone0.060231s4.326568s
Success
link.cSuccessNone0.057513s4.343853s
Success
locale_test.cSuccessNone0.067463s6.062783s
Success
lseek.cSuccessNone0.058404s4.334243s
Success
mkdir_rmdir.cSuccessNone0.054299s4.287992s
Success
mkfifo_test.cSuccessNone0.059849s4.356580s
Success
mknod.cSuccessNone0.052389s4.284831s
Success
nocancel_io.cSuccessNone0.059685s5.594282s
Success
open.cSuccessNone0.050267s4.325393s
Success
path_conversion_safety.cSuccessNone0.060109s4.301327s
Success
pread_pwrite.cSuccessNone0.050195s4.257937s
Success
printf.cSuccessNone0.047228s3.899367s
Success
read.cSuccessNone0.055289s4.324639s
Success
readbytes.cSuccessNone0.050955s3.877924s
Success
readlink.cSuccessNone0.054991s4.374086s
Success
readlinkat.cSuccessNone0.059241s4.347720s
Success
readv_writev_test.cSuccessNone0.055892s4.299712s
Success
rename.cSuccessNone0.055465s4.316350s
Success
sc-writev.cSuccessNone0.051069s4.286811s
Success
stat.cSuccessNone0.057536s4.301614s
Success
statfs.cSuccessNone0.048955s4.287657s
Success
sync_file_range.cSuccessNone0.052849s4.307827s
Success
truncate.cSuccessNone0.055292s4.333618s
Success
unlink.cSuccessNone0.057484s4.415194s
Success
unlinkat.cSuccessNone0.057866s4.362641s
Success
write.cSuccessNone0.049952s3.893219s
Success
writeloop.cSuccessNone0.058025s3.909896s
Success
writepartial.cSuccessNone0.055005s3.971332s
Success
writev.cSuccessNone0.054947s4.279355s
Success
Math Tests
math_link_smoke.cSuccessNone0.058486s4.009624s
Success
math_tests.cSuccessNone0.069595s4.120215s
Success
Memory Tests
brk.cSuccessNone0.055598s4.266282s
Success
fork_large_memory.cSuccessNone0.086251s4.465203s
Success
malloc.cSuccessNone0.049930s3.864391s
Success
malloc_large.cSuccessNone0.053030s4.363048s
Success
memcpy.cSuccessNone0.048594s3.880755s
Success
memory_error_test.cSuccessNone0.055310s4.326054s
Success
mmap.cSuccessNone0.046550s4.289529s
Success
mmap_aligned.cSuccessNone0.048677s4.269373s
Success
mmap_complicated.cSuccessNone0.054626s4.394233s
Success
mmap_file.cSuccessNone0.054368s4.291162s
Success
mmap_shared.cSuccessNone0.053141s4.303742s
Success
mmaptest.cSuccessNone0.052223s4.385193s
Success
mprotect.cSuccessNone0.048189s4.280807s
Success
mprotect_boundary.cSuccessNone0.048554s4.336975s
Success
mprotect_end_region.cSuccessNone0.049681s4.417355s
Success
mprotect_middle_region.cSuccessNone0.050358s4.306867s
Success
mprotect_multiple_times.cSuccessNone0.049027s4.306982s
Success
mprotect_same_value.cSuccessNone0.046797s4.246990s
Success
mprotect_spanning_regions.cSuccessNone0.049244s4.344822s
Success
sbrk.cSuccessNone0.050143s4.348036s
Success
segfault.cSuccessNone0.055699s4.312676s
Success
shm.cSuccessNone0.053566s4.339762s
Success
shmtest.cSuccessNone0.049422s4.309016s
Success
tcache_test.cSuccessNone0.060809s4.446078s
Success
thread_malloc_sequential.cSuccessNone0.057137s4.563456s
Success
vtable.cSuccessNone0.061361s3.891158s
Success
Networking Tests
dns_resolve_test.cSuccessNone0.056690s6.393604s
Success
dnstest.cSuccessNone0.059504s4.423030s
Success
epoll_edge_triggered.cSuccessNone0.216429s4.582465s
Success
epollcreate1.cSuccessNone0.058548s4.476220s
Success
error_handling_net.cSuccessNone0.067225s4.603902s
Success
getaddrinfo_test.cSuccessNone0.064375s6.314053s
Success
gethostname.cSuccessNone0.050457s4.001558s
Success
getifaddrs.cSuccessNone0.059245s4.464290s
Success
getsockname.cSuccessNone0.058264s4.394187s
Success
getsockopt.cSuccessNone0.060045s4.413973s
Success
ipv6_basic.cSuccessNone0.061620s4.458047s
Success
makepipe.cSuccessNone0.050295s3.990824s
Success
nonblocking_eagain.cSuccessNone0.063182s4.472112s
Success
pipe.cSuccessNone0.060391s4.488597s
Success
pipe2.cSuccessNone0.058346s4.372199s
Success
pipeinput.cSuccessNone0.059864s4.463930s
Success
pipeinput2.cSuccessNone0.060013s4.455057s
Success
pipeonestring.cSuccessNone0.060987s4.463727s
Success
pipepong.cSuccessNone0.058550s4.493870s
Success
pipewrite.cSuccessNone0.054778s4.497100s
Success
poll.cSuccessNone0.057711s4.384981s
Success
recvfrom-sendto.cSuccessNone0.059382s4.405714s
Success
sendmsg_recvmsg_test.cSuccessNone0.058162s4.445261s
Success
serverclient.cSuccessNone0.057969s4.067155s
Success
shutdown.cSuccessNone0.061046s4.040968s
Success
shutdown_fork.cSuccessNone0.059739s4.456071s
Success
simple-select.cSuccessNone0.059951s4.442910s
Success
simple_epoll.cSuccessNone0.056272s4.405770s
Success
socket.cSuccessNone0.058292s3.992977s
Success
socket_cloexec.cSuccessNone0.056829s4.341785s
Success
socket_options_advanced.cSuccessNone0.064013s4.427218s
Success
socketepoll.cSuccessNone0.057799s3.982609s
Success
socketpair.cSuccessNone0.058518s4.549073s
Success
socketselect.cSuccessNone0.056123s4.425939s
Success
tcp_connect_single.cSuccessNone0.058766s4.421965s
Success
udp_send_recv.cSuccessNone0.165545s4.607094s
Success
uds-getsockname.cSuccessNone0.058502s4.431731s
Success
uds-nb-select.cSuccessNone2.066827s6.706609s
Success
uds-serverclient.cSuccessNone0.061533s4.492290s
Success
uds-socketselect.cSuccessNone0.059166s3.996097s
Success
writev_socket.cSuccessNone0.061401s4.479021s
Success
Process Tests
barrier_test.cSuccessNone0.053866s4.433853s
Success
chain_thread.cSuccessNone1.055707s5.474192s
Success
ctor_syscall_test.cSuccessNone0.044785s4.262248s
Success
cxa_atexit_test.cSuccessNone0.050424s3.880382s
Success
exit.cSuccessNone0.052501s3.874073s
Success
exit_failure.cSuccessNone0.054006s3.963450s
Success
flockfile_test.cSuccessNone0.055060s4.447487s
Success
fork2malloc.cSuccessNone0.055131s4.305846s
Success
fork_select.cSuccessNone0.053663s4.364676s
Success
fork_simple.cSuccessNone0.051646s4.313912s
Success
fork_syscall.cSuccessNone0.058923s4.362006s
Success
fork_tls_ctype.cSuccessNone0.056805s4.334475s
Success
forkandopen.cSuccessNone0.055592s4.323602s
Success
forkdup.cSuccessNone0.057117s3.956794s
Success
forkexecuid.cSuccessNone0.053233s4.330326s
Success
forkexecv-arg.cSuccessNone0.054039s4.312353s
Success
forkexecv.cSuccessNone0.053983s4.331673s
Success
forkfiles.cSuccessNone0.056592s4.319315s
Success
forkmalloc.cSuccessNone0.085964s4.356248s
Success
forknodup.cSuccessNone0.061189s4.383122s
Success
function-ptr.cSuccessNone0.051267s4.266739s
Success
getegid_syscall.cSuccessNone0.054717s4.340626s
Success
getgid_syscall.cSuccessNone0.056440s4.341798s
Success
getpid.cSuccessNone0.047977s4.272742s
Success
getpid_syscall.cSuccessNone0.060087s4.548085s
Success
getppid.cSuccessNone0.055162s4.315459s
Success
getppid_syscall.cSuccessNone0.058015s4.357295s
Success
getuid.cSuccessNone0.054977s4.248444s
Success
getuid_syscall.cSuccessNone0.053340s4.355155s
Success
hello-arg.cSuccessNone0.045102s3.920326s
Success
hello.cSuccessNone0.045034s3.874785s
Success
longjmp.cSuccessNone0.047139s3.973939s
Success
mutex.cSuccessNone2.061418s6.542383s
Success
printf_deadlock_smoke.cSuccessNone0.063820s4.647775s
Success
printf_thread_test.cSuccessNone0.053999s4.461054s
Success
sem_forks.cSuccessNone0.057980s4.358052s
Success
setsid.cSuccessNone0.050910s3.891343s
Success
template.cSuccessNone0.056737s4.310757s
Success
test_exec_nofork.cSuccessNone0.055133s4.278645s
Success
test_unlink_open_file.cSuccessNone0.050034s3.849864s
Success
thread-test.cSuccessNone0.049023s4.434647s
Success
thread.cSuccessNone0.049018s4.426511s
Success
thread_cageid_race.cSuccessNone0.050549s4.399614s
Success
tls_test.cSuccessNone0.052484s4.414759s
Success
uname.cSuccessNone0.047827s4.219547s
Success
wait.cSuccessNone2.051614s5.920062s
Success
waitpid_anychild.cSuccessNone0.055023s4.306420s
Success
waitpid_syscall.cSuccessNone1.055742s5.324272s
Success
waitpid_wnohang.cSuccessNone0.055666s3.912124s
Success
Signal Tests
alarm.cSuccessNone7.057421s11.104038s
Success
eintr_fork_signal.cSuccessNone1.059888s5.501115s
Success
setitimer.cSuccessNone7.057195s11.071914s
Success
sigalrm.cSuccessNone2.058867s6.044000s
Success
sigchld.cSuccessNone1.059089s5.096774s
Success
signal-fork.cSuccessNone4.060049s8.071516s
Success
signal-simple.cSuccessNone0.058301s4.023050s
Success
signal_SIGCHLD.cSuccessNone0.057123s4.471341s
Success
signal_fork.cSuccessNone0.055199s4.467004s
Success
signal_int_ignored.cSuccessNone2.057876s6.495220s
Success
signal_procmask.cSuccessNone0.052275s4.428118s
Success
signal_recursive.cSuccessNone0.051990s3.993680s
Success
signal_sa_mask.cSuccessNone0.051185s4.014407s
Success
sigpipe.cSuccessNone1.058919s5.503479s
Success
sigprocmask.cSuccessNone1.058281s5.040603s
Success
Fail 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
Memory Tests
mmap-negative1.cSuccessNone0.130613s4.587654s
Success
mmap-negative2.cSuccessNone0.131466s4.536326s
Success
Signal Tests
signal_resethand.cSuccessNone1.057148s4.068909s
Success

Copy link
Copy Markdown
Member

@Yaxuan-w Yaxuan-w left a comment

Choose a reason for hiding this comment

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

Approved to unblock current grate implementation

int fd = open("redirected.txt", O_RDONLY, 0);
printf("Hello world. FD=%d\n", fd);

char buf[11];
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

missing null terminator


// When we want the argument to be translated, the cageid supplied must have the MSB set to 1.
// These masks help check this.
#define LIND_ARG_TRANSLATE_FLAG (1ULL << 63)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

im not sure what this is, define a constant? or a better comment?

char new_path[20] = "/tmp/redirected.txt";

int ret = make_threei_call(
2, 0, self_grate_id, arg1cage,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

are the zeros here not used?

//
// This is called by copy data where the arguments are already addresses
// so we implicitly update the cageid argument before passing it to the helper.
#define TRANSLATE_UADDR_TO_HOST(uaddr, cageid) \
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Both TRANSLATE_ARG_TO_HOST and TRANSLATE_UADDR_TO_HOST silently expand to two comma-separated values that fill positional function parameters. This should be documented with a comment like /* expands to: (translated_addr), (clean_cageid) */ on each macro, anyone modifying the call sites will get
bizarre compiler errors otherwise.

if (cageid == __lind_cageid)
uint64_t __cageid = cageid & LIND_ARG_CAGEID_MASK;

if (__cageid == __lind_cageid && ((cageid & LIND_ARG_TRANSLATE_FLAG) != 0))
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

needs a comment on new semantics

// is needed. We do modify the cage on output so that other threei/lind calls see a correct cageid
#define TRANSLATE_ARG_TO_HOST(uaddr, cageid) \
__lind_translate_uaddr_to_host ((uaddr), (cageid)), (cageid & LIND_ARG_CAGEID_MASK)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should be ((cageid) & LIND_ARG_CAGEID_MASK), if someone passes an expression, operator precedence could bite. Same minor issue in TRANSLATE_UADDR_TO_HOST

Copy link
Copy Markdown
Contributor

@rennergade rennergade left a comment

Choose a reason for hiding this comment

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

left a few comments

vidyalakshmir and others added 4 commits March 16, 2026 15:45
* Added placeholder for libdl.a

* Added unwind_def object file for libc.a

* Updated s_frexpl.c with latest glibc code to fix the build error

* Disable compiler flags -mno-sse, -mno-mmx, -mfpmath-387 that are not supported by wasm and caused build errors

* Disable ELF symbol versioning and hidden visibility in glibc shared builds which caused undefined symbol error for pow etc

* Removed flags that is not supported in wasm
… encode-argid"

This reverts commit a758efd, reversing
changes made to 061322b.
@github-actions
Copy link
Copy Markdown
Contributor

End-to-End Test Report

Test Preview

Unified Test Report

grate harness

MetricValue
Total10
Success10
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: 2
[Cage | geteuid] PASS: 1000000 calls returned 10
[Grate|geteuid] PASS

STDERR:

diff-cage-args_grate.cSuccess
STDOUT:
[Grate|diff-cage-args] Handling function ptr: 2 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: 3 from cage: 1
Goodbye world! ret=4321 buf=helloworld
[Grate|diff-cage-args] PASS

STDERR:

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

STDERR:

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

[Grate|interpose-exit] Handling function ptr: 2 from cage: 1
[Grate|interpose-exit] In exit_grate 1 handler for cage: 1
[Grate|interpose-exit] PASS

STDERR:

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

STDERR:

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

STDERR:

interpose-register_grate.cSuccess
STDOUT:
[Grate|interpose-register] Registering register_handler for cage 2 in grate 1 with fn ptr addr: 3
[Cage|interpose-register] In cage 2, about to register handler for geteuid
[Grate|interpose-register] Handling function ptr: 3 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: 2
[Grate|interpose-register] Handling function ptr: 2 from cage: 1
[Grate|interpose-register] In register_grate 1 handler for cage: 1
[Cage|interpose-register] PASS: geteuid ret = 10
[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: 2
[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: 2 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/cpdata_grate.cSuccess
STDOUT:
[Grate|open] intercepts open call: thiscage=1, arg1cage=2
[Grate|open] copied pathname: random
[cage] fd=10

STDERR:

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

STDERR:

wasm harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases189
Number of Successes189
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
File Tests
chartests.cSuccessNone0.052654s4.373924s
Success
chdir_getcwd.cSuccessNone0.054432s4.336845s
Success
chmod.cSuccessNone0.059337s4.375039s
Success
clock_gettime_highlevel.cSuccessNone0.122017s4.543568s
Success
clock_gettime_simple.cSuccessNone0.047111s4.312598s
Success
cloexec.cSuccessNone0.058350s4.048318s
Success
close.cSuccessNone0.065441s4.374079s
Success
creat_access.cSuccessNone0.056523s4.334561s
Success
doubleclose.cSuccessNone0.046105s3.903020s
Success
dup.cSuccessNone0.047458s4.315756s
Success
dup2.cSuccessNone0.052566s4.002555s
Success
dup3.cSuccessNone0.053173s4.334787s
Success
dupwrite.cSuccessNone0.054367s3.942309s
Success
etc_conf.cSuccessNone0.050032s4.393535s
Success
fchdir.cSuccessNone0.059451s4.361341s
Success
fchmod.cSuccessNone0.061784s4.331749s
Success
fcntl.cSuccessNone0.056615s4.378660s
Success
fdatasync.cSuccessNone0.056752s4.342504s
Success
filetest.cSuccessNone0.053369s3.927685s
Success
filetest1000.cSuccessNone0.062819s3.940044s
Success
flock.cSuccessNone0.063244s4.380108s
Success
fstat.cSuccessNone0.059497s4.406027s
Success
fstatfs.cSuccessNone0.049495s4.291319s
Success
fsync.cSuccessNone0.055068s4.333727s
Success
ftruncate.cSuccessNone0.058180s4.357154s
Success
getcwd.cSuccessNone0.050768s4.421232s
Success
getrandom.cSuccessNone0.053677s4.327458s
Success
ioctl.cSuccessNone0.063554s4.340266s
Success
link.cSuccessNone0.059847s4.391219s
Success
locale_test.cSuccessNone0.071103s6.264352s
Success
lseek.cSuccessNone0.060798s4.364213s
Success
mkdir_rmdir.cSuccessNone0.058017s4.354538s
Success
mkfifo_test.cSuccessNone0.064264s4.501118s
Success
mknod.cSuccessNone0.056114s4.409102s
Success
nocancel_io.cSuccessNone0.062444s5.583695s
Success
open.cSuccessNone0.048940s4.299121s
Success
path_conversion_safety.cSuccessNone0.060779s4.347807s
Success
pread_pwrite.cSuccessNone0.051560s4.315855s
Success
printf.cSuccessNone0.045555s3.900200s
Success
read.cSuccessNone0.056372s4.316044s
Success
readbytes.cSuccessNone0.053099s4.003130s
Success
readlink.cSuccessNone0.055936s4.346586s
Success
readlinkat.cSuccessNone0.056683s4.310089s
Success
readv_writev_test.cSuccessNone0.058838s4.341946s
Success
rename.cSuccessNone0.059841s4.374005s
Success
sc-writev.cSuccessNone0.055266s4.387983s
Success
stat.cSuccessNone0.056725s4.321321s
Success
statfs.cSuccessNone0.050431s4.343331s
Success
sync_file_range.cSuccessNone0.053343s4.418831s
Success
truncate.cSuccessNone0.057092s4.342123s
Success
unlink.cSuccessNone0.060137s4.404241s
Success
unlinkat.cSuccessNone0.058350s4.379685s
Success
write.cSuccessNone0.049940s3.972267s
Success
writeloop.cSuccessNone0.060724s3.932047s
Success
writepartial.cSuccessNone0.057647s3.909346s
Success
writev.cSuccessNone0.058421s4.369684s
Success
Math Tests
math_link_smoke.cSuccessNone0.058653s3.944547s
Success
math_tests.cSuccessNone0.064679s4.139914s
Success
Memory Tests
brk.cSuccessNone0.056861s4.359349s
Success
fork_large_memory.cSuccessNone0.098162s4.560661s
Success
malloc.cSuccessNone0.051842s3.954492s
Success
malloc_large.cSuccessNone0.052875s4.344881s
Success
memcpy.cSuccessNone0.052517s3.903101s
Success
memory_error_test.cSuccessNone0.058099s4.366458s
Success
mmap.cSuccessNone0.048783s4.350745s
Success
mmap_aligned.cSuccessNone0.053047s4.344611s
Success
mmap_complicated.cSuccessNone0.054003s4.375598s
Success
mmap_file.cSuccessNone0.056378s4.301406s
Success
mmap_shared.cSuccessNone0.059325s4.355938s
Success
mmaptest.cSuccessNone0.052407s4.327396s
Success
mprotect.cSuccessNone0.049430s4.316954s
Success
mprotect_boundary.cSuccessNone0.050403s4.329530s
Success
mprotect_end_region.cSuccessNone0.046793s4.313191s
Success
mprotect_middle_region.cSuccessNone0.050041s4.296687s
Success
mprotect_multiple_times.cSuccessNone0.048863s4.289894s
Success
mprotect_same_value.cSuccessNone0.048430s4.332139s
Success
mprotect_spanning_regions.cSuccessNone0.051336s4.323428s
Success
sbrk.cSuccessNone0.049725s4.338579s
Success
segfault.cSuccessNone0.056017s4.381583s
Success
shm.cSuccessNone0.057175s4.393926s
Success
shmtest.cSuccessNone0.051104s4.340669s
Success
tcache_test.cSuccessNone0.058393s4.512805s
Success
thread_malloc_sequential.cSuccessNone0.058884s4.478279s
Success
vtable.cSuccessNone0.063602s3.988527s
Success
Networking Tests
dns_resolve_test.cSuccessNone0.057355s6.172184s
Success
dnstest.cSuccessNone0.055341s4.391317s
Success
epoll_edge_triggered.cSuccessNone0.214209s4.636160s
Success
epollcreate1.cSuccessNone0.058856s4.425297s
Success
error_handling_net.cSuccessNone0.063829s4.485134s
Success
getaddrinfo_test.cSuccessNone0.061331s6.162761s
Success
gethostname.cSuccessNone0.049968s3.979663s
Success
getifaddrs.cSuccessNone0.057273s4.484893s
Success
getsockname.cSuccessNone0.058948s4.365112s
Success
getsockopt.cSuccessNone0.059521s4.433322s
Success
ipv6_basic.cSuccessNone0.063437s4.415486s
Success
makepipe.cSuccessNone0.049513s3.966826s
Success
nonblocking_eagain.cSuccessNone0.062452s4.413280s
Success
pipe.cSuccessNone0.059784s4.423071s
Success
pipe2.cSuccessNone0.059315s4.322247s
Success
pipeinput.cSuccessNone0.061913s4.430393s
Success
pipeinput2.cSuccessNone0.059793s4.463692s
Success
pipeonestring.cSuccessNone0.060691s4.436821s
Success
pipepong.cSuccessNone0.058052s4.402741s
Success
pipewrite.cSuccessNone0.055145s4.393570s
Success
poll.cSuccessNone0.056798s4.345727s
Success
recvfrom-sendto.cSuccessNone0.059139s4.343861s
Success
sendmsg_recvmsg_test.cSuccessNone0.057907s4.367223s
Success
serverclient.cSuccessNone0.060882s4.008738s
Success
shutdown.cSuccessNone0.058116s3.994072s
Success
shutdown_fork.cSuccessNone0.059039s4.421793s
Success
simple-select.cSuccessNone0.061996s4.459531s
Success
simple_epoll.cSuccessNone0.055234s4.317719s
Success
socket.cSuccessNone0.056082s3.996131s
Success
socket_cloexec.cSuccessNone0.055628s4.378643s
Success
socket_options_advanced.cSuccessNone0.065688s4.468661s
Success
socketepoll.cSuccessNone0.054089s3.992928s
Success
socketpair.cSuccessNone0.055194s4.441487s
Success
socketselect.cSuccessNone0.055998s4.356075s
Success
tcp_connect_single.cSuccessNone0.056837s4.361032s
Success
udp_send_recv.cSuccessNone0.165659s4.572054s
Success
uds-getsockname.cSuccessNone0.057366s4.388216s
Success
uds-nb-select.cSuccessNone2.068676s6.618300s
Success
uds-serverclient.cSuccessNone0.059532s4.413956s
Success
uds-socketselect.cSuccessNone0.057852s4.008348s
Success
writev_socket.cSuccessNone0.061242s4.408243s
Success
Process Tests
barrier_test.cSuccessNone0.055608s4.584540s
Success
chain_thread.cSuccessNone1.057844s5.551082s
Success
ctor_syscall_test.cSuccessNone0.045119s4.336027s
Success
cxa_atexit_test.cSuccessNone0.052005s3.937333s
Success
exit.cSuccessNone0.054294s3.911875s
Success
exit_failure.cSuccessNone0.056601s3.968765s
Success
flockfile_test.cSuccessNone0.057048s4.565720s
Success
fork2malloc.cSuccessNone0.056898s4.377988s
Success
fork_select.cSuccessNone0.053872s4.434643s
Success
fork_simple.cSuccessNone0.052254s4.347351s
Success
fork_syscall.cSuccessNone0.061963s4.422228s
Success
fork_tls_ctype.cSuccessNone0.058934s4.414011s
Success
forkandopen.cSuccessNone0.057574s4.395880s
Success
forkdup.cSuccessNone0.056900s4.020271s
Success
forkexecuid.cSuccessNone0.055195s4.469625s
Success
forkexecv-arg.cSuccessNone0.054436s4.379179s
Success
forkexecv.cSuccessNone0.054019s4.376702s
Success
forkfiles.cSuccessNone0.060503s4.389865s
Success
forkmalloc.cSuccessNone0.072662s4.365374s
Success
forknodup.cSuccessNone0.058647s4.470031s
Success
function-ptr.cSuccessNone0.052721s4.297760s
Success
getegid_syscall.cSuccessNone0.058716s4.420518s
Success
getgid_syscall.cSuccessNone0.058614s4.443457s
Success
getpid.cSuccessNone0.050110s4.348977s
Success
getpid_syscall.cSuccessNone0.059492s4.451826s
Success
getppid.cSuccessNone0.056020s4.405853s
Success
getppid_syscall.cSuccessNone0.059650s4.425909s
Success
getuid.cSuccessNone0.058487s4.306968s
Success
getuid_syscall.cSuccessNone0.054086s4.444986s
Success
hello-arg.cSuccessNone0.045987s3.915896s
Success
hello.cSuccessNone0.046873s3.926737s
Success
longjmp.cSuccessNone0.047025s3.932404s
Success
mutex.cSuccessNone2.061914s6.622631s
Success
printf_deadlock_smoke.cSuccessNone0.066253s4.715764s
Success
printf_thread_test.cSuccessNone0.055096s4.524265s
Success
sem_forks.cSuccessNone0.060756s4.400541s
Success
setsid.cSuccessNone0.048909s3.932999s
Success
template.cSuccessNone0.055935s4.409138s
Success
test_exec_nofork.cSuccessNone0.055536s4.323088s
Success
test_unlink_open_file.cSuccessNone0.052401s3.962715s
Success
thread-test.cSuccessNone0.053268s4.496427s
Success
thread.cSuccessNone0.052711s4.504527s
Success
thread_cageid_race.cSuccessNone0.052852s4.492876s
Success
tls_test.cSuccessNone0.053539s4.535421s
Success
uname.cSuccessNone0.049164s4.344334s
Success
wait.cSuccessNone2.055841s5.988840s
Success
waitpid_anychild.cSuccessNone0.055987s4.374867s
Success
waitpid_syscall.cSuccessNone1.056855s5.486405s
Success
waitpid_wnohang.cSuccessNone0.057523s3.992772s
Success
Signal Tests
alarm.cSuccessNone7.054259s11.025280s
Success
eintr_fork_signal.cSuccessNone1.057080s5.433806s
Success
setitimer.cSuccessNone7.056683s10.998077s
Success
sigalrm.cSuccessNone2.055784s5.973298s
Success
sigchld.cSuccessNone1.060054s5.006352s
Success
signal-fork.cSuccessNone4.059547s8.056708s
Success
signal-simple.cSuccessNone0.059107s4.008043s
Success
signal_SIGCHLD.cSuccessNone0.058208s4.410612s
Success
signal_fork.cSuccessNone0.052872s4.432968s
Success
signal_int_ignored.cSuccessNone2.058833s6.445626s
Success
signal_procmask.cSuccessNone0.050634s4.416695s
Success
signal_recursive.cSuccessNone0.050665s3.960480s
Success
signal_sa_mask.cSuccessNone0.051409s3.935694s
Success
sigpipe.cSuccessNone1.066560s5.489376s
Success
sigprocmask.cSuccessNone1.059317s4.959139s
Success
Fail 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
Memory Tests
mmap-negative1.cSuccessNone0.115187s5.075194s
Success
mmap-negative2.cSuccessNone0.218094s4.564337s
Success
Signal Tests
signal_resethand.cSuccessNone1.054035s4.083174s
Success

@rennergade rennergade merged commit 09ba91f into fix-targetcageid Mar 16, 2026
3 checks passed
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.

6 participants