Skip to content

Commit b1837cc

Browse files
authored
[WasmFS] Limit max file descriptor number (#23773)
This enabled wasmfs.test_unistd_dup to pass
1 parent c34a89f commit b1837cc

File tree

7 files changed

+18
-14
lines changed

7 files changed

+18
-14
lines changed

.circleci/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,7 @@ jobs:
590590
wasmfs.test_readdir_rawfs
591591
wasmfs.test_utime
592592
wasmfs.test_unistd_unlink
593+
wasmfs.test_unistd_dup
593594
wasmfs.test_unistd_access
594595
wasmfs.test_unistd_close
595596
wasmfs.test_unistd_truncate

system/lib/wasmfs/file_table.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ std::shared_ptr<DataFile>
3333
FileTable::Handle::setEntry(__wasi_fd_t fd,
3434
std::shared_ptr<OpenFileState> openFile) {
3535
assert(fd >= 0);
36+
assert(fd < WASMFS_FD_MAX);
3637
if (fd >= fileTable.entries.size()) {
3738
fileTable.entries.resize(fd + 1);
3839
}
@@ -50,7 +51,7 @@ FileTable::Handle::setEntry(__wasi_fd_t fd,
5051
__wasi_fd_t
5152
FileTable::Handle::addEntry(std::shared_ptr<OpenFileState> openFileState) {
5253
// TODO: add freelist to avoid linear lookup time.
53-
for (__wasi_fd_t i = 0;; i++) {
54+
for (__wasi_fd_t i = 0; i < WASMFS_FD_MAX; i++) {
5455
if (!getEntry(i)) {
5556
(void)setEntry(i, openFileState);
5657
return i;

system/lib/wasmfs/file_table.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
#include <vector>
1616
#include <wasi/api.h>
1717

18+
// Copied from legacy FS (FS.MAX_OPEN_FDS)
19+
#define WASMFS_FD_MAX 4096
20+
1821
namespace wasmfs {
1922
static_assert(std::is_same<size_t, __wasi_size_t>::value,
2023
"size_t should be the same as __wasi_size_t");

system/lib/wasmfs/syscalls.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ int __syscall_dup3(int oldfd, int newfd, int flags) {
6060
if (!oldOpenFile) {
6161
return -EBADF;
6262
}
63-
if (newfd < 0) {
63+
if (newfd < 0 || newfd >= WASMFS_FD_MAX) {
6464
return -EBADF;
6565
}
6666
if (oldfd == newfd) {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
49979
1+
49968

test/unistd/dup.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#include <errno.h>
1010
#include <unistd.h>
1111
#include <fcntl.h>
12-
#include <emscripten.h>
1312
#include <assert.h>
1413
#include <string.h>
1514

@@ -21,7 +20,7 @@ int main() {
2120
f = open("/", O_RDONLY);
2221
f2 = open("/", O_RDONLY);
2322
f3 = dup(f);
24-
printf("errno: %d\n", errno);
23+
printf("errno: %s\n", strerror(errno));
2524
assert(f != -1);
2625
assert(f2 != -1);
2726
assert(f3 != -1);
@@ -40,7 +39,7 @@ int main() {
4039
assert(f != -1);
4140
assert(f2 != -1);
4241
assert(f3 != -1);
43-
printf("errno: %d\n", errno);
42+
printf("errno: %s\n", strerror(errno));
4443
printf("f: %d\n", f != f2 && f != f3);
4544
printf("f2,f3: %d\n", f2 == f3);
4645
printf("close(f1): %d\n", close(f));
@@ -53,7 +52,7 @@ int main() {
5352
f = dup2(-2, -2);
5453
printf("f: %d\n", f);
5554
assert(f == -1);
56-
printf("errno: %d\n", errno);
55+
printf("errno: %s\n", strerror(errno));
5756
printf("close(f): %d\n", close(f));
5857
printf("\n");
5958
errno = 0;
@@ -64,11 +63,11 @@ int main() {
6463
f3 = dup2(f, -1);
6564
printf("f3: %d\n", f3);
6665
assert(f3 == -1);
67-
printf("errno: %d\n", errno);
66+
printf("errno: %s\n", strerror(errno));
6867
f3 = dup2(f, 256000);
6968
printf("f3: %d\n", f3);
7069
assert(f3 == -1);
71-
printf("errno: %d\n", errno);
70+
printf("errno: %s\n", strerror(errno));
7271
printf("close(f1): %d\n", close(f));
7372
printf("\n");
7473
errno = 0;

test/unistd/dup.out

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
DUP
2-
errno: 0
2+
errno: No error information
33
f: 1
44
f2,f3: 1
55
close(f1): 0
66
close(f2): 0
77
close(f3): 0
88

99
DUP2
10-
errno: 0
10+
errno: No error information
1111
f: 1
1212
f2,f3: 1
1313
close(f1): 0
@@ -16,14 +16,14 @@ close(f3): -1
1616

1717
DUP2 bad fds
1818
f: -1
19-
errno: 8
19+
errno: Bad file descriptor
2020
close(f): -1
2121

2222
DUP2 bad newfd
2323
f3: -1
24-
errno: 8
24+
errno: Bad file descriptor
2525
f3: -1
26-
errno: 8
26+
errno: Bad file descriptor
2727
close(f1): 0
2828

2929
DUP2 pipe

0 commit comments

Comments
 (0)