Skip to content

Conversation

@ChinmayShringi
Copy link
Contributor

Purpose

Fixes vmmap memory protection change logic and alignment calculation bugs that caused 8 unit test failures.

Issues

Fixes #498

Changes

1. Fixed change_prot Function

The previous implementation modified entries in-place during iteration while scheduling overlapping intervals for insertion, causing excessive fragmentation.

Root cause:

  • Modified local variable ent_start but not the actual interval tree entry
  • Applied protection changes to entire original entries regardless of target range
  • Created overlapping fragments through insert_overwrite calls

Solution:

  • Implemented two-phase approach: collect affected entries, then modify
  • Properly split entries into three parts: before target (original protection), inside target (new protection), after target (original protection)
  • Added optimization to avoid fragmentation when protection is unchanged
  • Correctly update page_num and npages fields for each split part

2. Fixed find_map_space_with_hint Alignment

The previous implementation calculated aligned_end - rounded_num_pages which did not guarantee start alignment.

Solution:

  • Leverage that rounded_num_pages is already a multiple of pages_per_map
  • Since aligned_end_page is also a multiple, their difference is guaranteed to be aligned
  • Added debug assertions to verify alignment invariants

Testing

All 8 previously failing tests now pass:

  • test_change_prot_end_of_region
  • test_change_prot_exact_boundaries
  • test_change_prot_middle_of_region
  • test_change_prot_multiple_times
  • test_change_prot_spanning_multiple_regions
  • test_change_prot_to_none
  • test_change_prot_to_same_value
  • test_find_map_space_with_hint_alignment_in_pages

- Refactor change_prot to use two-phase approach avoiding fragmentation
- Add optimization to skip splitting when protection unchanged
- Fix find_map_space_with_hint alignment calculation
- Addresses all 8 failing unit tests from issue #498
@ChinmayShringi ChinmayShringi linked an issue Nov 4, 2025 that may be closed by this pull request
@github-actions
Copy link
Contributor

github-actions bot commented Nov 4, 2025

End-to-End Test Report

Test Preview

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases67
Number of Successes67
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

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chmod.cSuccessNone
Mode changed successfully
close.cSuccessNone
File opened and closed 2000 times successfully.
doubleclose.cSuccessNone
dupwrite.cSuccessNone
write succeeded
fchmod.cSuccessNone
Mode changed successfully
fcntl.cSuccessNone
Original FD: 3
F_DUPFD duplicated FD: 100
F_DUPFD_CLOEXEC duplicated FD: 101
Original FD flags: FD flags = 0x0
F_DUPFD duplicated FD flags: FD flags = 0x0
F_DUPFD_CLOEXEC duplicated FD flags: FD flags = 0x1
After F_SETFD on F_DUPFD duplicated FD: FD flags = 0x1
Test completed successfully.
fdatasync.cSuccessNone
filetest.cSuccessNone
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
filetest1000.cSuccessNone
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
fstat.cSuccessNone
running fstat("testfiles/fstatfile.txt")
size: 19
fsync.cSuccessNone
ioctl.cSuccessNone
[For 0 = False and  = True]
[The answers should be F, T, F]

(0) Is the socket set for non-blocking I/O?: 0
[Setting socket for non_blocking I/O]
(1) Is the socket set for non-blocking I/O?: 2048
[Clearing socket for non-blocking I/O]
(2) Is the socket set for non-blocking I/O?: 0

mkdir_rmdir.cSuccessNone
Created directory successfully
Removed directory successfully
open.cSuccessNone
File opened successfully with fd = 3
pread_pwrite.cSuccessNone
[file is opened]
[succeeded write(1) process]
[reading(1) data] from pwrite.txt
[Lind is amazing!]
-----------------------------------
[succeeded write(2) process]
[reading(2) data] from pwrite.txt
[NYU is amazing!]
[succeeded in close]
printf.cSuccessNone
Hello, World!
readbytes.cSuccessNone
This is a test of the wonderful fork call in lind.�
readlink.cSuccessNone
=== Test Case 1: Valid symbolic link ===
Symbolic link points to: /src/RawPOSIX/tmp/testfiles/readlinkfile.txt

=== Test Case 2: Path is not a symbolic link ===
Expected failure: Invalid argument

=== Test Case 3: Symbolic link with buffer too small ===
Symbolic link truncated result: /src/

=== Test Case 4: Non-existent path ===
Expected failure: No such file or directory

rename.cSuccessNone
SUCCESS WITH RENAMING
stat.cSuccessNone
running stat("testfiles/statfile.txt")
size: 18
sync_file_range.cSuccessNone
sync_file_range test completed successfully.
truncate.cSuccessNone
Test truncate(const char *, off_t)
Truncating testfiles/truncatefile.txt from 32 to 155
Success
Truncating testfiles/truncatefile.txt from 155 to 32
Success
Test ftruncate(int, off_t)
Truncating testfiles/truncatefile.txt from 32 to 155
Success
Truncating testfiles/truncatefile.txt from 155 to 32
Success
unlinkat.cSuccessNone
=== Test Case 1: Remove valid file ===
Test Case 1: Successfully removed testfiles/unlinkatfile.txt

=== Test Case 2: Remove non-existent file ===
Test Case 2: Expected failure: No such file or directory

=== Test Case 3: Remove file in a subdirectory ===
Test Case 3: Successfully removed file in subdirectory

