Skip to content

Fix INTERNAL_SYSCALL uninitialized resultvar#996

Open
rishabhBudhouliya wants to merge 1 commit intomainfrom
setgid-fix
Open

Fix INTERNAL_SYSCALL uninitialized resultvar#996
rishabhBudhouliya wants to merge 1 commit intomainfrom
setgid-fix

Conversation

@rishabhBudhouliya
Copy link
Copy Markdown
Contributor

@rishabhBudhouliya rishabhBudhouliya commented Apr 1, 2026

Purpose

As reported in Lind-Project/lind-wasm-apps#161, nginx fails when setgid returns a non-zero value.

>> cat lindfs/var/log/nginx/error.log 
2026/03/26 16:17:37 [emerg] 3#0: setgid(65534) failed
2026/03/26 16:17:37 [alert] 2#0: worker process 3 exited with fatal code 2 and cannot be respawned

Upon investigation, nginx calls setgid which goes through this trace

  1. int
    __setgid (gid_t gid)
    {
    #ifdef __NR_setgid32
    return INLINE_SETXID_SYSCALL (setgid32, 1, gid);
    #else
    return INLINE_SETXID_SYSCALL (setgid, 1, gid);
  2. #define INTERNAL_SYSCALL(name, nr, args...) \
    ({ \
    register unsigned int resultvar; \
    INTERNAL_SYSCALL_MAIN_##nr (name, args); \
    (int) resultvar; })
    #define INTERNAL_SYSCALL_NCS(name, nr, args...) \
    ({ \
    register unsigned int resultvar; \
    INTERNAL_SYSCALL_MAIN_NCS_##nr (name, args); \
    (int) resultvar; })

The register unsigned int resultvar; is uninitialized which returns a garbage value back to nginx.

Fix

Initialize resultvar as 0 solved the problem

Test

lind@9d66bdc4863c:~/lind-wasm-apps$  bash nginx/test.sh 
[nginx-test] nginx binary found at: /home/lind/lind-wasm/lindfs/usr/sbin/nginx
[nginx-test] starting nginx on port 8080...
[nginx-test] nginx ready (PID 273205)

[nginx-test] === Running nginx tests ===

[nginx-test] [PASS] GET index page
[nginx-test] [PASS] HEAD request
[nginx-test] [PASS] 404 error page
[nginx-test] [PASS] Static file serving
[nginx-test] [PASS] Content-Length validation
[nginx-test] [PASS] POST method
[nginx-test] [PASS] Multiple sequential requests
[nginx-test] [PASS] Keepalive connection reuse
[nginx-test] [PASS] Concurrent requests

[nginx-test] 9/9 tests passed, 0 failed
[nginx-test] Log saved to: /tmp/nginx_test_results.log

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 1, 2026

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: 3
[Cage | geteuid] PASS: 1000000 calls returned 10
[Grate|geteuid] PASS

STDERR:

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

STDERR:

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

[Grate|interpose-exit] PASS

STDERR:

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

STDERR:

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

STDERR:

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

STDERR:

multi-register_grate.cSuccess
STDOUT:
[Grate|multi-register_grate] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|multi-register_grate] Registering getuid handler for cage 2 in grate 1 with fn ptr addr: 4
[Grate|multi-register_grate] Handling function ptr: 3 from cage: 1
[Grate|multi-register_grate] In multi-register_grate 1 handler for cage: 1
[Grate|multi-register_grate] Handling function ptr: 4 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:

race-test_grate.cSuccess
STDOUT:
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: 3
[Grate|geteuid] Handling function ptr: 3 from cage: 1
[Grate|geteuid] In geteuid_grate 1 handler for cage: 1
[Cage | geteuid] PASS: geteuid ret = 10
[Grate|geteuid] PASS

STDERR:

