Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,7 @@ jobs:
wasmfs.test_readdir_rawfs
wasmfs.test_utime
wasmfs.test_unistd_unlink
wasmfs.test_unistd_dup
wasmfs.test_unistd_access
wasmfs.test_unistd_close
wasmfs.test_unistd_truncate
Expand Down
3 changes: 2 additions & 1 deletion system/lib/wasmfs/file_table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ std::shared_ptr<DataFile>
FileTable::Handle::setEntry(__wasi_fd_t fd,
std::shared_ptr<OpenFileState> openFile) {
assert(fd >= 0);
assert(fd < WASMFS_FD_MAX);
if (fd >= fileTable.entries.size()) {
fileTable.entries.resize(fd + 1);
}
Expand All @@ -50,7 +51,7 @@ FileTable::Handle::setEntry(__wasi_fd_t fd,
__wasi_fd_t
FileTable::Handle::addEntry(std::shared_ptr<OpenFileState> openFileState) {
// TODO: add freelist to avoid linear lookup time.
for (__wasi_fd_t i = 0;; i++) {
for (__wasi_fd_t i = 0; i < WASMFS_FD_MAX; i++) {
if (!getEntry(i)) {
(void)setEntry(i, openFileState);
return i;
Expand Down
3 changes: 3 additions & 0 deletions system/lib/wasmfs/file_table.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
#include <vector>
#include <wasi/api.h>

// Copied from legacy FS (FS.MAX_OPEN_FDS)
#define WASMFS_FD_MAX 4096

namespace wasmfs {
static_assert(std::is_same<size_t, __wasi_size_t>::value,
"size_t should be the same as __wasi_size_t");
Expand Down
2 changes: 1 addition & 1 deletion system/lib/wasmfs/syscalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ int __syscall_dup3(int oldfd, int newfd, int flags) {
if (!oldOpenFile) {
return -EBADF;
}
if (newfd < 0) {
if (newfd < 0 || newfd >= WASMFS_FD_MAX) {
return -EBADF;
}
if (oldfd == newfd) {
Expand Down
2 changes: 1 addition & 1 deletion test/other/codesize/test_codesize_files_wasmfs.size
Original file line number Diff line number Diff line change
@@ -1 +1 @@
49979
49968
11 changes: 5 additions & 6 deletions test/unistd/dup.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <emscripten.h>
#include <assert.h>
#include <string.h>

Expand All @@ -21,7 +20,7 @@ int main() {
f = open("/", O_RDONLY);
f2 = open("/", O_RDONLY);
f3 = dup(f);
printf("errno: %d\n", errno);
printf("errno: %s\n", strerror(errno));
assert(f != -1);
assert(f2 != -1);
assert(f3 != -1);
Expand All @@ -40,7 +39,7 @@ int main() {
assert(f != -1);
assert(f2 != -1);
assert(f3 != -1);
printf("errno: %d\n", errno);
printf("errno: %s\n", strerror(errno));
printf("f: %d\n", f != f2 && f != f3);
printf("f2,f3: %d\n", f2 == f3);
printf("close(f1): %d\n", close(f));
Expand All @@ -53,7 +52,7 @@ int main() {
f = dup2(-2, -2);
printf("f: %d\n", f);
assert(f == -1);
printf("errno: %d\n", errno);
printf("errno: %s\n", strerror(errno));
printf("close(f): %d\n", close(f));
printf("\n");
errno = 0;
Expand All @@ -64,11 +63,11 @@ int main() {
f3 = dup2(f, -1);
printf("f3: %d\n", f3);
assert(f3 == -1);
printf("errno: %d\n", errno);
printf("errno: %s\n", strerror(errno));
f3 = dup2(f, 256000);
printf("f3: %d\n", f3);
assert(f3 == -1);
printf("errno: %d\n", errno);
printf("errno: %s\n", strerror(errno));
printf("close(f1): %d\n", close(f));
printf("\n");
errno = 0;
Expand Down
10 changes: 5 additions & 5 deletions test/unistd/dup.out
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
DUP
errno: 0
errno: No error information
f: 1
f2,f3: 1
close(f1): 0
close(f2): 0
close(f3): 0

DUP2
errno: 0
errno: No error information
f: 1
f2,f3: 1
close(f1): 0
Expand All @@ -16,14 +16,14 @@ close(f3): -1

DUP2 bad fds
f: -1
errno: 8
errno: Bad file descriptor
close(f): -1

DUP2 bad newfd
f3: -1
errno: 8
errno: Bad file descriptor
f3: -1
errno: 8
errno: Bad file descriptor
close(f1): 0

DUP2 pipe
Expand Down