=== Test Case 4: Remove a directory with AT_REMOVEDIR ===
Test Case 4: Successfully removed directory testfiles/unlinkatsubdir

=== Test Case 5: Remove a directory without AT_REMOVEDIR ===
Test Case 5: Expected failure: Is a directory

write.cSuccessNone
Hello world from Coulson's WASM
writeloop.cSuccessNone
write succeeded
writepartial.cSuccessNone
write
Memory Tests
brk.cSuccessNone
PASS
malloc.cSuccessNone
memcpy.cSuccessNone
Hello, World!
mmap.cSuccessNone
mmap test: PASS
mmap_file.cSuccessNone
Data written to memory-mapped file: Hello, mmap!
Data read back from memory-mapped file: Hello, mmap!
mprotect.cSuccessNone
Mprotect write test text
sbrk.cSuccessNone
Content in allocated memory: Hello, sbrk memory!
shmtest.cSuccessNone
Networking Tests
gethostname.cSuccessNone
Hostname: buildkitsandbox
makepipe.cSuccessNone
pipepong.cSuccessNone
Parent sending 1
Child received 1
Child sends 2
Parent received 2
Parent sending 3
Child received 3
Child sends 4
Parent received 4
Parent sending 5
Child received 5
Child sends 6
Parent received 6
Parent sending 7
Child received 7
Child sends 8
Parent received 8
Parent sending 9
Child received 9
Child sends 10
Parent received 10
Parent sending 11
Child received 11
Child sends 12
Parent received 12
Parent sending 13
Child received 13
Child sends 14
Parent received 14
Parent sending 15
Child received 15
Child sends 16
Parent received 16
Parent sending 17
Child received 17
Child sends 18
Parent received 18
Parent sending 19
Child received 19
Child sends 20
Parent received 20
Parent sending 21
Child received 21
Child sends 22
Parent received 22
Parent sending 23
Child received 23
Child sends 24
Parent received 24
Parent sending 25
Child received 25
Child sends 26
Parent received 26
Parent sending 27
Child received 27
Child sends 28
Parent received 28
Parent sending 29
Child received 29
Child sends 30
Parent received 30
Parent sending 31
Child received 31
Child sends 32
Parent received 32
Parent sending 33
Child received 33
Child sends 34
Parent received 34
Parent sending 35
Child received 35
Child sends 36
Parent received 36
Parent sending 37
Child received 37
Child sends 38
Parent received 38
Parent sending 39
Child received 39
Child sends 40
Parent received 40
Parent sending 41
Child received 41
Child sends 42
Parent received 42
Parent sending 43
Child received 43
Child sends 44
Parent received 44
Parent sending 45
Child received 45
Child sends 46
Parent received 46
Parent sending 47
Child received 47
Child sends 48
Parent received 48
Parent sending 49
Child received 49
Child sends 50
Parent received 50
Parent sending 51
Child received 51
Child sends 52
Parent received 52
Parent sending 53
Child received 53
Child sends 54
Parent received 54
Parent sending 55
Child received 55
Child sends 56
Parent received 56
Parent sending 57
Child received 57
Child sends 58
Parent received 58
Parent sending 59
Child received 59
Child sends 60
Parent received 60
Parent sending 61
Child received 61
Child sends 62
Parent received 62
Parent sending 63
Child received 63
Child sends 64
Parent received 64
Parent sending 65
Child received 65
Child sends 66
Parent received 66
Parent sending 67
Child received 67
Child sends 68
Parent received 68
Parent sending 69
Child received 69
Child sends 70
Parent received 70
Parent sending 71
Child received 71
Child sends 72
Parent received 72
Parent sending 73
Child received 73
Child sends 74
Parent received 74
Parent sending 75
Child received 75
Child sends 76
Parent received 76
Parent sending 77
Child received 77
Child sends 78
Parent received 78
Parent sending 79
Child received 79
Child sends 80
Parent received 80
Parent sending 81
Child received 81
Child sends 82
Parent received 82
Parent sending 83
Child received 83
Child sends 84
Parent received 84
Parent sending 85
Child received 85
Child sends 86
Parent received 86
Parent sending 87
Child received 87
Child sends 88
Parent received 88
Parent sending 89
Child received 89
Child sends 90
Parent received 90
Parent sending 91
Child received 91
Child sends 92
Parent received 92
Parent sending 93
Child received 93
Child sends 94
Parent received 94
Parent sending 95
Child received 95
Child sends 96
Parent received 96
Parent sending 97
Child received 97
Child sends 98
Parent received 98
Parent sending 99
Child received 99
Child sends 100
Parent received 100
Pipe Pong complete.
Final value: 100
poll.cSuccessNone
stdout is ready for writing.
recvfrom-sendto.cSuccessNone
Client sent: Hello recvfrom!
simple_epoll.cSuccessNone
waiting for epoll event...
got data: hello epoll!

socket.cSuccessNone
Socket opened succesfully.
socket_cloexec.cSuccessNone
SOCK_CLOEXEC is set.
socketpair.cSuccessNone
-->In Xanadu, did Kublai Khan . . .
-->A stately pleasure dome decree . . .
tcp_connect_single.cSuccessNone
Process Tests
chain_thread.cSuccessNone
Outer thread running...
Inner thread running...
Inner thread done.
Outer thread done.
Main thread done.
exit.cSuccessNone
Exiting...