wasm harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases197
Number of Successes196
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.042948s4.405335s
Success
chdir_getcwd.cSuccessNone0.041955s4.319075s
Success
chmod.cSuccessNone0.048585s4.255954s
Success
clock_gettime_highlevel.cSuccessNone0.278998s4.630483s
Success
clock_gettime_simple.cSuccessNone0.038225s4.405489s
Success
cloexec.cSuccessNone0.046920s4.044627s
Success
close.cSuccessNone0.047440s4.333466s
Success
creat_access.cSuccessNone0.048891s4.491506s
Success
doubleclose.cSuccessNone0.039847s3.968898s
Success
dup.cSuccessNone0.037914s4.257606s
Success
dup2.cSuccessNone0.042894s3.919383s
Success
dup3.cSuccessNone0.043544s4.429970s
Success
dupwrite.cSuccessNone0.044638s3.864574s
Success
etc_conf.cSuccessNone0.039510s4.222308s
Success
fchdir.cSuccessNone0.048052s4.489032s
Success
fchmod.cSuccessNone0.046849s4.481908s
Success
fcntl.cSuccessNone0.042789s4.310216s
Success
fdatasync.cSuccessNone0.044732s4.402338s
Success
filetest.cSuccessNone0.045191s4.036977s
Success
filetest1000.cSuccessNone0.050403s4.058818s
Success
flock.cSuccessNone0.052082s4.467679s
Success
fstat.cSuccessNone0.047436s4.444535s
Success
fstatfs.cSuccessNone0.041675s4.401481s
Success
fsync.cSuccessNone0.046594s4.432083s
Success
ftruncate.cSuccessNone0.046497s4.305767s
Success
getcwd.cSuccessNone0.043014s4.511348s
Success
getrandom.cSuccessNone0.045139s4.454506s
Success
ioctl.cSuccessNone0.048527s4.487510s
Success
link.cSuccessNone0.049018s4.442983s
Success
locale_test.cSuccessNone0.056117s6.070356s
Success
lseek.cSuccessNone0.050430s4.509781s
Success
mkdir_rmdir.cSuccessNone0.046153s4.466333s
Success
mkfifo_test.cSuccessNone0.051260s4.521138s
Success
mknod.cSuccessNone0.043435s4.276519s
Success
nocancel_io.cSuccessNone0.050069s5.712220s
Success
open.cSuccessNone0.040899s4.392822s
Success
openat.cSuccessNone0.041938s4.355023s
Success
path_conversion_safety.cSuccessNone0.048478s4.401346s
Success
pread_pwrite.cSuccessNone0.044988s4.427529s
Success
printf.cSuccessNone0.038737s4.004691s
Success
prlimit64.cSuccessNone0.041645s3.999839s
Success
read.cSuccessNone0.046399s4.397840s
Success
readbytes.cSuccessNone0.042947s4.024440s
Success
readlink.cSuccessNone0.043192s4.241105s
Success
readlinkat.cSuccessNone0.048269s4.410043s
Success
readv_writev_test.cSuccessNone0.047236s4.399890s
Success
rename.cSuccessNone0.048495s4.475376s
Success
sc-writev.cSuccessNone0.045313s4.408494s
Success
stat.cSuccessNone0.047073s4.442775s
Success
statfs.cSuccessNone0.042252s4.464788s
Success
sync_file_range.cSuccessNone0.043389s4.452712s
Success
timespec_time_t_compat.cSuccessNone0.042969s5.727775s
Success
truncate.cSuccessNone0.046320s4.319183s
Success
unlink.cSuccessNone0.047269s4.469249s
Success
unlinkat.cSuccessNone0.044868s4.269723s
Success
write.cSuccessNone0.041243s3.978075s
Success
writeloop.cSuccessNone0.049344s4.011531s
Success
writepartial.cSuccessNone0.046212s4.019043s
Success
writev.cSuccessNone0.047603s4.415363s
Success
Math Tests
math_link_smoke.cSuccessNone0.049794s3.900650s
Success
math_tests.cSuccessNone0.052196s4.117896s
Success
Memory Tests
brk.cSuccessNone0.043230s4.381381s
Success
fork_large_memory.cSuccessNone0.074572s4.493795s
Success
malloc.cSuccessNone0.041179s3.934143s
Success
malloc_large.cSuccessNone0.042869s4.264664s
Success
memcpy.cSuccessNone0.040602s3.880326s
Success
memory_error_test.cSuccessNone0.047753s4.388347s
Success
mmap.cSuccessNone0.039443s4.370100s
Success
mmap_aligned.cSuccessNone0.040818s4.354243s
Success
mmap_complicated.cSuccessNone0.044421s4.354780s
Success
mmap_file.cSuccessNone0.045137s4.329355s
Success
mmap_shared.cSuccessNone0.045792s4.450190s
Success
mmaptest.cSuccessNone0.041933s4.921209s
Success
mprotect.cSuccessNone0.039641s4.287102s
Success
mprotect_boundary.cSuccessNone0.040134s4.313520s
Success
mprotect_end_region.cSuccessNone0.038719s4.323502s
Success
mprotect_middle_region.cSuccessNone0.040100s4.292352s
Success
mprotect_multiple_times.cSuccessNone0.041532s4.382511s
Success
mprotect_same_value.cSuccessNone0.040374s4.338696s
Success
mprotect_spanning_regions.cSuccessNone0.040037s4.305646s
Success
sbrk.cSuccessNone0.041635s4.519143s
Success
segfault.cSuccessNone0.044463s4.324186s
Success
shm.cSuccessNone0.045387s4.423904s
Success
shmtest.cSuccessNone0.042103s4.327023s
Success
tcache_test.cFailureUnknown_Failure0.048090s4.675941s
tcache reuse: yes
thread_malloc_sequential.cSuccessNone0.046061s4.457466s
Success
vtable.cSuccessNone0.050592s3.941385s
Success
Networking Tests
accept4.cSuccessNone0.049926s4.348411s
Success
dns_resolve_test.cSuccessNone0.044654s6.004716s
Success
dnstest.cSuccessNone0.045215s4.249714s
Success
epoll_edge_triggered.cSuccessNone0.200992s4.516568s
Success
epollcreate1.cSuccessNone0.045996s4.393466s
Success
error_handling_net.cSuccessNone0.052172s4.408463s
Success
getaddrinfo_test.cSuccessNone0.047311s6.044247s
Success
getaddrinfo_unspec.cSuccessNone0.066715s6.129802s
Success
gethostname.cSuccessNone0.040812s3.952626s
Success
getifaddrs.cSuccessNone0.046801s4.377743s
Success
getsockname.cSuccessNone0.046490s4.333629s
Success
getsockopt.cSuccessNone0.047401s4.273158s
Success
ipv6_basic.cSuccessNone0.049076s4.407220s
Success
makepipe.cSuccessNone0.039112s3.875807s
Success
nonblocking_eagain.cSuccessNone0.049580s4.363001s
Success
pipe.cSuccessNone0.046230s4.346258s
Success
pipe2.cSuccessNone0.046218s4.311931s
Success
pipeinput.cSuccessNone0.046694s4.335460s
Success
pipeinput2.cSuccessNone0.048162s4.358148s
Success
pipeonestring.cSuccessNone0.048026s4.336619s
Success
pipepong.cSuccessNone0.046242s4.372659s
Success
pipewrite.cSuccessNone0.042214s4.414199s
Success
poll.cSuccessNone0.044864s4.257196s
Success
recvfrom-sendto.cSuccessNone0.048449s4.363014s
Success
sendmsg_recvmsg_test.cSuccessNone0.045098s4.311667s
Success
serverclient.cSuccessNone0.045289s3.897701s
Success
shutdown.cSuccessNone0.047729s3.912869s
Success
shutdown_fork.cSuccessNone0.046287s4.410128s
Success
simple-select.cSuccessNone0.046510s4.362185s
Success
simple_epoll.cSuccessNone0.045435s4.290012s
Success
socket.cSuccessNone0.043786s3.893072s
Success
socket_cloexec.cSuccessNone0.044993s4.306379s
Success
socket_options_advanced.cSuccessNone0.049261s4.305994s
Success
socketepoll.cSuccessNone0.044394s3.914657s
Success
socketpair.cSuccessNone0.044080s4.300539s
Success
socketselect.cSuccessNone0.044289s4.277700s
Success
udp_send_recv.cSuccessNone0.151941s4.491485s
Success
uds-getsockname.cSuccessNone0.046007s4.330742s
Success
uds-nb-select.cSuccessNone2.052570s6.490185s
Success
uds-serverclient.cSuccessNone0.049870s4.395014s
Success
uds-socketselect.cSuccessNone0.046768s3.955175s
Success
writev_socket.cSuccessNone0.047294s4.344496s
Success
Process Tests
barrier_test.cSuccessNone0.043165s4.472917s
Success
chain_thread.cSuccessNone1.045625s5.408232s
Success
ctor_syscall_test.cSuccessNone0.035823s4.230631s
Success
cxa_atexit_test.cSuccessNone0.042885s3.850866s
Success
execve_shebang.cSuccessNone0.045094s4.286691s
Success
exit.cSuccessNone0.041662s3.852495s
Success
exit_failure.cSuccessNone0.044411s3.931562s
Success
exit_group_thread.cSuccessNone0.045547s4.424763s
Success
flockfile_test.cSuccessNone0.044506s4.445280s
Success
fork2malloc.cSuccessNone0.046641s4.320206s
Success
fork_select.cSuccessNone0.043852s4.295558s
Success
fork_simple.cSuccessNone0.042666s4.265667s
Success
fork_syscall.cSuccessNone0.048437s4.352163s
Success
fork_tls_ctype.cSuccessNone0.047350s4.352741s
Success
forkandopen.cSuccessNone0.045056s4.280112s
Success
forkdup.cSuccessNone0.045715s3.911033s
Success
forkexecuid.cSuccessNone0.042609s4.379851s
Success
forkexecv-arg.cSuccessNone0.043496s4.358795s
Success
forkexecv.cSuccessNone0.042278s4.308380s
Success
forkfiles.cSuccessNone0.045043s4.306615s
Success
forkmalloc.cSuccessNone0.045977s4.301130s
Success
forknodup.cSuccessNone0.044942s4.274078s
Success
function-ptr.cSuccessNone0.040794s4.254101s
Success
getegid_syscall.cSuccessNone0.044915s4.319785s
Success
getgid_syscall.cSuccessNone0.045315s4.300687s
Success
getpid.cSuccessNone0.037978s4.188892s
Success
getpid_syscall.cSuccessNone0.045617s4.320812s
Success
getppid.cSuccessNone0.045003s4.336126s
Success
getppid_syscall.cSuccessNone0.048228s4.317166s
Success
getuid.cSuccessNone0.044510s4.240859s
Success
getuid_syscall.cSuccessNone0.043354s4.318514s
Success
hello-arg.cSuccessNone0.037445s3.850627s
Success
hello.cSuccessNone0.036443s3.853430s
Success
longjmp.cSuccessNone0.037358s3.890533s
Success
mutex.cSuccessNone2.047582s6.511555s
Success
printf_deadlock_smoke.cSuccessNone0.051391s4.563362s
Success
printf_thread_test.cSuccessNone0.043170s4.448993s
Success
sem_forks.cSuccessNone0.046334s4.297295s
Success
setsid.cSuccessNone0.037504s3.840115s
Success
template.cSuccessNone0.043604s4.279712s
Success
test_exec_nofork.cSuccessNone0.044576s4.320928s
Success
test_unlink_open_file.cSuccessNone0.040707s3.849236s
Success
thread-test.cSuccessNone0.040788s4.406153s
Success
thread.cSuccessNone0.040481s4.397311s
Success
thread_cageid_race.cSuccessNone0.040978s4.409322s
Success
tls_test.cSuccessNone0.043334s4.415520s
Success
uname.cSuccessNone0.039586s4.223685s
Success
wait.cSuccessNone2.043647s5.933347s
Success
waitpid_anychild.cSuccessNone0.044682s4.329269s
Success
waitpid_syscall.cSuccessNone1.044829s5.346685s
Success
waitpid_wnohang.cSuccessNone0.045109s3.922460s
Success
Signal Tests
alarm.cSuccessNone7.042955s10.899988s
Success
eintr_fork_signal.cSuccessNone1.046652s5.334771s
Success
kill.cSuccessNone1.053671s5.415393s
Success
setitimer.cSuccessNone7.044898s10.931836s
Success
sigalrm.cSuccessNone2.046211s5.907280s
Success
sigchld.cSuccessNone1.047067s4.984528s
Success
signal-fork.cSuccessNone4.046186s7.955287s
Success
signal-simple.cSuccessNone0.046658s3.886763s
Success
signal_SIGCHLD.cSuccessNone0.043653s4.327985s
Success
signal_fork.cSuccessNone0.041376s4.311612s
Success
signal_int_ignored.cSuccessNone2.044197s6.351926s
Success
signal_kill_cleanup.cSuccessNone1.043111s5.303488s
Success
signal_procmask.cSuccessNone0.040123s4.266204s
Success
signal_recursive.cSuccessNone0.039570s3.857645s
Success
signal_sa_mask.cSuccessNone0.040633s3.874010s
Success
sigpipe.cSuccessNone1.046212s5.359979s
Success
sigprocmask.cSuccessNone1.044443s4.929541s
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.084466s4.558102s
Success
mmap-negative2.cSuccessNone0.083741s4.575825s
Success
Signal Tests
signal_resethand.cSuccessNone1.045604s4.938808s
Success

@rishabhBudhouliya
Copy link
Copy Markdown
Contributor Author

rishabhBudhouliya commented Apr 1, 2026

As I was reading more about how we handle no-op syscalls in modified glibc, it would be more coherent and clean using the INLINE_SYSCALL_CALL macro to stub this kernel path which was mistakenly missed instead of fixing the header files of a specific port.

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.

1 participant