Skip to content

Commit 8d47e8b

Browse files
cjihrigtargos
authored andcommitted
deps: update to uvwasi 0.0.9
Notable changes: - A `DEBUG()` macro and `UVWASI_DEBUG_LOG` build option have been added to improve debugging. - Path length restrictions have been removed across the codebase. - Initial support for `poll_oneoff()` has been added on all platforms. The implementation is based on `uv_poll_t`'s. - A new `uvwasi_size_t` has been introduced across the WASI system call API. This provides consistent 32-bit `size_t`'s. - The cmake test targets are now only generated if uvwasi is the root project to avoid conflicts with targets from embedders. - `uv.h` has been removed from the public headers. - A serialization/deserialization API has been added to simplify the process of working with WASM memory. This also hides many WASI <--> WASM interfacing implementation details from embedders. - A memory corruption bug on Windows related to path resolution has been fixed. PR-URL: #33445 Fixes: #33403 Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Jiawen Geng <[email protected]>
1 parent 9d6fd45 commit 8d47e8b

14 files changed

+1619
-584
lines changed

deps/uvwasi/include/uvwasi.h

+55-51
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55
extern "C" {
66
#endif
77

8-
#include "uv.h"
8+
#include "wasi_serdes.h"
99
#include "wasi_types.h"
10-
#include "fd_table.h"
1110

1211
#define UVWASI_VERSION_MAJOR 0
1312
#define UVWASI_VERSION_MINOR 0
14-
#define UVWASI_VERSION_PATCH 8
13+
#define UVWASI_VERSION_PATCH 9
1514
#define UVWASI_VERSION_HEX ((UVWASI_VERSION_MAJOR << 16) | \
1615
(UVWASI_VERSION_MINOR << 8) | \
1716
(UVWASI_VERSION_PATCH))
@@ -35,16 +34,18 @@ typedef struct uvwasi_mem_s {
3534
uvwasi_realloc realloc;
3635
} uvwasi_mem_t;
3736

37+
struct uvwasi_fd_table_t;
38+
3839
typedef struct uvwasi_s {
39-
struct uvwasi_fd_table_t fds;
40-
size_t argc;
40+
struct uvwasi_fd_table_t* fds;
41+
uvwasi_size_t argc;
4142
char** argv;
4243
char* argv_buf;
43-
size_t argv_buf_size;
44-
size_t envc;
44+
uvwasi_size_t argv_buf_size;
45+
uvwasi_size_t envc;
4546
char** env;
4647
char* env_buf;
47-
size_t env_buf_size;
48+
uvwasi_size_t env_buf_size;
4849
const uvwasi_mem_t* allocator;
4950
} uvwasi_t;
5051

@@ -54,12 +55,12 @@ typedef struct uvwasi_preopen_s {
5455
} uvwasi_preopen_t;
5556