forkexecv-arg.cSuccessNone
Received argument: hello-arg
forkexecv.cSuccessNone
wark
function-ptr.cSuccessNone
Hello, World!
getppid.cSuccessNone
getppid() succeeded
hello-arg.cSuccessNone
Received argument: hello-arg
hello.cSuccessNone
wark
longjmp.cSuccessNone
In main: Calling first_function...
In first_function: Calling second_function...
In second_function: Performing a long jump...
Back in main: long jump returned with value = 42
noforkfiles.cSuccessNone
sem_forks.cSuccessNone
setsid.cSuccessNone
setsid() succeeded.
thread-test.cSuccessNone
Hello from the thread!
Thread has finished execution
thread.cSuccessNone
Hello from thread
wait.cSuccessNone
Parent detected child finished.
Child exited with status 0
waitpid_wnohang.cSuccessNone
Signal Tests
alarm.cSuccessNone
Setting an alarm to trigger in 1 seconds...
Alarm triggered! Signal received: 14
Alarm triggered! Signal received: 14
Alarm triggered! Signal received: 14
setitimer.cSuccessNone
Timer started! SIGALRM will fire every 3 seconds.
Timer expired! Signal received: 14
Timer expired! Signal received: 14
Timer expired! Signal received: 14
sigalrm.cSuccessNone
SIGALRM signals blocked
Alarm Handled. Exiting
sigchld.cSuccessNone
Signal Child Test!
signal-fork.cSuccessNone
Successfully changed the signal handler for Signal 12
Killing Child
Signal Handler Test!
Exiting Child
signal-simple.cSuccessNone
Successfully changed the signal handler for Signal 12
Signal Handler Test!
sigprocmask.cSuccessNone
blocking SIGUSR2
Sending SIGUSR2
Sleeping 1 second
unblocking signal
Signal Handler!
Exiting program
Non Deterministic Tests

Summary

MetricCount
Total Test Cases41
Number of Successes41
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

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chdir_getcwd.cSuccessNone
getcwd() error: Success
getcwd() error: Success
clock_gettime_highlevel.cSuccessNone
Running 1,000,000 iterations...

Start time: 6585 clock ticks
End time: 8911 clock ticks
Elapsed CPU time: 0.002326 seconds

clock_gettime_simple.cSuccessNone
Current time: 1762287009 seconds and 789068413 nanoseconds
dup.cSuccessNone
duped fd: 3
attempting to write to dup() fd

write to dup() fd succeeded
write to old fd succeeded

fchdir.cSuccessNone
getcwd() error: Success
fstatfs.cSuccessNone
Filesystem type: 794c7630
getcwd.cSuccessNone
getcwd() error: Success
read.cSuccessNone
open(): No such file or directory
statfs.cSuccessNone
Filesystem type: 794c7630
Memory Tests
malloc_large.cSuccessNone
0xefffe010: 42
mmap_complicated.cSuccessNone
Parent: Waiting for child to write.
Child: Writing to shared memory.
Parent: Reading from shared memory: 'Hello from the child process!'
Child: Reading from shared memory: 'Hello from the parent process!'
Child: Exiting.
Parent: Reading modified shared memory: 'Hello from the parent process!'
Parent: Exiting.
mmap_shared.cSuccessNone
parent value: 1234, 4321
parent value after fork: 1234, 4321
child value after fork: 1234, 4321
parent value after modification: 2333, 3332
child value after modification: 2333, 4321
segfault.cSuccessNone
pipe() ret: [3, 4]
read() ret: 3
hi
shm.cSuccessNone
Shared memory segment created with id: 1
Parent attached to shared memory at 0xffffe000
Parent wrote: 'Hello from parent'
Child attached to shared memory at 0xffffe000
Child reads: 'Hello from parent'
Child detached from shared memory
Parent reads: 'Hello from child'
Parent detached from shared memory
Shared memory segment removed
vtable.cSuccessNone
Shape 0 area: 12
Shape 1 area: 19.635
Networking Tests
dnstest.cSuccessNone
is sockfd valid? yes
37 is the length sent
53 is the length recieved
the dns lookup yields the ip address: 35.172.89.115
getifaddrs.cSuccessNone
getifaddrs: Bad address
pipe.cSuccessNone
pipe() ret: [3, 4]
write() ret: 3
read() ret: 3
hi
pipe2.cSuccessNone
pipe2() ret: [3, 4]
write() ret: 3
read() ret: 3
hi
pipeinput.cSuccessNone
about to write to pipe in parent
I'm parent with pid: 2
Hey Nick!

pipeinput2.cSuccessNone
about to write to pipe in parent
I'm parent with pid: 2
Hey Nick!

pipeonestring.cSuccessNone
about to write to pipe in parent
I'm child with pid: 0
I'm parent with pid: 2
Hey Nick!
������
pipewrite.cSuccessNone
Made pipe with write end 3 and read end 4
wrote 16
write 16
wrote 16
wrote three messages to the pipe
msg 0, length 16: hello, world #1
msg 1, length 16: hello, world #2
msg 2, length 16: hello, world #3
shutdown_fork.cSuccessNone
5�4d-05
simple-select.cSuccessNone
[child] waiting for data...
[parent] writing message
[child] got data: hello select!

[child] waiting for data...
[child] pipe closed

