Skip to content

Commit ada070e

Browse files
cjihrigcodebytere
authored andcommittedMar 17, 2020
deps: update to uvwasi 0.0.5
This version improves file descriptor renumbering, and as a result fixes uvwasi_fd_renumber(). PR-URL: #31432 Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: David Carlier <devnexen@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
1 parent a8e2f40 commit ada070e

File tree

9 files changed

+340
-294
lines changed

9 files changed

+340
-294
lines changed
 

‎deps/uvwasi/include/fd_table.h

+14-8
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,21 @@ uvwasi_errno_t uvwasi_fd_table_init(struct uvwasi_s* uvwasi,
3131
uint32_t init_size);
3232
void uvwasi_fd_table_free(struct uvwasi_s* uvwasi,
3333
struct uvwasi_fd_table_t* table);
34+
uvwasi_errno_t uvwasi_fd_table_insert(struct uvwasi_s* uvwasi,
35+
struct uvwasi_fd_table_t* table,
36+
uv_file fd,
37+
const char* mapped_path,
38+
const char* real_path,
39+
uvwasi_filetype_t type,
40+
uvwasi_rights_t rights_base,
41+
uvwasi_rights_t rights_inheriting,
42+
int preopen,
43+
struct uvwasi_fd_wrap_t** wrap);
3444
uvwasi_errno_t uvwasi_fd_table_insert_preopen(struct uvwasi_s* uvwasi,
3545
struct uvwasi_fd_table_t* table,
3646
const uv_file fd,
3747
const char* path,
3848
const char* real_path);
39-
uvwasi_errno_t uvwasi_fd_table_insert_fd(struct uvwasi_s* uvwasi,
40-
struct uvwasi_fd_table_t* table,
41-
const uv_file fd,
42-
const int flags,
43-
const char* path,
44-
uvwasi_rights_t rights_base,
45-
uvwasi_rights_t rights_inheriting,
46-
struct uvwasi_fd_wrap_t* wrap);
4749
uvwasi_errno_t uvwasi_fd_table_get(const struct uvwasi_fd_table_t* table,
4850
const uvwasi_fd_t id,
4951
struct uvwasi_fd_wrap_t** wrap,
@@ -52,5 +54,9 @@ uvwasi_errno_t uvwasi_fd_table_get(const struct uvwasi_fd_table_t* table,
5254
uvwasi_errno_t uvwasi_fd_table_remove(struct uvwasi_s* uvwasi,
5355
struct uvwasi_fd_table_t* table,
5456
const uvwasi_fd_t id);
57+
uvwasi_errno_t uvwasi_fd_table_renumber(struct uvwasi_s* uvwasi,
58+
struct uvwasi_fd_table_t* table,
59+
const uvwasi_fd_t dst,
60+
const uvwasi_fd_t src);
5561

5662
#endif /* __UVWASI_FD_TABLE_H__ */

‎deps/uvwasi/include/uvwasi.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ extern "C" {
1111

1212
#define UVWASI_VERSION_MAJOR 0
1313
#define UVWASI_VERSION_MINOR 0
14-
#define UVWASI_VERSION_PATCH 4
14+
#define UVWASI_VERSION_PATCH 5
1515
#define UVWASI_VERSION_HEX ((UVWASI_VERSION_MAJOR << 16) | \
1616
(UVWASI_VERSION_MINOR << 8) | \
1717
(UVWASI_VERSION_PATCH))

‎deps/uvwasi/src/fd_table.c

+103-236
Large diffs are not rendered by default.

‎deps/uvwasi/src/uv_mapping.c

+23
Original file line numberDiff line numberDiff line change
@@ -241,3 +241,26 @@ void uvwasi__stat_to_filestat(const uv_stat_t* stat, uvwasi_filestat_t* fs) {
241241
fs->st_mtim = uvwasi__timespec_to_timestamp(&stat->st_mtim);
242242
fs->st_ctim = uvwasi__timespec_to_timestamp(&stat->st_ctim);
243243
}
244+
245+
246+
uvwasi_errno_t uvwasi__get_filetype_by_fd(uv_file fd, uvwasi_filetype_t* type) {
247+
uv_fs_t req;
248+
int r;
249+
250+
r = uv_fs_fstat(NULL, &req, fd, NULL);
251+
if (r != 0) {
252+
*type = UVWASI_FILETYPE_UNKNOWN;
253+
uv_fs_req_cleanup(&req);
254+
return uvwasi__translate_uv_error(r);
255+
}
256+
257+
*type = uvwasi__stat_to_filetype(&req.statbuf);
258+
uv_fs_req_cleanup(&req);
259+
260+
if (*type == UVWASI_FILETYPE_SOCKET_STREAM &&
261+
uv_guess_handle(fd) == UV_UDP) {
262+
*type = UVWASI_FILETYPE_SOCKET_DGRAM;
263+
}
264+
265+
return UVWASI_ESUCCESS;
266+
}

‎deps/uvwasi/src/uv_mapping.h

+1
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ int uvwasi__translate_to_uv_signal(uvwasi_signal_t sig);
1111
uvwasi_timestamp_t uvwasi__timespec_to_timestamp(const uv_timespec_t* ts);
1212
uvwasi_filetype_t uvwasi__stat_to_filetype(const uv_stat_t* stat);
1313
void uvwasi__stat_to_filestat(const uv_stat_t* stat, uvwasi_filestat_t* fs);
14+
uvwasi_errno_t uvwasi__get_filetype_by_fd(uv_file fd, uvwasi_filetype_t* type);
1415

1516
#endif /* __UVWASI_UV_MAPPING_H__ */

‎deps/uvwasi/src/uvwasi.c

+31-49
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "uv_mapping.h"
2323
#include "fd_table.h"
2424
#include "clocks.h"
25+
#include "wasi_rights.h"
2526

2627
/* TODO(cjihrig): PATH_MAX_BYTES shouldn't be stack allocated. On Windows, paths
2728
can be 32k long, and this PATH_MAX_BYTES is an artificial limitation. */
@@ -1485,41 +1486,10 @@ uvwasi_errno_t uvwasi_fd_readdir(uvwasi_t* uvwasi,
14851486
uvwasi_errno_t uvwasi_fd_renumber(uvwasi_t* uvwasi,
14861487
uvwasi_fd_t from,
14871488
uvwasi_fd_t to) {
1488-
struct uvwasi_fd_wrap_t* to_wrap;
1489-
struct uvwasi_fd_wrap_t* from_wrap;
1490-
uv_fs_t req;
1491-
uvwasi_errno_t err;
1492-
int r;
1493-
14941489
if (uvwasi == NULL)
14951490
return UVWASI_EINVAL;
14961491

1497-
if (from == to)
1498-
return UVWASI_ESUCCESS;
1499-
1500-
err = uvwasi_fd_table_get(&uvwasi->fds, from, &from_wrap, 0, 0);
1501-
if (err != UVWASI_ESUCCESS)
1502-
return err;
1503-
1504-
err = uvwasi_fd_table_get(&uvwasi->fds, to, &to_wrap, 0, 0);
1505-
if (err != UVWASI_ESUCCESS) {
1506-
uv_mutex_unlock(&from_wrap->mutex);
1507-
return err;
1508-
}
1509-
1510-
r = uv_fs_close(NULL, &req, to_wrap->fd, NULL);
1511-
uv_fs_req_cleanup(&req);
1512-
if (r != 0) {
1513-
uv_mutex_unlock(&from_wrap->mutex);
1514-
uv_mutex_unlock(&to_wrap->mutex);
1515-
return uvwasi__translate_uv_error(r);
1516-
}
1517-
1518-
memcpy(to_wrap, from_wrap, sizeof(*to_wrap));
1519-
to_wrap->id = to;
1520-
uv_mutex_unlock(&from_wrap->mutex);
1521-
uv_mutex_unlock(&to_wrap->mutex);
1522-
return uvwasi_fd_table_remove(uvwasi, &uvwasi->fds, from);
1492+
return uvwasi_fd_table_renumber(uvwasi, &uvwasi->fds, to, from);
15231493
}
15241494

15251495

@@ -1871,8 +1841,11 @@ uvwasi_errno_t uvwasi_path_open(uvwasi_t* uvwasi,
18711841
char resolved_path[PATH_MAX_BYTES];
18721842
uvwasi_rights_t needed_inheriting;
18731843
uvwasi_rights_t needed_base;
1844+
uvwasi_rights_t max_base;
1845+
uvwasi_rights_t max_inheriting;
18741846
struct uvwasi_fd_wrap_t* dirfd_wrap;
1875-
struct uvwasi_fd_wrap_t wrap;
1847+
struct uvwasi_fd_wrap_t *wrap;
1848+
uvwasi_filetype_t filetype;
18761849
uvwasi_errno_t err;
18771850
uv_fs_t req;
18781851
int flags;
@@ -1956,33 +1929,42 @@ uvwasi_errno_t uvwasi_path_open(uvwasi_t* uvwasi,
19561929
return uvwasi__translate_uv_error(r);
19571930
}
19581931

1959-
err = uvwasi_fd_table_insert_fd(uvwasi,
1960-
&uvwasi->fds,
1961-
r,
1962-
flags,
1963-
resolved_path,
1964-
fs_rights_base,
1965-
fs_rights_inheriting,
1966-
&wrap);
1967-
if (err != UVWASI_ESUCCESS) {
1968-
uv_mutex_unlock(&dirfd_wrap->mutex);
1932+
/* Not all platforms support UV_FS_O_DIRECTORY, so get the file type and check
1933+
it here. */
1934+
err = uvwasi__get_filetype_by_fd(r, &filetype);
1935+
if (err != UVWASI_ESUCCESS)
19691936
goto close_file_and_error_exit;
1970-
}
19711937

1972-
/* Not all platforms support UV_FS_O_DIRECTORY, so enforce it here as well. */
19731938
if ((o_flags & UVWASI_O_DIRECTORY) != 0 &&
1974-
wrap.type != UVWASI_FILETYPE_DIRECTORY) {
1975-
uv_mutex_unlock(&dirfd_wrap->mutex);
1976-
uvwasi_fd_table_remove(uvwasi, &uvwasi->fds, wrap.id);
1939+
filetype != UVWASI_FILETYPE_DIRECTORY) {
19771940
err = UVWASI_ENOTDIR;
19781941
goto close_file_and_error_exit;
19791942
}
19801943

1981-
*fd = wrap.id;
1944+
err = uvwasi__get_rights(r, flags, filetype, &max_base, &max_inheriting);
1945+
if (err != UVWASI_ESUCCESS)
1946+
goto close_file_and_error_exit;
1947+
1948+
err = uvwasi_fd_table_insert(uvwasi,
1949+
&uvwasi->fds,
1950+
r,
1951+
resolved_path,
1952+
resolved_path,
1953+
filetype,
1954+
fs_rights_base & max_base,
1955+
fs_rights_inheriting & max_inheriting,
1956+
0,
1957+
&wrap);
1958+
if (err != UVWASI_ESUCCESS)
1959+
goto close_file_and_error_exit;
1960+
1961+
*fd = wrap->id;
1962+
uv_mutex_unlock(&wrap->mutex);
19821963
uv_mutex_unlock(&dirfd_wrap->mutex);
19831964
return UVWASI_ESUCCESS;
19841965

19851966
close_file_and_error_exit:
1967+
uv_mutex_unlock(&dirfd_wrap->mutex);
19861968
uv_fs_close(NULL, &req, r, NULL);
19871969
uv_fs_req_cleanup(&req);
19881970
return err;

‎deps/uvwasi/src/wasi_rights.c

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include "uv.h"
2+
#include "wasi_rights.h"
3+
#include "wasi_types.h"
4+
5+
6+
uvwasi_errno_t uvwasi__get_rights(uv_file fd,
7+
int flags,
8+
uvwasi_filetype_t type,
9+
uvwasi_rights_t* rights_base,
10+
uvwasi_rights_t* rights_inheriting) {
11+
int read_or_write_only;
12+
13+
if (type == UVWASI_FILETYPE_UNKNOWN)
14+
return UVWASI_EINVAL;
15+
16+
switch (type) {
17+
case UVWASI_FILETYPE_REGULAR_FILE:
18+
*rights_base = UVWASI__RIGHTS_REGULAR_FILE_BASE;
19+
*rights_inheriting = UVWASI__RIGHTS_REGULAR_FILE_INHERITING;
20+
break;
21+
22+
case UVWASI_FILETYPE_DIRECTORY:
23+
*rights_base = UVWASI__RIGHTS_DIRECTORY_BASE;
24+
*rights_inheriting = UVWASI__RIGHTS_DIRECTORY_INHERITING;
25+
break;
26+
27+
case UVWASI_FILETYPE_SOCKET_STREAM:
28+
case UVWASI_FILETYPE_SOCKET_DGRAM:
29+
*rights_base = UVWASI__RIGHTS_SOCKET_BASE;
30+
*rights_inheriting = UVWASI__RIGHTS_SOCKET_INHERITING;
31+
break;
32+
33+
case UVWASI_FILETYPE_CHARACTER_DEVICE:
34+
if (uv_guess_handle(fd) == UV_TTY) {
35+
*rights_base = UVWASI__RIGHTS_TTY_BASE;
36+
*rights_inheriting = UVWASI__RIGHTS_TTY_INHERITING;
37+
} else {
38+
*rights_base = UVWASI__RIGHTS_CHARACTER_DEVICE_BASE;
39+
*rights_inheriting = UVWASI__RIGHTS_CHARACTER_DEVICE_INHERITING;
40+
}
41+
break;
42+
43+
case UVWASI_FILETYPE_BLOCK_DEVICE:
44+
*rights_base = UVWASI__RIGHTS_BLOCK_DEVICE_BASE;
45+
*rights_inheriting = UVWASI__RIGHTS_BLOCK_DEVICE_INHERITING;
46+
break;
47+
48+
default:
49+
*rights_base = 0;
50+
*rights_inheriting = 0;
51+
}
52+
53+
/* Disable read/write bits depending on access mode. */
54+
read_or_write_only = flags & (UV_FS_O_RDONLY | UV_FS_O_WRONLY | UV_FS_O_RDWR);
55+
56+
if (read_or_write_only == UV_FS_O_RDONLY)
57+
*rights_base &= ~UVWASI_RIGHT_FD_WRITE;
58+
else if (read_or_write_only == UV_FS_O_WRONLY)
59+
*rights_base &= ~UVWASI_RIGHT_FD_READ;
60+
61+
return UVWASI_ESUCCESS;
62+
}

‎deps/uvwasi/src/wasi_rights.h

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#ifndef __UVWASI_WASI_RIGHTS_H__
2+
#define __UVWASI_WASI_RIGHTS_H__
3+
4+
#include "wasi_types.h"
5+
6+
#define UVWASI__RIGHTS_ALL (UVWASI_RIGHT_FD_DATASYNC | \
7+
UVWASI_RIGHT_FD_READ | \
8+
UVWASI_RIGHT_FD_SEEK | \
9+
UVWASI_RIGHT_FD_FDSTAT_SET_FLAGS | \
10+
UVWASI_RIGHT_FD_SYNC | \
11+
UVWASI_RIGHT_FD_TELL | \
12+
UVWASI_RIGHT_FD_WRITE | \
13+
UVWASI_RIGHT_FD_ADVISE | \
14+
UVWASI_RIGHT_FD_ALLOCATE | \
15+
UVWASI_RIGHT_PATH_CREATE_DIRECTORY | \
16+
UVWASI_RIGHT_PATH_CREATE_FILE | \
17+
UVWASI_RIGHT_PATH_LINK_SOURCE | \
18+
UVWASI_RIGHT_PATH_LINK_TARGET | \
19+
UVWASI_RIGHT_PATH_OPEN | \
20+
UVWASI_RIGHT_FD_READDIR | \
21+
UVWASI_RIGHT_PATH_READLINK | \
22+
UVWASI_RIGHT_PATH_RENAME_SOURCE | \
23+
UVWASI_RIGHT_PATH_RENAME_TARGET | \
24+
UVWASI_RIGHT_PATH_FILESTAT_GET | \
25+
UVWASI_RIGHT_PATH_FILESTAT_SET_SIZE | \
26+
UVWASI_RIGHT_PATH_FILESTAT_SET_TIMES | \
27+
UVWASI_RIGHT_FD_FILESTAT_GET | \
28+
UVWASI_RIGHT_FD_FILESTAT_SET_TIMES | \
29+
UVWASI_RIGHT_FD_FILESTAT_SET_SIZE | \
30+
UVWASI_RIGHT_PATH_SYMLINK | \
31+
UVWASI_RIGHT_PATH_UNLINK_FILE | \
32+
UVWASI_RIGHT_PATH_REMOVE_DIRECTORY | \
33+
UVWASI_RIGHT_POLL_FD_READWRITE | \
34+
UVWASI_RIGHT_SOCK_SHUTDOWN)
35+
36+
#define UVWASI__RIGHTS_BLOCK_DEVICE_BASE UVWASI__RIGHTS_ALL
37+
#define UVWASI__RIGHTS_BLOCK_DEVICE_INHERITING UVWASI__RIGHTS_ALL
38+
39+
#define UVWASI__RIGHTS_CHARACTER_DEVICE_BASE UVWASI__RIGHTS_ALL
40+
#define UVWASI__RIGHTS_CHARACTER_DEVICE_INHERITING UVWASI__RIGHTS_ALL
41+
42+
#define UVWASI__RIGHTS_REGULAR_FILE_BASE (UVWASI_RIGHT_FD_DATASYNC | \
43+
UVWASI_RIGHT_FD_READ | \
44+
UVWASI_RIGHT_FD_SEEK | \
45+
UVWASI_RIGHT_FD_FDSTAT_SET_FLAGS | \
46+
UVWASI_RIGHT_FD_SYNC | \
47+
UVWASI_RIGHT_FD_TELL | \
48+
UVWASI_RIGHT_FD_WRITE | \
49+
UVWASI_RIGHT_FD_ADVISE | \
50+
UVWASI_RIGHT_FD_ALLOCATE | \
51+
UVWASI_RIGHT_FD_FILESTAT_GET | \
52+
UVWASI_RIGHT_FD_FILESTAT_SET_SIZE | \
53+
UVWASI_RIGHT_FD_FILESTAT_SET_TIMES |\
54+
UVWASI_RIGHT_POLL_FD_READWRITE)
55+
#define UVWASI__RIGHTS_REGULAR_FILE_INHERITING 0
56+
57+
#define UVWASI__RIGHTS_DIRECTORY_BASE (UVWASI_RIGHT_FD_FDSTAT_SET_FLAGS | \
58+
UVWASI_RIGHT_FD_SYNC | \
59+
UVWASI_RIGHT_FD_ADVISE | \
60+
UVWASI_RIGHT_PATH_CREATE_DIRECTORY | \
61+
UVWASI_RIGHT_PATH_CREATE_FILE | \
62+
UVWASI_RIGHT_PATH_LINK_SOURCE | \
63+
UVWASI_RIGHT_PATH_LINK_TARGET | \
64+
UVWASI_RIGHT_PATH_OPEN | \
65+
UVWASI_RIGHT_FD_READDIR | \
66+
UVWASI_RIGHT_PATH_READLINK | \
67+
UVWASI_RIGHT_PATH_RENAME_SOURCE | \
68+
UVWASI_RIGHT_PATH_RENAME_TARGET | \
69+
UVWASI_RIGHT_PATH_FILESTAT_GET | \
70+
UVWASI_RIGHT_PATH_FILESTAT_SET_SIZE | \
71+
UVWASI_RIGHT_PATH_FILESTAT_SET_TIMES | \
72+
UVWASI_RIGHT_FD_FILESTAT_GET | \
73+
UVWASI_RIGHT_FD_FILESTAT_SET_TIMES | \
74+
UVWASI_RIGHT_PATH_SYMLINK | \
75+
UVWASI_RIGHT_PATH_UNLINK_FILE | \
76+
UVWASI_RIGHT_PATH_REMOVE_DIRECTORY | \
77+
UVWASI_RIGHT_POLL_FD_READWRITE)
78+
#define UVWASI__RIGHTS_DIRECTORY_INHERITING (UVWASI__RIGHTS_DIRECTORY_BASE | \
79+
UVWASI__RIGHTS_REGULAR_FILE_BASE)
80+
81+
#define UVWASI__RIGHTS_SOCKET_BASE (UVWASI_RIGHT_FD_READ | \
82+
UVWASI_RIGHT_FD_FDSTAT_SET_FLAGS | \
83+
UVWASI_RIGHT_FD_WRITE | \
84+
UVWASI_RIGHT_FD_FILESTAT_GET | \
85+
UVWASI_RIGHT_POLL_FD_READWRITE | \
86+
UVWASI_RIGHT_SOCK_SHUTDOWN)
87+
#define UVWASI__RIGHTS_SOCKET_INHERITING UVWASI__RIGHTS_ALL;
88+
89+
#define UVWASI__RIGHTS_TTY_BASE (UVWASI_RIGHT_FD_READ | \
90+
UVWASI_RIGHT_FD_FDSTAT_SET_FLAGS | \
91+
UVWASI_RIGHT_FD_WRITE | \
92+
UVWASI_RIGHT_FD_FILESTAT_GET | \
93+
UVWASI_RIGHT_POLL_FD_READWRITE)
94+
#define UVWASI__RIGHTS_TTY_INHERITING 0
95+
96+
97+
uvwasi_errno_t uvwasi__get_rights(uv_file fd,
98+
int flags,
99+
uvwasi_filetype_t type,
100+
uvwasi_rights_t* rights_base,
101+
uvwasi_rights_t* rights_inheriting);
102+
103+
104+
#endif /* __UVWASI_WASI_RIGHTS_H__ */

‎deps/uvwasi/uvwasi.gyp

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
'src/fd_table.c',
1414
'src/uv_mapping.c',
1515
'src/uvwasi.c',
16+
'src/wasi_rights.c',
1617
],
1718
'dependencies': [
1819
'../uv/uv.gyp:libuv',

0 commit comments

Comments
 (0)
Please sign in to comment.