5657
typedef struct uvwasi_options_s {
57-
size_t fd_table_size;
58-
size_t preopenc;
58+
uvwasi_size_t fd_table_size;
59+
uvwasi_size_t preopenc;
5960
uvwasi_preopen_t* preopens;
60-
size_t argc;
61-
char** argv;
62-
char** envp;
61+
uvwasi_size_t argc;
62+
const char** argv;
63+
const char** envp;
6364
uvwasi_fd_t in;
6465
uvwasi_fd_t out;
6566
uvwasi_fd_t err;
@@ -69,17 +70,18 @@ typedef struct uvwasi_options_s {
6970
/* Embedder API. */
7071
uvwasi_errno_t uvwasi_init(uvwasi_t* uvwasi, uvwasi_options_t* options);
7172
void uvwasi_destroy(uvwasi_t* uvwasi);
73+
/* Use int instead of uv_file to avoid needing uv.h */
7274
uvwasi_errno_t uvwasi_embedder_remap_fd(uvwasi_t* uvwasi,
7375
const uvwasi_fd_t fd,
74-
uv_file new_host_fd);
76+
int new_host_fd);
7577
const char* uvwasi_embedder_err_code_to_string(uvwasi_errno_t code);
7678

7779

7880
/* WASI system call API. */
7981
uvwasi_errno_t uvwasi_args_get(uvwasi_t* uvwasi, char** argv, char* argv_buf);
8082
uvwasi_errno_t uvwasi_args_sizes_get(uvwasi_t* uvwasi,
81-
size_t* argc,
82-
size_t* argv_buf_size);
83+
uvwasi_size_t* argc,
84+
uvwasi_size_t* argv_buf_size);
8385
uvwasi_errno_t uvwasi_clock_res_get(uvwasi_t* uvwasi,
8486
uvwasi_clockid_t clock_id,
8587
uvwasi_timestamp_t* resolution);
@@ -91,8 +93,8 @@ uvwasi_errno_t uvwasi_environ_get(uvwasi_t* uvwasi,
9193
char** environment,
9294
char* environ_buf);
9395
uvwasi_errno_t uvwasi_environ_sizes_get(uvwasi_t* uvwasi,
94-
size_t* environ_count,
95-
size_t* environ_buf_size);
96+
uvwasi_size_t* environ_count,
97+
uvwasi_size_t* environ_buf_size);
9698
uvwasi_errno_t uvwasi_fd_advise(uvwasi_t* uvwasi,
9799
uvwasi_fd_t fd,
98100
uvwasi_filesize_t offset,
@@ -129,33 +131,33 @@ uvwasi_errno_t uvwasi_fd_filestat_set_times(uvwasi_t* uvwasi,
129131
uvwasi_errno_t uvwasi_fd_pread(uvwasi_t* uvwasi,
130132
uvwasi_fd_t fd,
131133
const uvwasi_iovec_t* iovs,
132-
size_t iovs_len,
134+
uvwasi_size_t iovs_len,
133135
uvwasi_filesize_t offset,
134-
size_t* nread);
136+
uvwasi_size_t* nread);
135137
uvwasi_errno_t uvwasi_fd_prestat_get(uvwasi_t* uvwasi,
136138
uvwasi_fd_t fd,
137139
uvwasi_prestat_t* buf);
138140
uvwasi_errno_t uvwasi_fd_prestat_dir_name(uvwasi_t* uvwasi,
139141
uvwasi_fd_t fd,
140142
char* path,
141-
size_t path_len);
143+
uvwasi_size_t path_len);
142144
uvwasi_errno_t uvwasi_fd_pwrite(uvwasi_t* uvwasi,
143145
uvwasi_fd_t fd,
144146
const uvwasi_ciovec_t* iovs,
145-
size_t iovs_len,
147+
uvwasi_size_t iovs_len,
146148
uvwasi_filesize_t offset,
147-
size_t* nwritten);
149+
uvwasi_size_t* nwritten);
148150
uvwasi_errno_t uvwasi_fd_read(uvwasi_t* uvwasi,
149151
uvwasi_fd_t fd,
150152
const uvwasi_iovec_t* iovs,
151-
size_t iovs_len,
152-
size_t* nread);
153+
uvwasi_size_t iovs_len,
154+
uvwasi_size_t* nread);
153155
uvwasi_errno_t uvwasi_fd_readdir(uvwasi_t* uvwasi,
154156
uvwasi_fd_t fd,
155157
void* buf,
156-
size_t buf_len,
158+
uvwasi_size_t buf_len,
157159
uvwasi_dircookie_t cookie,
158-
size_t* bufused);
160+
uvwasi_size_t* bufused);
159161
uvwasi_errno_t uvwasi_fd_renumber(uvwasi_t* uvwasi,
160162
uvwasi_fd_t from,
161163
uvwasi_fd_t to);
@@ -171,39 +173,39 @@ uvwasi_errno_t uvwasi_fd_tell(uvwasi_t* uvwasi,
171173
uvwasi_errno_t uvwasi_fd_write(uvwasi_t* uvwasi,
172174
uvwasi_fd_t fd,
173175
const uvwasi_ciovec_t* iovs,
174-
size_t iovs_len,
175-
size_t* nwritten);
176+
uvwasi_size_t iovs_len,
177+
uvwasi_size_t* nwritten);
176178
uvwasi_errno_t uvwasi_path_create_directory(uvwasi_t* uvwasi,
177179
uvwasi_fd_t fd,
178180
const char* path,
179-
size_t path_len);
181+
uvwasi_size_t path_len);
180182
uvwasi_errno_t uvwasi_path_filestat_get(uvwasi_t* uvwasi,
181183
uvwasi_fd_t fd,
182184
uvwasi_lookupflags_t flags,
183185
const char* path,
184-
size_t path_len,
186+
uvwasi_size_t path_len,
185187
uvwasi_filestat_t* buf);
186188
uvwasi_errno_t uvwasi_path_filestat_set_times(uvwasi_t* uvwasi,
187189
uvwasi_fd_t fd,
188190
uvwasi_lookupflags_t flags,
189191
const char* path,
190-
size_t path_len,
192+
uvwasi_size_t path_len,
191193
uvwasi_timestamp_t st_atim,
192194
uvwasi_timestamp_t st_mtim,
193195
uvwasi_fstflags_t fst_flags);
194196
uvwasi_errno_t uvwasi_path_link(uvwasi_t* uvwasi,
195197
uvwasi_fd_t old_fd,
196198
uvwasi_lookupflags_t old_flags,
197199
const char* old_path,
198-
size_t old_path_len,
200+
uvwasi_size_t old_path_len,
199201
uvwasi_fd_t new_fd,
200202
const char* new_path,
201-
size_t new_path_len);
203+
uvwasi_size_t new_path_len);
202204
uvwasi_errno_t uvwasi_path_open(uvwasi_t* uvwasi,
203205
uvwasi_fd_t dirfd,
204206
uvwasi_lookupflags_t dirflags,
205207
const char* path,
206-
size_t path_len,
208+
uvwasi_size_t path_len,
207209
uvwasi_oflags_t o_flags,
208210
uvwasi_rights_t fs_rights_base,
209211
uvwasi_rights_t fs_rights_inheriting,
@@ -212,53 +214,55 @@ uvwasi_errno_t uvwasi_path_open(uvwasi_t* uvwasi,
212214
uvwasi_errno_t uvwasi_path_readlink(uvwasi_t* uvwasi,
213215
uvwasi_fd_t fd,
214216
const char* path,
215-
size_t path_len,
217+
uvwasi_size_t path_len,
216218
char* buf,
217-
size_t buf_len,
218-
size_t* bufused);
219+
uvwasi_size_t buf_len,
220+
uvwasi_size_t* bufused);
219221
uvwasi_errno_t uvwasi_path_remove_directory(uvwasi_t* uvwasi,
220222
uvwasi_fd_t fd,
221223
const char* path,
222-
size_t path_len);
224+
uvwasi_size_t path_len);
223225
uvwasi_errno_t uvwasi_path_rename(uvwasi_t* uvwasi,
224226
uvwasi_fd_t old_fd,
225227
const char* old_path,
226-
size_t old_path_len,
228+
uvwasi_size_t old_path_len,
227229
uvwasi_fd_t new_fd,
228230
const char* new_path,
229-
size_t new_path_len);
231+
uvwasi_size_t new_path_len);
230232
uvwasi_errno_t uvwasi_path_symlink(uvwasi_t* uvwasi,
231233
const char* old_path,
232-
size_t old_path_len,
234+
uvwasi_size_t old_path_len,
233235
uvwasi_fd_t fd,
234236
const char* new_path,
235-
size_t new_path_len);
237+
uvwasi_size_t new_path_len);
236238
uvwasi_errno_t uvwasi_path_unlink_file(uvwasi_t* uvwasi,
237239
uvwasi_fd_t fd,
238240
const char* path,
239-
size_t path_len);
241+
uvwasi_size_t path_len);
240242
uvwasi_errno_t uvwasi_poll_oneoff(uvwasi_t* uvwasi,
241243
const uvwasi_subscription_t* in,
242244
uvwasi_event_t* out,
243-
size_t nsubscriptions,
244-
size_t* nevents);
245+
uvwasi_size_t nsubscriptions,
246+
uvwasi_size_t* nevents);
245247
uvwasi_errno_t uvwasi_proc_exit(uvwasi_t* uvwasi, uvwasi_exitcode_t rval);
246248
uvwasi_errno_t uvwasi_proc_raise(uvwasi_t* uvwasi, uvwasi_signal_t sig);
247-
uvwasi_errno_t uvwasi_random_get(uvwasi_t* uvwasi, void* buf, size_t buf_len);
249+
uvwasi_errno_t uvwasi_random_get(uvwasi_t* uvwasi,
250+
void* buf,
251+
uvwasi_size_t buf_len);
248252
uvwasi_errno_t uvwasi_sched_yield(uvwasi_t* uvwasi);
249253
uvwasi_errno_t uvwasi_sock_recv(uvwasi_t* uvwasi,
250254
uvwasi_fd_t sock,
251255
const uvwasi_iovec_t* ri_data,
252-
size_t ri_data_len,
256+
uvwasi_size_t ri_data_len,
253257
uvwasi_riflags_t ri_flags,
254-
size_t* ro_datalen,
258+
uvwasi_size_t* ro_datalen,
255259
uvwasi_roflags_t* ro_flags);
256260
uvwasi_errno_t uvwasi_sock_send(uvwasi_t* uvwasi,
257261
uvwasi_fd_t sock,
258262
const uvwasi_ciovec_t* si_data,
259-
size_t si_data_len,
263+
uvwasi_size_t si_data_len,
260264
uvwasi_siflags_t si_flags,
261-
size_t* so_datalen);
265+
uvwasi_size_t* so_datalen);
262266
uvwasi_errno_t uvwasi_sock_shutdown(uvwasi_t* uvwasi,
263267
uvwasi_fd_t sock,
264268
uvwasi_sdflags_t how);