socketepoll.cSuccessNone
SERVER: New socket bound and listen
SERVER: NEW CONNECTION
CLIENT: Hello message sent
Hello from client
Message Received
CLIENT: sending followup
Did you get my message?
CLIENT: Closed connection
Closed connection on descriptor 6
read error: Connection reset by peer
Process Tests
fork2malloc.cSuccessNone
first malloc
Address of mptr1 0x30010
Contents of mptr1 deadbeef
pre-fork
in child
Address of mptr1 0x30fc0
done
fork_simple.cSuccessNone
Parent pid = 1
Child pid = 2
forkandopen.cSuccessNone
Parent: Testing open in parent: pid 2!
Child: Testing open in child: pid 0!
Parent: Pid 2 opened fd 3
Child: Pid 0 opened fd 3
forkfiles.cSuccessNone
This is a test of the wonderful fork call in lind.
read 51 chars
forkmalloc.cSuccessNone
in child
pointer address is 0x30010
done
forknodup.cSuccessNone
I'm the PARENT
I'm the child
all done
all done
getpid.cSuccessNone
printing pidSuccess
Signal Tests
signal.cSuccessNone
main starts!
parent in loop, pid=1
child ready to kill
child done kill
Caught signal 10
parent in loop, pid=1
Terminated
signal_SIGCHLD.cSuccessNone
main starts!
parent in loop, pid=1
child ready to kill
child done kill
Caught signal 17
Caught signal 10
signal_fork.cSuccessNone
main starts!
parent in loop, pid=1
child ready to kill
child done kill
Caught signal 2
after fork inside signal handler, pid=3
after fork inside signal handler, pid=1
parent in loop, pid=3
parent in loop, pid=1
parent in loop, pid=1
parent in loop, pid=3
parent in loop, pid=1
parent in loop, pid=3
parent in loop, pid=1
parent in loop, pid=3
signal_int_thread.cSuccessNone
main starts!
Hello from thread
thread sleep
thread sleep
child ready to kill
child done kill
child in loop, pid=2
Terminated
Terminated
child in loop, pid=2
child in loop, pid=2
child in loop, pid=2
child in loop, pid=2
signal_longjmp.cSuccessNone
main starts!
parent in loop, pid=1
child ready to kill
child done kill
Caught signal 10
after fork inside signal handler, pid=3
after fork inside signal handler, pid=1
after child longjmp (should only be printed once by parent)
parent in loop, pid=1
back from setjmp: 42! pid=3
parent in loop, pid=1
parent in loop, pid=1
parent in loop, pid=1
signal_nodefer.cSuccessNone
main starts!
parent in loop, pid=1
*child ready to kill
*child sent SIGUSR1
*child ready to send SIGUSR1 again
Caught signal 10
*child done kill
Caught signal 10
start of signal handler
end of signal handler
start of signal handler
end of signal handler
parent in loop, pid=1
parent in loop, pid=1
parent in loop, pid=1
parent in loop, pid=1
signal_procmask.cSuccessNone
Parent: Blocking SIGINT...
Signal 2 is BLOCKED
Parent: SIGINT is blocked. Child will send SIGINT soon...
Child: Sending SIGINT to parent (PID: 1)
Parent: Unblocking SIGINT now.
SIGINT received! (Handled in Parent Process)
Signal 2 is UNBLOCKED
Parent: Waiting for SIGINT...
signal_sa_mask.cSuccessNone
main starts!
parent in loop, pid=1
child ready to kill
child done kill
Caught signal 10
signal 10 done
Caught signal 12
signal 12 done
parent in loop, pid=1
parent in loop, pid=1
parent in loop, pid=1
parent in loop, pid=1

@rennergade
Copy link
Contributor

This is great, thank you @ChinmayShringi

Could we possibly add a full system integration test to confirm this as well?

@github-actions
Copy link
Contributor

End-to-End Test Report

