Skip to content

Commit 89c946e

Browse files
authored
Make open O_CREATE mode 0 work (#23137)
In nodefs we first create the node with permissions 0 and then try to open it. The open fails because we don't have read permissions. The following (18) test expectation files were updated by running the tests with `--rebaseline`: ``` other/codesize/test_codesize_cxx_ctors1.gzsize: 8351 => 8407 [+56 bytes / +0.67%] other/codesize/test_codesize_cxx_ctors1.jssize: 20343 => 20486 [+143 bytes / +0.70%] other/codesize/test_codesize_cxx_ctors2.gzsize: 8334 => 8390 [+56 bytes / +0.67%] other/codesize/test_codesize_cxx_ctors2.jssize: 20311 => 20454 [+143 bytes / +0.70%] other/codesize/test_codesize_cxx_except.gzsize: 9356 => 9411 [+55 bytes / +0.59%] other/codesize/test_codesize_cxx_except.jssize: 24112 => 24255 [+143 bytes / +0.59%] other/codesize/test_codesize_cxx_except_wasm.gzsize: 8321 => 8373 [+52 bytes / +0.62%] other/codesize/test_codesize_cxx_except_wasm.jssize: 20236 => 20379 [+143 bytes / +0.71%] other/codesize/test_codesize_cxx_except_wasm_exnref.gzsize: 8321 => 8373 [+52 bytes / +0.62%] other/codesize/test_codesize_cxx_except_wasm_exnref.jssize: 20236 => 20379 [+143 bytes / +0.71%] other/codesize/test_codesize_cxx_lto.gzsize: 8347 => 8404 [+57 bytes / +0.68%] other/codesize/test_codesize_cxx_lto.jssize: 20367 => 20510 [+143 bytes / +0.70%] other/codesize/test_codesize_cxx_mangle.gzsize: 9359 => 9416 [+57 bytes / +0.61%] other/codesize/test_codesize_cxx_mangle.jssize: 24112 => 24255 [+143 bytes / +0.59%] other/codesize/test_codesize_cxx_noexcept.gzsize: 8351 => 8407 [+56 bytes / +0.67%] other/codesize/test_codesize_cxx_noexcept.jssize: 20343 => 20486 [+143 bytes / +0.70%] other/codesize/test_codesize_files_js_fs.gzsize: 7654 => 7702 [+48 bytes / +0.63%] other/codesize/test_codesize_files_js_fs.jssize: 18838 => 18980 [+142 bytes / +0.75%] Average change: +0.66% (+0.59% - +0.75%) ```
1 parent 971d4f6 commit 89c946e

21 files changed

+50
-19
lines changed

src/library_fs.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -1087,7 +1087,10 @@ FS.staticInit();
10871087
throw new FS.ErrnoError({{{ cDefs.EISDIR }}});
10881088
} else {
10891089
// node doesn't exist, try to create it
1090-
node = FS.mknod(path, mode, 0);
1090+
// Ignore the permission bits here to ensure we can `open` this new
1091+
// file below. We use chmod below the apply the permissions once the
1092+
// file is open.
1093+
node = FS.mknod(path, mode | 0o777, 0);
10911094
created = true;
10921095
}
10931096
}
@@ -1137,6 +1140,9 @@ FS.staticInit();
11371140
if (stream.stream_ops.open) {
11381141
stream.stream_ops.open(stream);
11391142
}
1143+
if (created) {
1144+
FS.chmod(node, mode & 0o777);
1145+
}
11401146
#if expectToReceiveOnModule('logReadFiles')
11411147
if (Module['logReadFiles'] && !(flags & {{{ cDefs.O_WRONLY}}})) {
11421148
if (!(path in FS.readFiles)) {

test/fs/test_fs_open_no_permissions.c

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include <stdio.h>
2+
#include <unistd.h>
3+
#include <assert.h>
4+
#include <fcntl.h>
5+
#include <string.h>
6+
#include <sys/stat.h>
7+
#include <assert.h>
8+
#include <errno.h>
9+
#include <string.h>
10+
11+
// TODO: Combine this with test_fcntl_open.c. First requires fixing
12+
// test_fcntl_open.c on noderawfs.
13+
int main() {
14+
int res = open("a", O_CREAT, 0);
15+
printf("error: %s\n", strerror(errno));
16+
assert(res >= 0);
17+
struct stat st;
18+
assert(stat("a", &st) == 0);
19+
assert((st.st_mode & 0777) == 0);
20+
printf("success\n");
21+
}
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8351
1+
8407
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20343
1+
20486
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8334
1+
8390
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20311
1+
20454
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9356
1+
9411
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24112
1+
24255
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8321
1+
8373
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20236
1+
20379
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8321
1+
8373
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20236
1+
20379
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8347
1+
8404
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20367
1+
20510
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9359
1+
9416
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24112
1+
24255
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8351
1+
8407
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20343
1+
20486
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7654
1+
7702
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
18838
1+
18980

test/test_core.py

+4
Original file line numberDiff line numberDiff line change
@@ -5858,6 +5858,10 @@ def test_fs_rename_on_existing(self):
58585858
self.set_setting('FORCE_FILESYSTEM')
58595859
self.do_runf('fs/test_fs_rename_on_existing.c', 'success')
58605860

5861+
@also_with_nodefs_both
5862+
def test_fs_open_no_permissions(self):
5863+
self.do_runf('fs/test_fs_open_no_permissions.c', 'success')
5864+
58615865
@also_with_nodefs_both
58625866
@crossplatform
58635867
@no_windows('https://github.com/emscripten-core/emscripten/issues/8882')

0 commit comments

Comments
 (0)