Skip to content

Commit fe1496a

Browse files
committed
Replace {environ,size}_{sizes_get,get} C code with Rust
1 parent 69e44ca commit fe1496a

File tree

4 files changed

+65
-80
lines changed

4 files changed

+65
-80
lines changed

wasmtime-wasi/sandboxed-system-primitives/include/wasmtime_ssp.h

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -454,22 +454,6 @@ _Static_assert(_Alignof(__wasi_subscription_t) == 8, "non-wasi data layout");
454454
#define WASMTIME_SSP_SYSCALL_NAME(name)
455455
#endif
456456

457-
__wasi_errno_t wasmtime_ssp_args_get(
458-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
459-
struct argv_environ_values *arg_environ,
460-
#endif
461-
char **argv,
462-
char *argv_buf
463-
) WASMTIME_SSP_SYSCALL_NAME(args_get) __attribute__((__warn_unused_result__));
464-
465-
__wasi_errno_t wasmtime_ssp_args_sizes_get(
466-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
467-
struct argv_environ_values *arg_environ,
468-
#endif
469-
size_t *argc,
470-
size_t *argv_buf_size
471-
) WASMTIME_SSP_SYSCALL_NAME(args_sizes_get) __attribute__((__warn_unused_result__));
472-
473457
__wasi_errno_t wasmtime_ssp_clock_res_get(
474458
__wasi_clockid_t clock_id,
475459
__wasi_timestamp_t *resolution
@@ -481,22 +465,6 @@ __wasi_errno_t wasmtime_ssp_clock_time_get(
481465
__wasi_timestamp_t *time
482466
) WASMTIME_SSP_SYSCALL_NAME(clock_time_get) __attribute__((__warn_unused_result__));
483467

484-
__wasi_errno_t wasmtime_ssp_environ_get(
485-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
486-
struct argv_environ_values *arg_environ,
487-
#endif
488-
char **environ,
489-
char *environ_buf
490-
) WASMTIME_SSP_SYSCALL_NAME(environ_get) __attribute__((__warn_unused_result__));
491-
492-
__wasi_errno_t wasmtime_ssp_environ_sizes_get(
493-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
494-
struct argv_environ_values *arg_environ,
495-
#endif
496-
size_t *environ_count,
497-
size_t *environ_buf_size
498-
) WASMTIME_SSP_SYSCALL_NAME(environ_sizes_get) __attribute__((__warn_unused_result__));
499-
500468
__wasi_errno_t wasmtime_ssp_fd_prestat_get(
501469
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
502470
struct fd_prestats *prestats,

wasmtime-wasi/sandboxed-system-primitives/src/posix.c

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2690,48 +2690,6 @@ __wasi_errno_t wasmtime_ssp_sched_yield(void) {
26902690
return 0;
26912691
}
26922692

2693-
__wasi_errno_t wasmtime_ssp_args_get(
2694-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
2695-
struct argv_environ_values *argv_environ,
2696-
#endif
2697-
char **argv,
2698-
char *argv_buf
2699-
) {
2700-
for (size_t i = 0; i < argv_environ->argc; ++i) {
2701-
argv[i] = argv_buf + (argv_environ->argv[i] - argv_environ->argv_buf);
2702-
}
2703-
argv[argv_environ->argc] = NULL;
2704-
memcpy(argv_buf, argv_environ->argv_buf, argv_environ->argv_buf_size);
2705-
return __WASI_ESUCCESS;
2706-
}
2707-
2708-
__wasi_errno_t wasmtime_ssp_args_sizes_get(
2709-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
2710-
struct argv_environ_values *argv_environ,
2711-
#endif
2712-
size_t *argc,
2713-
size_t *argv_buf_size
2714-
) {
2715-
*argc = argv_environ->argc;
2716-
*argv_buf_size = argv_environ->argv_buf_size;
2717-
return __WASI_ESUCCESS;
2718-
}
2719-
2720-
__wasi_errno_t wasmtime_ssp_environ_get(
2721-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
2722-
struct argv_environ_values *argv_environ,
2723-
#endif
2724-
char **environ,
2725-
char *environ_buf
2726-
) {
2727-
for (size_t i = 0; i < argv_environ->environ_count; ++i) {
2728-
environ[i] = environ_buf + (argv_environ->environ[i] - argv_environ->environ_buf);
2729-
}
2730-
environ[argv_environ->environ_count] = NULL;
2731-
memcpy(environ_buf, argv_environ->environ_buf, argv_environ->environ_buf_size);
2732-
return __WASI_ESUCCESS;
2733-
}
2734-
27352693
__wasi_errno_t wasmtime_ssp_environ_sizes_get(
27362694
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
27372695
struct argv_environ_values *argv_environ,

wasmtime-wasi/src/host_impls.rs

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,64 @@
1-
use super::wasm32;
1+
use super::host;
22

3-
pub fn wasmtime_ssp_proc_exit(rval: wasm32::__wasi_exitcode_t) {
3+
pub unsafe fn wasmtime_ssp_args_get(
4+
argv_environ: &mut host::argv_environ_values,
5+
argv: &mut [*mut host::char],
6+
argv_buf: *mut host::char,
7+
) -> host::__wasi_errno_t {
8+
for i in 0..(*argv_environ).argc {
9+
let buf_off = isize::checked_sub(
10+
*(*argv_environ).argv.offset(i as isize) as _,
11+
(*argv_environ).argv_buf as _,
12+
)
13+
.expect("argv[i] - argv_buf overflows");
14+
argv[i] = argv_buf.offset(buf_off);
15+
}
16+
argv[(*argv_environ).argc] = std::ptr::null_mut();
17+
argv_buf.copy_from((*argv_environ).argv_buf, (*argv_environ).argv_buf_size);
18+
host::__WASI_ESUCCESS as host::__wasi_errno_t
19+
}
20+
21+
pub fn wasmtime_ssp_args_sizes_get(
22+
argv_environ: &mut host::argv_environ_values,
23+
argc: &mut usize,
24+
argv_buf_size: &mut usize,
25+
) -> host::__wasi_errno_t {
26+
*argc = (*argv_environ).argc;
27+
*argv_buf_size = (*argv_environ).argv_buf_size;
28+
host::__WASI_ESUCCESS as host::__wasi_errno_t
29+
}
30+
31+
pub unsafe fn wasmtime_ssp_environ_get(
32+
argv_environ: &mut host::argv_environ_values,
33+
environ: &mut [*mut host::char],
34+
environ_buf: *mut host::char,
35+
) -> host::__wasi_errno_t {
36+
for i in 0..(*argv_environ).environ_count {
37+
let buf_off = isize::checked_sub(
38+
*(*argv_environ).environ.offset(i as isize) as _,
39+
(*argv_environ).environ_buf as _,
40+
)
41+
.expect("environ[i] - environ_buf overflows");
42+
environ[i] = environ_buf.offset(buf_off);
43+
}
44+
environ[(*argv_environ).environ_count] = std::ptr::null_mut();
45+
environ_buf.copy_from(
46+
(*argv_environ).environ_buf,
47+
(*argv_environ).environ_buf_size,
48+
);
49+
host::__WASI_ESUCCESS as host::__wasi_errno_t
50+
}
51+
52+
pub fn wasmtime_ssp_environ_sizes_get(
53+
argv_environ: &mut host::argv_environ_values,
54+
environ_count: &mut usize,
55+
environ_buf_size: &mut usize,
56+
) -> host::__wasi_errno_t {
57+
*environ_count = (*argv_environ).environ_count;
58+
*environ_buf_size = (*argv_environ).environ_buf_size;
59+
host::__WASI_ESUCCESS as host::__wasi_errno_t
60+
}
61+
62+
pub fn wasmtime_ssp_proc_exit(rval: host::__wasi_exitcode_t) {
463
::std::process::exit(rval as i32)
564
}

wasmtime-wasi/src/syscalls.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ syscalls! {
192192
let mut host_argv = Vec::new();
193193
host_argv.resize((*argv_environ).argc + 1, ptr::null_mut());
194194

195-
let e = host::wasmtime_ssp_args_get(argv_environ, host_argv.as_mut_ptr(), host_argv_buf);
195+
let e = host_impls::wasmtime_ssp_args_get(&mut *argv_environ, host_argv.as_mut_slice(), host_argv_buf);
196196

197197
encode_charstar_slice(argv, host_argv, argv_buf, host_argv_buf);
198198

@@ -223,7 +223,7 @@ syscalls! {
223223
let vmctx = &mut *vmctx;
224224
let argv_environ = get_argv_environ(vmctx);
225225

226-
let e = host::wasmtime_ssp_args_sizes_get(argv_environ, &mut host_argc, &mut host_argv_buf_size);
226+
let e = host_impls::wasmtime_ssp_args_sizes_get(&mut *argv_environ, &mut host_argc, &mut host_argv_buf_size);
227227

228228
trace!(" | *argc={:?}", host_argc);
229229
encode_usize_byref(vmctx, argc, host_argc);
@@ -323,7 +323,7 @@ syscalls! {
323323
let mut host_environ = Vec::new();
324324
host_environ.resize((*argv_environ).environ_count + 1, ptr::null_mut());
325325

326-
let e = host::wasmtime_ssp_environ_get(argv_environ, host_environ.as_mut_ptr(), host_environ_buf);
326+
let e = host_impls::wasmtime_ssp_environ_get(&mut *argv_environ, host_environ.as_mut_slice(), host_environ_buf);
327327

328328
encode_charstar_slice(environ, host_environ, environ_buf, host_environ_buf);
329329

@@ -354,7 +354,7 @@ syscalls! {
354354
let vmctx = &mut *vmctx;
355355
let argv_environ = get_argv_environ(vmctx);
356356

357-
let e = host::wasmtime_ssp_environ_sizes_get(argv_environ, &mut host_environ_count, &mut host_environ_buf_size);
357+
let e = host_impls::wasmtime_ssp_environ_sizes_get(&mut *argv_environ, &mut host_environ_count, &mut host_environ_buf_size);
358358

359359
trace!(" | *environ_count={:?}", host_environ_count);
360360
encode_usize_byref(vmctx, environ_count, host_environ_count);

0 commit comments

Comments
 (0)