Test Preview

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases74
Number of Successes74
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

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chmod.cSuccessNone
Success
close.cSuccessNone
Success
doubleclose.cSuccessNone
Success
dupwrite.cSuccessNone
Success
fchmod.cSuccessNone
Success
fcntl.cSuccessNone
Success
fdatasync.cSuccessNone
Success
filetest.cSuccessNone
Success
filetest1000.cSuccessNone
Success
fstat.cSuccessNone
Success
fsync.cSuccessNone
Success
ioctl.cSuccessNone
Success
mkdir_rmdir.cSuccessNone
Success
open.cSuccessNone
Success
pread_pwrite.cSuccessNone
Success
printf.cSuccessNone
Success
readbytes.cSuccessNone
Success
readlink.cSuccessNone
Success
rename.cSuccessNone
Success
stat.cSuccessNone
Success
sync_file_range.cSuccessNone
Success
truncate.cSuccessNone
Success
unlinkat.cSuccessNone
Success
write.cSuccessNone
Success
writeloop.cSuccessNone
Success
writepartial.cSuccessNone
Success
Memory Tests
brk.cSuccessNone
Success
malloc.cSuccessNone
Success
memcpy.cSuccessNone
Success
mmap.cSuccessNone
Success
mmap_aligned.cSuccessNone
Success
mmap_file.cSuccessNone
Success
mprotect.cSuccessNone
Success
mprotect_boundary.cSuccessNone
Success
mprotect_end_region.cSuccessNone
Success
mprotect_middle_region.cSuccessNone
Success
mprotect_multiple_times.cSuccessNone
Success
mprotect_same_value.cSuccessNone
Success
mprotect_spanning_regions.cSuccessNone
Success
sbrk.cSuccessNone
Success
shmtest.cSuccessNone
Success
Networking Tests
gethostname.cSuccessNone
Success
makepipe.cSuccessNone
Success
pipepong.cSuccessNone
Success
poll.cSuccessNone
Success
recvfrom-sendto.cSuccessNone
Success
simple_epoll.cSuccessNone
Success
socket.cSuccessNone
Success
socket_cloexec.cSuccessNone
Success
socketpair.cSuccessNone
Success
tcp_connect_single.cSuccessNone
Success
Process Tests
chain_thread.cSuccessNone
Success
exit.cSuccessNone
Success
forkexecv-arg.cSuccessNone
Success
forkexecv.cSuccessNone
Success
function-ptr.cSuccessNone
Success
getppid.cSuccessNone
Success
hello-arg.cSuccessNone
Success
hello.cSuccessNone
Success
longjmp.cSuccessNone
Success
noforkfiles.cSuccessNone
Success
sem_forks.cSuccessNone
Success
setsid.cSuccessNone
Success
thread-test.cSuccessNone
Success
thread.cSuccessNone
Success
wait.cSuccessNone
Success
waitpid_wnohang.cSuccessNone
Success
Signal Tests
alarm.cSuccessNone
Success
setitimer.cSuccessNone
Success
sigalrm.cSuccessNone
Success
sigchld.cSuccessNone
Success
signal-fork.cSuccessNone
Success
signal-simple.cSuccessNone
Success
sigprocmask.cSuccessNone
Success
Non Deterministic Tests

Summary

MetricCount
Total Test Cases41
Number of Successes40
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 run1
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chdir_getcwd.cSuccessNone
Success
clock_gettime_highlevel.cSuccessNone
Success
clock_gettime_simple.cSuccessNone
Success
dup.cSuccessNone
Success
fchdir.cSuccessNone
Success
fstatfs.cSuccessNone
Success
getcwd.cSuccessNone
Success
read.cSuccessNone
Success
statfs.cSuccessNone
Success
Memory Tests
malloc_large.cSuccessNone
Success
mmap_complicated.cSuccessNone
Success
mmap_shared.cSuccessNone
Success
segfault.cSuccessNone
Success
shm.cSuccessNone
Success
vtable.cSuccessNone
Success
Networking Tests
dnstest.cSuccessNone
Success
getifaddrs.cSuccessNone
Success
pipe.cSuccessNone
Success
pipe2.cSuccessNone
Success
pipeinput.cSuccessNone
Success
pipeinput2.cSuccessNone
Success
pipeonestring.cSuccessNone
Success
pipewrite.cSuccessNone
Success
shutdown_fork.cSuccessNone
Success
simple-select.cSuccessNone
Success
socketepoll.cFailureLind_wasm_Timeout
Timed Out (timeout: 10s)
Process Tests
fork2malloc.cSuccessNone
Success
fork_simple.cSuccessNone
Success
forkandopen.cSuccessNone
Success
forkfiles.cSuccessNone
Success
forkmalloc.cSuccessNone
Success
forknodup.cSuccessNone
Success
getpid.cSuccessNone
Success
Signal Tests
signal.cSuccessNone
Success
signal_SIGCHLD.cSuccessNone
Success
signal_fork.cSuccessNone
Success
signal_int_thread.cSuccessNone
Success
signal_longjmp.cSuccessNone
Success
signal_nodefer.cSuccessNone
Success
signal_procmask.cSuccessNone
Success
signal_sa_mask.cSuccessNone
Success

@Yaxuan-w
Copy link
Member

CI test failed. Should we fix this before merge?

@rennergade
Copy link
Contributor

CI test failed. Should we fix this before merge?

I'll rerun this but I'm 99% certain that it's unrelated to this PR and due to this: #489

@github-actions
Copy link
Contributor

End-to-End Test Report

