Skip to content

Commit 9d4abe8

Browse files
authored
[FS] Make fstat work on file descriptors with no name in node rawfs (#23364)
This fixes fstat on "anonymous" file descriptors in node rawfs. It is split off from #23058.
1 parent 61c9bd2 commit 9d4abe8

18 files changed

+50
-15
lines changed

src/lib/libfs.js

+3
Original file line numberDiff line numberDiff line change
@@ -965,6 +965,9 @@ FS.staticInit();
965965
var getattr = FS.checkOpExists(node.node_ops.getattr, {{{ cDefs.EPERM }}});
966966
return getattr(node);
967967
},
968+
fstat(fd) {
969+
return FS.stat(FS.getStreamChecked(fd).path);
970+
},
968971
lstat(path) {
969972
return FS.stat(path, true);
970973
},

src/lib/libnoderawfs.js

+4
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ addToLibrary({
8080
}
8181
return stat;
8282
},
83+
fstat(fd) {
84+
var stream = FS.getStreamChecked(fd);
85+
return fs.fstatSync(stream.nfd);
86+
},
8387
statfsStream(stream) {
8488
return fs.statfsSync(stream.path);
8589
},

src/lib/libsyscall.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -690,8 +690,7 @@ var SyscallsLibrary = {
690690
return SYSCALLS.writeStat(buf, FS.lstat(path));
691691
},
692692
__syscall_fstat64: (fd, buf) => {
693-
var stream = SYSCALLS.getStreamFromFD(fd);
694-
return SYSCALLS.writeStat(buf, FS.stat(stream.path));
693+
return SYSCALLS.writeStat(buf, FS.fstat(fd));
695694
},
696695
__syscall_fchown32: (fd, owner, group) => {
697696
FS.fchown(fd, owner, group);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#include <fcntl.h>
2+
#include <unistd.h>
3+
#include <sys/stat.h>
4+
#include <assert.h>
5+
#include "stdio.h"
6+
7+
int main() {
8+
int fd = open("file.txt", O_RDWR | O_CREAT, 0666);
9+
unlink("file.txt");
10+
int res;
11+
struct stat buf;
12+
res = fstat(fd, &buf);
13+
assert(res == 0);
14+
assert(buf.st_atime > 1000000000);
15+
res = fchmod(fd, 0777);
16+
assert(res == 0);
17+
res = ftruncate(fd, 10);
18+
assert(res == 0);
19+
printf("success\n");
20+
}
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
129211
1+
129218
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
128623
1+
128630
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
170879
1+
170886
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
144708
1+
144715
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
142162
1+
142169
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
232724
1+
232731
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
131774
1+
131781
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
169181
1+
169188
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
15101
1+
15113
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
19394
1+
19405
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
15101
1+
15113
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
12182
1+
12194
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
15101
1+
15113

test/test_core.py

+9
Original file line numberDiff line numberDiff line change
@@ -5842,6 +5842,15 @@ def test_fs_64bit(self):
58425842
self.set_setting('FORCE_FILESYSTEM')
58435843
self.do_runf('fs/test_64bit.c', 'success')
58445844

5845+
@crossplatform
5846+
@with_all_fs
5847+
def test_fs_stat_unnamed_file_descriptor(self):
5848+
noderawfs = '-DNODERAWFS' in self.emcc_args
5849+
wasmfs = self.get_setting('WASMFS')
5850+
if not (noderawfs or wasmfs):
5851+
self.skipTest('TODO: doesnt work in memfs or nodefs')
5852+
self.do_runf('fs/test_stat_unnamed_file_descriptor.c', 'success')
5853+
58455854
@requires_node
58465855
@crossplatform
58475856
@with_all_fs

0 commit comments

Comments
 (0)