deps/uvwasi/include/wasi_serdes.h

+145
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
#ifndef __UVWASI_SERDES_H__
2+
#define __UVWASI_SERDES_H__
3+
4+
#include "wasi_types.h"
5+
6+
/* Basic uint{8,16,32,64}_t read/write functions. */
7+
8+
#define BASIC_TYPE_(name, type) \
9+
void uvwasi_serdes_write_##name(void* ptr, size_t offset, type value); \
10+
type uvwasi_serdes_read_##name(const void* ptr, size_t offset); \
11+
12+
#define BASIC_TYPE(type) BASIC_TYPE_(type, type)
13+
#define BASIC_TYPE_UVWASI(type) BASIC_TYPE_(type, uvwasi_##type)
14+
15+
#define UVWASI_SERDES_SIZE_uint8_t sizeof(uint8_t)
16+
BASIC_TYPE(uint8_t)
17+
#define UVWASI_SERDES_SIZE_uint16_t sizeof(uint16_t)
18+
BASIC_TYPE(uint16_t)
19+
#define UVWASI_SERDES_SIZE_uint32_t sizeof(uint32_t)
20+
BASIC_TYPE(uint32_t)
21+
#define UVWASI_SERDES_SIZE_uint64_t sizeof(uint64_t)
22+
BASIC_TYPE(uint64_t)
23+
24+
#define UVWASI_SERDES_SIZE_advice_t sizeof(uvwasi_advice_t)
25+
BASIC_TYPE_UVWASI(advice_t)
26+
#define UVWASI_SERDES_SIZE_clockid_t sizeof(uvwasi_clockid_t)
27+
BASIC_TYPE_UVWASI(clockid_t)
28+
#define UVWASI_SERDES_SIZE_device_t sizeof(uvwasi_device_t)
29+
BASIC_TYPE_UVWASI(device_t)
30+
#define UVWASI_SERDES_SIZE_dircookie_t sizeof(uvwasi_dircookie_t)
31+
BASIC_TYPE_UVWASI(dircookie_t)
32+
#define UVWASI_SERDES_SIZE_eventrwflags_t sizeof(uvwasi_eventrwflags_t)
33+
BASIC_TYPE_UVWASI(eventrwflags_t)
34+
#define UVWASI_SERDES_SIZE_eventtype_t sizeof(uvwasi_eventtype_t)
35+
BASIC_TYPE_UVWASI(eventtype_t)
36+
#define UVWASI_SERDES_SIZE_exitcode_t sizeof(uvwasi_exitcode_t)
37+
BASIC_TYPE_UVWASI(exitcode_t)
38+
#define UVWASI_SERDES_SIZE_fd_t sizeof(uvwasi_fd_t)
39+
BASIC_TYPE_UVWASI(fd_t)
40+
#define UVWASI_SERDES_SIZE_fdflags_t sizeof(uvwasi_fdflags_t)
41+
BASIC_TYPE_UVWASI(fdflags_t)
42+
#define UVWASI_SERDES_SIZE_filesize_t sizeof(uvwasi_filesize_t)
43+
BASIC_TYPE_UVWASI(filesize_t)
44+
#define UVWASI_SERDES_SIZE_fstflags_t sizeof(uvwasi_fstflags_t)
45+
BASIC_TYPE_UVWASI(fstflags_t)
46+
#define UVWASI_SERDES_SIZE_inode_t sizeof(uvwasi_inode_t)
47+
BASIC_TYPE_UVWASI(inode_t)
48+
#define UVWASI_SERDES_SIZE_linkcount_t sizeof(uvwasi_linkcount_t)
49+
BASIC_TYPE_UVWASI(linkcount_t)
50+
#define UVWASI_SERDES_SIZE_lookupflags_t sizeof(uvwasi_lookupflags_t)
51+
BASIC_TYPE_UVWASI(lookupflags_t)
52+
#define UVWASI_SERDES_SIZE_oflags_t sizeof(uvwasi_oflags_t)
53+
BASIC_TYPE_UVWASI(oflags_t)
54+
#define UVWASI_SERDES_SIZE_preopentype_t sizeof(uvwasi_preopentype_t)
55+
BASIC_TYPE_UVWASI(preopentype_t)
56+
#define UVWASI_SERDES_SIZE_riflags_t sizeof(uvwasi_riflags_t)
57+
BASIC_TYPE_UVWASI(riflags_t)
58+
#define UVWASI_SERDES_SIZE_rights_t sizeof(uvwasi_rights_t)
59+
BASIC_TYPE_UVWASI(rights_t)
60+
#define UVWASI_SERDES_SIZE_roflags_t sizeof(uvwasi_roflags_t)
61+
BASIC_TYPE_UVWASI(roflags_t)
62+
#define UVWASI_SERDES_SIZE_sdflags_t sizeof(uvwasi_sdflags_t)
63+
BASIC_TYPE_UVWASI(sdflags_t)
64+
#define UVWASI_SERDES_SIZE_siflags_t sizeof(uvwasi_siflags_t)
65+
BASIC_TYPE_UVWASI(siflags_t)
66+
#define UVWASI_SERDES_SIZE_size_t sizeof(uvwasi_size_t)
67+
BASIC_TYPE_UVWASI(size_t)
68+
#define UVWASI_SERDES_SIZE_inode_t sizeof(uvwasi_inode_t)
69+
BASIC_TYPE_UVWASI(inode_t)
70+
#define UVWASI_SERDES_SIZE_signal_t sizeof(uvwasi_signal_t)
71+
BASIC_TYPE_UVWASI(signal_t)
72+
#define UVWASI_SERDES_SIZE_subclockflags_t sizeof(uvwasi_subclockflags_t)
73+
BASIC_TYPE_UVWASI(subclockflags_t)
74+
#define UVWASI_SERDES_SIZE_timestamp_t sizeof(uvwasi_timestamp_t)
75+
BASIC_TYPE_UVWASI(timestamp_t)
76+
#define UVWASI_SERDES_SIZE_userdata_t sizeof(uvwasi_userdata_t)
77+
BASIC_TYPE_UVWASI(userdata_t)
78+
#define UVWASI_SERDES_SIZE_whence_t sizeof(uvwasi_whence_t)
79+
BASIC_TYPE_UVWASI(whence_t)
80+
81+
#undef BASIC_TYPE_UVWASI
82+
#undef BASIC_TYPE
83+
#undef BASIC_TYPE_
84+
85+
/* WASI structure read/write functions. */
86+
87+
#define STRUCT(name) \
88+
void uvwasi_serdes_write_##name(void* ptr, \
89+
size_t offset, \
90+
const uvwasi_##name* value); \
91+
void uvwasi_serdes_read_##name(const void* ptr, \
92+
size_t offset, \
93+
uvwasi_##name* value);
94+
95+
/* iovs currently only need to be read from WASM memory. */
96+
#define IOVS_STRUCT(name) \
97+
uvwasi_errno_t uvwasi_serdes_read_##name(const void* ptr, \
98+
size_t end, \
99+
size_t offset, \
100+
uvwasi_##name* value);
101+
102+
#define UVWASI_SERDES_SIZE_ciovec_t 8
103+
IOVS_STRUCT(ciovec_t)
104+
105+
#define UVWASI_SERDES_SIZE_iovec_t 8
106+
IOVS_STRUCT(iovec_t)
107+
108+
#define UVWASI_SERDES_SIZE_fdstat_t 24
109+
STRUCT(fdstat_t)
110+
111+
#define UVWASI_SERDES_SIZE_filestat_t 64
112+
STRUCT(filestat_t)
113+
114+
#define UVWASI_SERDES_SIZE_prestat_t 8
115+
STRUCT(prestat_t)
116+
117+
#define UVWASI_SERDES_SIZE_event_t 32
118+
STRUCT(event_t)
119+
120+
#define UVWASI_SERDES_SIZE_subscription_t 48
121+
STRUCT(subscription_t)
122+
123+
#undef STRUCT
124+
#undef IOVS_STRUCT
125+
126+
uvwasi_errno_t uvwasi_serdes_readv_ciovec_t(const void* ptr,
127+
size_t end,
128+
size_t offset,
129+
uvwasi_ciovec_t* iovs,
130+
uvwasi_size_t iovs_len);
131+
132+
uvwasi_errno_t uvwasi_serdes_readv_iovec_t(const void* ptr,
133+
size_t end,
134+
size_t offset,
135+
uvwasi_iovec_t* iovs,
136+
uvwasi_size_t iovs_len);
137+
138+
/* Helper functions for memory bounds checking. */
139+
int uvwasi_serdes_check_bounds(size_t offset, size_t end, size_t size);
140+
int uvwasi_serdes_check_array_bounds(size_t offset,
141+
size_t end,
142+
size_t size,
143+
size_t count);
144+
145+
#endif /* __UVWASI_SERDES_H__ */

0 commit comments

Comments
 (0)