Test Preview

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases74
Number of Successes74
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

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chmod.cSuccessNone
Success
close.cSuccessNone
Success
doubleclose.cSuccessNone
Success
dupwrite.cSuccessNone
Success
fchmod.cSuccessNone
Success
fcntl.cSuccessNone
Success
fdatasync.cSuccessNone
Success
filetest.cSuccessNone
Success
filetest1000.cSuccessNone
Success
fstat.cSuccessNone
Success
fsync.cSuccessNone
Success
ioctl.cSuccessNone
Success
mkdir_rmdir.cSuccessNone
Success
open.cSuccessNone
Success
pread_pwrite.cSuccessNone
Success
printf.cSuccessNone
Success
readbytes.cSuccessNone
Success
readlink.cSuccessNone
Success
rename.cSuccessNone
Success
stat.cSuccessNone
Success
sync_file_range.cSuccessNone
Success
truncate.cSuccessNone
Success
unlinkat.cSuccessNone
Success
write.cSuccessNone
Success
writeloop.cSuccessNone
Success
writepartial.cSuccessNone
Success
Memory Tests
brk.cSuccessNone
Success
malloc.cSuccessNone
Success
memcpy.cSuccessNone
Success
mmap.cSuccessNone
Success
mmap_aligned.cSuccessNone
Success
mmap_file.cSuccessNone
Success
mprotect.cSuccessNone
Success
mprotect_boundary.cSuccessNone
Success
mprotect_end_region.cSuccessNone
Success
mprotect_middle_region.cSuccessNone
Success
mprotect_multiple_times.cSuccessNone
Success
mprotect_same_value.cSuccessNone
Success
mprotect_spanning_regions.cSuccessNone
Success
sbrk.cSuccessNone
Success
shmtest.cSuccessNone
Success
Networking Tests
gethostname.cSuccessNone
Success
makepipe.cSuccessNone
Success
pipepong.cSuccessNone
Success
poll.cSuccessNone
Success
recvfrom-sendto.cSuccessNone
Success
simple_epoll.cSuccessNone
Success
socket.cSuccessNone
Success
socket_cloexec.cSuccessNone
Success
socketpair.cSuccessNone
Success
tcp_connect_single.cSuccessNone
Success
Process Tests
chain_thread.cSuccessNone
Success
exit.cSuccessNone
Success
forkexecv-arg.cSuccessNone
Success
forkexecv.cSuccessNone
Success
function-ptr.cSuccessNone
Success
getppid.cSuccessNone
Success
hello-arg.cSuccessNone
Success
hello.cSuccessNone
Success
longjmp.cSuccessNone
Success
noforkfiles.cSuccessNone
Success
sem_forks.cSuccessNone
Success
setsid.cSuccessNone
Success
thread-test.cSuccessNone
Success
thread.cSuccessNone
Success
wait.cSuccessNone
Success
waitpid_wnohang.cSuccessNone
Success
Signal Tests
alarm.cSuccessNone
Success
setitimer.cSuccessNone
Success
sigalrm.cSuccessNone
Success
sigchld.cSuccessNone
Success
signal-fork.cSuccessNone
Success
signal-simple.cSuccessNone
Success
sigprocmask.cSuccessNone
Success
Non Deterministic Tests

Summary

MetricCount
Total Test Cases41
Number of Successes40
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 run1
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chdir_getcwd.cSuccessNone
Success
clock_gettime_highlevel.cSuccessNone
Success
clock_gettime_simple.cSuccessNone
Success
dup.cSuccessNone
Success
fchdir.cSuccessNone
Success
fstatfs.cSuccessNone
Success
getcwd.cSuccessNone
Success
read.cSuccessNone
Success
statfs.cSuccessNone
Success
Memory Tests
malloc_large.cSuccessNone
Success
mmap_complicated.cSuccessNone
Success
mmap_shared.cSuccessNone
Success
segfault.cSuccessNone
Success
shm.cSuccessNone
Success
vtable.cSuccessNone
Success
Networking Tests
dnstest.cSuccessNone
Success
getifaddrs.cSuccessNone
Success
pipe.cSuccessNone
Success
pipe2.cSuccessNone
Success
pipeinput.cSuccessNone
Success
pipeinput2.cSuccessNone
Success
pipeonestring.cSuccessNone
Success
pipewrite.cSuccessNone
Success
shutdown_fork.cSuccessNone
Success
simple-select.cSuccessNone
Success
socketepoll.cFailureLind_wasm_Timeout
Timed Out (timeout: 10s)
Process Tests
fork2malloc.cSuccessNone
Success
fork_simple.cSuccessNone
Success
forkandopen.cSuccessNone
Success
forkfiles.cSuccessNone
Success
forkmalloc.cSuccessNone
Success
forknodup.cSuccessNone
Success
getpid.cSuccessNone
Success
Signal Tests
signal.cSuccessNone
Success
signal_SIGCHLD.cSuccessNone
Success
signal_fork.cSuccessNone
Success
signal_int_thread.cSuccessNone
Success
signal_longjmp.cSuccessNone
Success
signal_nodefer.cSuccessNone
Success
signal_procmask.cSuccessNone
Success
signal_sa_mask.cSuccessNone
Success

