Skip to content

Use correct types for syscalls #19559

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 6 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions src/lib/libsigs.js
Original file line number Diff line number Diff line change
Expand Up @@ -230,11 +230,11 @@ sigs = {
__pthread_create_js__sig: 'ipppp',
__resumeException__sig: 'vp',
__syscall__newselect__sig: 'iipppp',
__syscall_accept4__sig: 'iippiii',
__syscall_bind__sig: 'iippiii',
__syscall_accept4__sig: 'iippip',
__syscall_bind__sig: 'iipip',
__syscall_chdir__sig: 'ip',
__syscall_chmod__sig: 'ipi',
__syscall_connect__sig: 'iippiii',
__syscall_connect__sig: 'iipip',
__syscall_dup__sig: 'ii',
__syscall_dup3__sig: 'iiii',
__syscall_faccessat__sig: 'iipii',
Expand All @@ -252,27 +252,27 @@ sigs = {
__syscall_ftruncate64__sig: 'iij',
__syscall_getcwd__sig: 'ipp',
__syscall_getdents64__sig: 'iipp',
__syscall_getpeername__sig: 'iippiii',
__syscall_getsockname__sig: 'iippiii',
__syscall_getsockopt__sig: 'iiiippi',
__syscall_getpeername__sig: 'iippp',
__syscall_getsockname__sig: 'iippp',
__syscall_getsockopt__sig: 'iiiippp',
__syscall_ioctl__sig: 'iiip',
__syscall_listen__sig: 'iiiiiii',
__syscall_listen__sig: 'iiip',
__syscall_lstat64__sig: 'ipp',
__syscall_mkdirat__sig: 'iipi',
__syscall_mknodat__sig: 'iipii',
__syscall_newfstatat__sig: 'iippi',
__syscall_openat__sig: 'iipip',
__syscall_pipe__sig: 'ip',
__syscall_poll__sig: 'ipii',
__syscall_poll__sig: 'ippi',
__syscall_readlinkat__sig: 'iippp',
__syscall_recvfrom__sig: 'iippipp',
__syscall_recvmsg__sig: 'iipiiii',
__syscall_recvfrom__sig: 'pippipp',
__syscall_recvmsg__sig: 'pipip',
__syscall_renameat__sig: 'iipip',
__syscall_rmdir__sig: 'ip',
__syscall_sendmsg__sig: 'iipippi',
__syscall_sendto__sig: 'iippipp',
__syscall_shutdown__sig: 'iiiiiii',
__syscall_socket__sig: 'iiiiiii',
__syscall_sendmsg__sig: 'pipip',
__syscall_sendto__sig: 'pippipi',
__syscall_shutdown__sig: 'iiip',
__syscall_socket__sig: 'iiiip',
__syscall_stat64__sig: 'ipp',
__syscall_statfs64__sig: 'ippp',
__syscall_symlinkat__sig: 'ipip',
Expand Down
22 changes: 11 additions & 11 deletions src/lib/libsyscall.js
Original file line number Diff line number Diff line change
Expand Up @@ -345,15 +345,15 @@ var SyscallsLibrary = {
return info;
},
__syscall_socket__deps: ['$SOCKFS'],
__syscall_socket: (domain, type, protocol) => {
__syscall_socket: (domain, type, protocol, varargs) => {
var sock = SOCKFS.createSocket(domain, type, protocol);
#if ASSERTIONS
assert(sock.stream.fd < 64); // XXX ? select() assumes socket fd values are in 0..63
#endif
return sock.stream.fd;
},
__syscall_getsockname__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'],
__syscall_getsockname: (fd, addr, addrlen, d1, d2, d3) => {
__syscall_getsockname: (fd, addr, addrlen, varargs) => {
var sock = getSocketFromFD(fd);
// TODO: sock.saddr should never be undefined, see TODO in websocket_sock_ops.getname
var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || '0.0.0.0'), sock.sport, addrlen);
Expand All @@ -363,7 +363,7 @@ var SyscallsLibrary = {
return 0;
},
__syscall_getpeername__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'],
__syscall_getpeername: (fd, addr, addrlen, d1, d2, d3) => {
__syscall_getpeername: (fd, addr, addrlen, varargs) => {
var sock = getSocketFromFD(fd);
if (!sock.daddr) {
return -{{{ cDefs.ENOTCONN }}}; // The socket is not connected.
Expand All @@ -375,19 +375,19 @@ var SyscallsLibrary = {
return 0;
},
__syscall_connect__deps: ['$getSocketFromFD', '$getSocketAddress'],
__syscall_connect: (fd, addr, addrlen, d1, d2, d3) => {
__syscall_connect: (fd, addr, addrlen, varargs) => {
var sock = getSocketFromFD(fd);
var info = getSocketAddress(addr, addrlen);
sock.sock_ops.connect(sock, info.addr, info.port);
return 0;
},
__syscall_shutdown__deps: ['$getSocketFromFD'],
__syscall_shutdown: (fd, how) => {
__syscall_shutdown: (fd, how, varargs) => {
getSocketFromFD(fd);
return -{{{ cDefs.ENOSYS }}}; // unsupported feature
},
__syscall_accept4__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'],
__syscall_accept4: (fd, addr, addrlen, flags, d1, d2) => {
__syscall_accept4: (fd, addr, addrlen, flags, varargs) => {
var sock = getSocketFromFD(fd);
var newsock = sock.sock_ops.accept(sock);
if (addr) {
Expand All @@ -399,14 +399,14 @@ var SyscallsLibrary = {
return newsock.stream.fd;
},
__syscall_bind__deps: ['$getSocketFromFD', '$getSocketAddress'],
__syscall_bind: (fd, addr, addrlen, d1, d2, d3) => {
__syscall_bind: (fd, addr, addrlen, varargs) => {
var sock = getSocketFromFD(fd);
var info = getSocketAddress(addr, addrlen);
sock.sock_ops.bind(sock, info.addr, info.port);
return 0;
},
__syscall_listen__deps: ['$getSocketFromFD'],
__syscall_listen: (fd, backlog) => {
__syscall_listen: (fd, backlog, varargs) => {
var sock = getSocketFromFD(fd);
sock.sock_ops.listen(sock, backlog);
return 0;
Expand Down Expand Up @@ -437,7 +437,7 @@ var SyscallsLibrary = {
return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port);
},
__syscall_getsockopt__deps: ['$getSocketFromFD'],
__syscall_getsockopt: (fd, level, optname, optval, optlen, d1) => {
__syscall_getsockopt: (fd, level, optname, optval, optlen, varargs) => {
var sock = getSocketFromFD(fd);
// Minimal getsockopt aimed at resolving https://github.com/emscripten-core/emscripten/issues/2211
// so only supports SOL_SOCKET with SO_ERROR.
Expand All @@ -452,7 +452,7 @@ var SyscallsLibrary = {
return -{{{ cDefs.ENOPROTOOPT }}}; // The option is unknown at the level indicated.
},
__syscall_sendmsg__deps: ['$getSocketFromFD', '$getSocketAddress'],
__syscall_sendmsg: (fd, message, flags, d1, d2, d3) => {
__syscall_sendmsg: (fd, message, flags, varargs) => {
var sock = getSocketFromFD(fd);
var iov = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iov, '*') }}};
var num = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iovlen, 'i32') }}};
Expand Down Expand Up @@ -483,7 +483,7 @@ var SyscallsLibrary = {
return sock.sock_ops.sendmsg(sock, view, 0, total, addr, port);
},
__syscall_recvmsg__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'],
__syscall_recvmsg: (fd, message, flags, d1, d2, d3) => {
__syscall_recvmsg: (fd, message, flags, varargs) => {
var sock = getSocketFromFD(fd);
var iov = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iov, '*') }}};
var num = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iovlen, 'i32') }}};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,25 @@
//===----------------------------------------------------------------------===//

#include "sanitizer_platform.h"
#include "sanitizer_platform_limits_posix.h"
#include "sanitizer_common.h"
#include "sanitizer_stoptheworld.h"

#include <fcntl.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
#include <math.h>

#if SANITIZER_EMSCRIPTEN

#include <sys/stat.h>
#include <sys/types.h>

#include <emscripten.h>
#include <emscripten/stack.h>
#include <sys/types.h>
#include <wasi/api.h>
#include <wasi/wasi-helpers.h>

#include "emscripten_internal.h"

Expand Down Expand Up @@ -128,6 +136,92 @@ u64 MonotonicNanoTime() {

void GetMemoryProfile(fill_profile_f cb, uptr *stats) {}

int internal_madvise(uptr addr, uptr length, int advice) {
return 0; // madvise is currently ignored
}

uptr internal_close(fd_t fd) {
return __wasi_fd_close(fd);
}

uptr internal_open(const char *filename, int flags) {
return open(filename, flags);
}

uptr internal_open(const char *filename, int flags, u32 mode) {
return open(filename, flags, mode);
}

uptr internal_read(fd_t fd, void *buf, uptr count) {
__wasi_iovec_t iov = { (uint8_t*)buf, count };
size_t num;
if (__wasi_syscall_ret(__wasi_fd_read(fd, &iov, 1, &num))) {
return -1;
}
return num;
}

uptr internal_write(fd_t fd, const void *buf, uptr count) {
__wasi_ciovec_t iov = { (const uint8_t*)buf, count };
size_t num;
if (__wasi_syscall_ret(__wasi_fd_write(fd, &iov, 1, &num))) {
return -1;
}
return num;
}

uptr internal_stat(const char *path, void *buf) {
return stat(path, (struct stat *)buf);
}

uptr internal_fstat(fd_t fd, void *buf) {
return fstat(fd, (struct stat *)buf);
}

uptr internal_filesize(fd_t fd) {
struct stat st;
if (internal_fstat(fd, &st))
return -1;
return (uptr)st.st_size;
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why are these new functions needed?


uptr internal_dup(int oldfd) {
return dup(oldfd);
}

uptr internal_getpid() {
return 42;
}

uptr internal_sched_yield() {
return sched_yield();
}

void internal_sigfillset(__sanitizer_sigset_t *set) {
sigfillset(set);
}

uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
__sanitizer_sigset_t *oldset) {
return sigprocmask(how, set, oldset);
}

void internal_usleep(u64 useconds) {
usleep(useconds);
}

void internal__exit(int exitcode) {
__wasi_proc_exit(exitcode);
}

tid_t GetTid() {
return gettid();
}

uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp) {
return clock_gettime(clk_id, (struct timespec *)tp);
}

} // namespace __sanitizer

#endif
Loading
Loading