Skip to content

Commit ade70c6

Browse files
bors[bot]Mark McCaskey
and
Mark McCaskey
committed
Merge #484
484: fix bugs in emscripten socket syscalls r=MarkMcCaskey a=MarkMcCaskey resolves #482 This PR fixes: - incorrect argument order - which cascaded in to a casting issue - which cascaded in to misaligning the arguments of a function - which cascaded in to attempting to access an OOB pointer - sets fd limit to 1024, rather than emscripten's 64 - updates `prlimit64` to return the correct result for `RLIMIT_NOFILE` - fixes bug in `prlimit64` due to a mistransaltion of the emscripten javascript Co-authored-by: Mark McCaskey <mark@wasmer.io>
2 parents 4913cfa + 6f633ce commit ade70c6

File tree

3 files changed

+41
-12
lines changed

3 files changed

+41
-12
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Blocks of changes will separated by version increments.
66

77
## **[Unreleased]**
88

9+
- [#484](https://github.com/wasmerio/wasmer/pull/484) Fix bugs in emscripten socket syscalls
910
- [#476](https://github.com/wasmerio/wasmer/pull/476) Fix bug with wasi::environ_get, fix off by one error in wasi::environ_sizes_get
1011
- [#470](https://github.com/wasmerio/wasmer/pull/470) Add mapdir support to Emscripten, implement getdents for Unix
1112
- [#467](https://github.com/wasmerio/wasmer/pull/467) `wasmer_instantiate` returns better error messages in the runtime C API

lib/emscripten/src/syscalls/mod.rs

+25-9
Original file line numberDiff line numberDiff line change
@@ -425,13 +425,25 @@ pub fn ___syscall146(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 {
425425
}
426426

427427
pub fn ___syscall168(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
428-
debug!("emscripten::___syscall168");
428+
debug!("emscripten::___syscall168 - stub");
429429
-1
430430
}
431431

432-
pub fn ___syscall191(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
433-
debug!("emscripten::___syscall191 - stub");
434-
-1
432+
pub fn ___syscall191(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 {
433+
let _resource: i32 = varargs.get(ctx);
434+
debug!(
435+
"emscripten::___syscall191 - mostly stub, resource: {}",
436+
_resource
437+
);
438+
let rlim_emptr: i32 = varargs.get(ctx);
439+
let rlim_ptr = emscripten_memory_pointer!(ctx.memory(0), rlim_emptr) as *mut u8;
440+
let rlim = unsafe { slice::from_raw_parts_mut(rlim_ptr, 16) };
441+
442+
// set all to RLIM_INIFINTY
443+
LittleEndian::write_i64(&mut rlim[..], -1);
444+
LittleEndian::write_i64(&mut rlim[8..], -1);
445+
446+
0
435447
}
436448

437449
pub fn ___syscall199(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
@@ -543,19 +555,23 @@ pub fn ___syscall340(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
543555
debug!("emscripten::___syscall340 (prlimit64), {}", _which);
544556
// NOTE: Doesn't really matter. Wasm modules cannot exceed WASM_PAGE_SIZE anyway.
545557
let _pid: i32 = varargs.get(ctx);
546-
let _resource: i32 = varargs.get(ctx);
558+
let resource: i32 = varargs.get(ctx);
547559
let _new_limit: u32 = varargs.get(ctx);
548560
let old_limit: u32 = varargs.get(ctx);
549561

562+
let val = match resource {
563+
// RLIMIT_NOFILE
564+
7 => 1024,
565+
_ => -1, // RLIM_INFINITY
566+
};
567+
550568
if old_limit != 0 {
551569
// just report no limits
552570
let buf_ptr = emscripten_memory_pointer!(ctx.memory(0), old_limit) as *mut u8;
553571
let buf = unsafe { slice::from_raw_parts_mut(buf_ptr, 16) };
554572

555-
LittleEndian::write_i32(&mut buf[..], -1); // RLIM_INFINITY
556-
LittleEndian::write_i32(&mut buf[4..], -1); // RLIM_INFINITY
557-
LittleEndian::write_i32(&mut buf[8..], -1); // RLIM_INFINITY
558-
LittleEndian::write_i32(&mut buf[12..], -1); // RLIM_INFINITY
573+
LittleEndian::write_i64(&mut buf[..], val);
574+
LittleEndian::write_i64(&mut buf[8..], val);
559575
}
560576

561577
0

lib/emscripten/src/syscalls/unix.rs

+15-3
Original file line numberDiff line numberDiff line change
@@ -610,15 +610,24 @@ pub fn ___syscall102(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
610610
// recvfrom (socket: c_int, buf: *const c_void, len: size_t, flags: c_int, addr: *const sockaddr, addrlen: socklen_t) -> ssize_t
611611
let socket = socket_varargs.get(ctx);
612612
let buf: u32 = socket_varargs.get(ctx);
613-
let flags = socket_varargs.get(ctx);
614613
let len: i32 = socket_varargs.get(ctx);
614+
let flags: i32 = socket_varargs.get(ctx);
615615
let address: u32 = socket_varargs.get(ctx);
616616
let address_len: u32 = socket_varargs.get(ctx);
617617
let buf_addr = emscripten_memory_pointer!(ctx.memory(0), buf) as _;
618618
let address = emscripten_memory_pointer!(ctx.memory(0), address) as *mut sockaddr;
619619
let address_len_addr =
620620
emscripten_memory_pointer!(ctx.memory(0), address_len) as *mut socklen_t;
621-
unsafe { recvfrom(socket, buf_addr, flags, len, address, address_len_addr) as i32 }
621+
unsafe {
622+
recvfrom(
623+
socket,
624+
buf_addr,
625+
len as usize,
626+
flags,
627+
address,
628+
address_len_addr,
629+
) as i32
630+
}
622631
}
623632
14 => {
624633
debug!("socket: setsockopt");
@@ -764,7 +773,10 @@ pub fn ___syscall142(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
764773
let exceptfds: u32 = varargs.get(ctx);
765774
let _timeout: i32 = varargs.get(ctx);
766775

767-
assert!(nfds <= 64, "`nfds` must be less than or equal to 64");
776+
if nfds > 1024 {
777+
// EINVAL
778+
return -22;
779+
}
768780
assert!(exceptfds == 0, "`exceptfds` is not supporrted");
769781

770782
let readfds_ptr = emscripten_memory_pointer!(ctx.memory(0), readfds) as _;

0 commit comments

Comments
 (0)