size_t large_size = 100 * PAGESIZE;
unsigned char *large = mmap(NULL, large_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (large == MAP_FAILED) {
Copy link
Contributor

Choose a reason for hiding this comment

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

think all of these checking statements would be better off as asserts across all these tests

@github-actions
Copy link
Contributor

End-to-End Test Report

Test Preview

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases75
Number of Successes73
Number of Failures2
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 Failure1
Number of Timeout During Lind Wasm run1
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chmod.cSuccessNone
Success
close.cSuccessNone
Success
doubleclose.cSuccessNone
Success
dupwrite.cSuccessNone
Success
fchmod.cSuccessNone
Success
fcntl.cSuccessNone
Success
fdatasync.cSuccessNone
Success
filetest.cSuccessNone
Success
filetest1000.cSuccessNone
Success
fstat.cSuccessNone
Success
fsync.cSuccessNone
Success
ioctl.cSuccessNone
Success
mkdir_rmdir.cSuccessNone
Success
open.cSuccessNone
Success
pread_pwrite.cSuccessNone
Success
printf.cSuccessNone
Success
readbytes.cSuccessNone
Success
readlink.cSuccessNone
Success
rename.cSuccessNone
Success
stat.cSuccessNone
Success
sync_file_range.cSuccessNone
Success
truncate.cSuccessNone
Success
unlinkat.cSuccessNone
Success
write.cSuccessNone
Success
writeloop.cSuccessNone
Success
writepartial.cSuccessNone
Success
Memory Tests
brk.cSuccessNone
Success
malloc.cSuccessNone
Success
memcpy.cSuccessNone
Success
mmap.cSuccessNone
Success
mmap_aligned.cFailureLind_wasm_Segmentation_Fault
/tmp/wasmtest_artifacts_3uufly00/memory_tests/deterministic/mmap_aligned.c:37: int main(void): Assertion `p == (void *)aligned_addr && "MAP_FIXED didn't honor requested address"' failed.
Error: failed to run main module `/tmp/wasmtest_artifacts_3uufly00/memory_tests/deterministic/mmap_aligned.cwasm`

Caused by:
0: failed to invoke command default
1: error while executing at wasm backtrace:
0: 0x38565 - mmap_aligned.wasm!abort
1: 0x1daa - mmap_aligned.wasm!__assert_fail_base
2: 0x1f7f - mmap_aligned.wasm!__assert_fail
3: 0x1207 - mmap_aligned.wasm!__original_main
4: 0xd8e - mmap_aligned.wasm!_start
5: 0x9ba4b - mmap_aligned.wasm!_start.command_export
note: using the WASMTIME_BACKTRACE_DETAILS=1 environment variable may show more debugging information
2: wasm trap: wasm unreachable instruction executed

mmap_file.cSuccessNone
Success
mprotect.cSuccessNone
Success
mprotect_boundary.cSuccessNone
Success
mprotect_end_region.cSuccessNone
Success
mprotect_middle_region.cSuccessNone
Success
mprotect_multiple_times.cSuccessNone
Success
mprotect_same_value.cSuccessNone
Success
mprotect_spanning_regions.cSuccessNone
Success
sbrk.cSuccessNone
Success
shmtest.cSuccessNone
Success
Networking Tests
gethostname.cSuccessNone
Success
makepipe.cSuccessNone
Success
pipepong.cSuccessNone
Success
poll.cSuccessNone
Success
recvfrom-sendto.cSuccessNone
Success
simple_epoll.cSuccessNone
Success
socket.cSuccessNone
Success
socket_cloexec.cSuccessNone
Success
socketpair.cSuccessNone
Success
tcp_connect_single.cSuccessNone
Success
Process Tests
chain_thread.cSuccessNone
Success
exit.cSuccessNone
Success
forkexecv-arg.cSuccessNone
Success
forkexecv.cSuccessNone
Success
function-ptr.cSuccessNone
Success
getppid.cSuccessNone
Success
hello-arg.cSuccessNone
Success
hello.cSuccessNone
Success
longjmp.cSuccessNone
Success
mutex.cSuccessNone
Success
noforkfiles.cSuccessNone
Success
sem_forks.cFailureLind_wasm_Timeout
Timed Out (timeout: 10s)
setsid.cSuccessNone
Success
thread-test.cSuccessNone
Success
thread.cSuccessNone
Success
wait.cSuccessNone
Success
waitpid_wnohang.cSuccessNone
Success
Signal Tests
alarm.cSuccessNone
Success
setitimer.cSuccessNone
Success
sigalrm.cSuccessNone
Success
sigchld.cSuccessNone
Success
signal-fork.cSuccessNone
Success
signal-simple.cSuccessNone
Success
sigprocmask.cSuccessNone
Success
Non Deterministic Tests

Summary

MetricCount
Total Test Cases41
Number of Successes41
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

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chdir_getcwd.cSuccessNone
Success
clock_gettime_highlevel.cSuccessNone
Success
clock_gettime_simple.cSuccessNone
Success
dup.cSuccessNone
Success
fchdir.cSuccessNone
Success
fstatfs.cSuccessNone
Success
getcwd.cSuccessNone
Success
read.cSuccessNone
Success
statfs.cSuccessNone
Success
Memory Tests
malloc_large.cSuccessNone
Success
mmap_complicated.cSuccessNone
Success
mmap_shared.cSuccessNone
Success
segfault.cSuccessNone
Success
shm.cSuccessNone
Success
vtable.cSuccessNone
Success
Networking Tests
dnstest.cSuccessNone
Success
getifaddrs.cSuccessNone
Success
pipe.cSuccessNone
Success
pipe2.cSuccessNone
Success
pipeinput.cSuccessNone
Success
pipeinput2.cSuccessNone
Success
pipeonestring.cSuccessNone
Success
pipewrite.cSuccessNone
Success
shutdown_fork.cSuccessNone
Success
simple-select.cSuccessNone
Success
socketepoll.cSuccessNone
Success
Process Tests
fork2malloc.cSuccessNone
Success
fork_simple.cSuccessNone
Success
forkandopen.cSuccessNone
Success
forkfiles.cSuccessNone
Success
forkmalloc.cSuccessNone
Success
forknodup.cSuccessNone
Success
getpid.cSuccessNone
Success
Signal Tests
signal.cSuccessNone
Success
signal_SIGCHLD.cSuccessNone
Success
signal_fork.cSuccessNone
Success
signal_int_thread.cSuccessNone
Success
signal_longjmp.cSuccessNone
Success
signal_nodefer.cSuccessNone
Success
signal_procmask.cSuccessNone
Success
signal_sa_mask.cSuccessNone
Success

@github-actions
Copy link
Contributor

End-to-End Test Report

Test Preview

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases75
Number of Successes75
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

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chmod.cSuccessNone
Success
close.cSuccessNone
Success
doubleclose.cSuccessNone
Success
dupwrite.cSuccessNone
Success
fchmod.cSuccessNone
Success
fcntl.cSuccessNone
Success
fdatasync.cSuccessNone
Success
filetest.cSuccessNone
Success
filetest1000.cSuccessNone
Success
fstat.cSuccessNone
Success
fsync.cSuccessNone
Success
ioctl.cSuccessNone
Success
mkdir_rmdir.cSuccessNone
Success
open.cSuccessNone
Success
pread_pwrite.cSuccessNone
Success
printf.cSuccessNone
Success
readbytes.cSuccessNone
Success
readlink.cSuccessNone
Success
rename.cSuccessNone
Success
stat.cSuccessNone
Success
sync_file_range.cSuccessNone
Success
truncate.cSuccessNone
Success
unlinkat.cSuccessNone
Success
write.cSuccessNone
Success
writeloop.cSuccessNone
Success
writepartial.cSuccessNone
Success
Memory Tests
brk.cSuccessNone
Success
malloc.cSuccessNone
Success
memcpy.cSuccessNone
Success
mmap.cSuccessNone
Success
mmap_aligned.cSuccessNone
Success
mmap_file.cSuccessNone
Success
mprotect.cSuccessNone
Success
mprotect_boundary.cSuccessNone
Success
mprotect_end_region.cSuccessNone
Success
mprotect_middle_region.cSuccessNone
Success
mprotect_multiple_times.cSuccessNone
Success
mprotect_same_value.cSuccessNone
Success
mprotect_spanning_regions.cSuccessNone
Success
sbrk.cSuccessNone
Success
shmtest.cSuccessNone
Success
Networking Tests
gethostname.cSuccessNone
Success
makepipe.cSuccessNone
Success
pipepong.cSuccessNone
Success
poll.cSuccessNone
Success
recvfrom-sendto.cSuccessNone
Success
simple_epoll.cSuccessNone
Success
socket.cSuccessNone
Success
socket_cloexec.cSuccessNone
Success
socketpair.cSuccessNone
Success
tcp_connect_single.cSuccessNone
Success
Process Tests
chain_thread.cSuccessNone
Success
exit.cSuccessNone
Success
forkexecv-arg.cSuccessNone
Success
forkexecv.cSuccessNone
Success
function-ptr.cSuccessNone
Success
getppid.cSuccessNone
Success
hello-arg.cSuccessNone
Success
hello.cSuccessNone
Success
longjmp.cSuccessNone
Success
mutex.cSuccessNone
Success
noforkfiles.cSuccessNone
Success
sem_forks.cSuccessNone
Success
setsid.cSuccessNone
Success
thread-test.cSuccessNone
Success
thread.cSuccessNone
Success
wait.cSuccessNone
Success
waitpid_wnohang.cSuccessNone
Success
Signal Tests
alarm.cSuccessNone
Success
setitimer.cSuccessNone
Success
sigalrm.cSuccessNone
Success
sigchld.cSuccessNone
Success
signal-fork.cSuccessNone
Success
signal-simple.cSuccessNone
Success
sigprocmask.cSuccessNone
Success
Non Deterministic Tests

Summary

MetricCount
Total Test Cases41
Number of Successes41
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

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chdir_getcwd.cSuccessNone
Success
clock_gettime_highlevel.cSuccessNone
Success
clock_gettime_simple.cSuccessNone
Success
dup.cSuccessNone
Success
fchdir.cSuccessNone
Success
fstatfs.cSuccessNone
Success
getcwd.cSuccessNone
Success
read.cSuccessNone
Success
statfs.cSuccessNone
Success
Memory Tests
malloc_large.cSuccessNone
Success
mmap_complicated.cSuccessNone
Success
mmap_shared.cSuccessNone
Success
segfault.cSuccessNone
Success
shm.cSuccessNone
Success
vtable.cSuccessNone
Success
Networking Tests
dnstest.cSuccessNone
Success
getifaddrs.cSuccessNone
Success
pipe.cSuccessNone
Success
pipe2.cSuccessNone
Success
pipeinput.cSuccessNone
Success
pipeinput2.cSuccessNone
Success
pipeonestring.cSuccessNone
Success
pipewrite.cSuccessNone
Success
shutdown_fork.cSuccessNone
Success
simple-select.cSuccessNone
Success
socketepoll.cSuccessNone
Success
Process Tests
fork2malloc.cSuccessNone
Success
fork_simple.cSuccessNone
Success
forkandopen.cSuccessNone
Success
forkfiles.cSuccessNone
Success
forkmalloc.cSuccessNone
Success
forknodup.cSuccessNone
Success
getpid.cSuccessNone
Success
Signal Tests
signal.cSuccessNone
Success
signal_SIGCHLD.cSuccessNone
Success
signal_fork.cSuccessNone
Success
signal_int_thread.cSuccessNone
Success
signal_longjmp.cSuccessNone
Success
signal_nodefer.cSuccessNone
Success
signal_procmask.cSuccessNone
Success
signal_sa_mask.cSuccessNone
Success

Copy link
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.

this looks great to me now. approved.

@rennergade rennergade merged commit c046cbe into main Nov 20, 2025
2 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.

vmmap: Fix vmmap according to failing unit tests

4 participants