Skip to content

Commit 7faeb48

Browse files
committed
Fix dup in nodefs
1 parent bf76ba4 commit 7faeb48

File tree

4 files changed

+23
-4
lines changed

4 files changed

+23
-4
lines changed

src/library_fs.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,11 @@ FS.staticInit();` +
471471
closeStream(fd) {
472472
FS.streams[fd] = null;
473473
},
474+
dupStream(origStream, fd = -1) {
475+
var stream = FS.createStream(origStream, fd);
476+
stream.stream_ops?.dup?.(stream);
477+
return stream;
478+
},
474479

475480
//
476481
// devices

src/library_nodefs.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ addToLibrary({
251251
var path = NODEFS.realPath(stream.node);
252252
try {
253253
if (FS.isFile(stream.node.mode)) {
254+
stream.shared.refcount = 1;
254255
stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags));
255256
}
256257
} catch (e) {
@@ -260,14 +261,17 @@ addToLibrary({
260261
},
261262
close(stream) {
262263
try {
263-
if (FS.isFile(stream.node.mode) && stream.nfd) {
264+
if (FS.isFile(stream.node.mode) && stream.nfd && --stream.shared.refcount === 0) {
264265
fs.closeSync(stream.nfd);
265266
}
266267
} catch (e) {
267268
if (!e.code) throw e;
268269
throw new FS.ErrnoError(NODEFS.convertNodeCode(e));
269270
}
270271
},
272+
dup(stream) {
273+
stream.shared.refcount ++;
274+
},
271275
read(stream, buffer, offset, length, position) {
272276
// Node.js < 6 compatibility: node errors on 0 length reads
273277
if (length === 0) return 0;

src/library_syscall.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ var SyscallsLibrary = {
183183
},
184184
__syscall_dup: (fd) => {
185185
var old = SYSCALLS.getStreamFromFD(fd);
186-
return FS.createStream(old).fd;
186+
return FS.dupStream(old).fd;
187187
},
188188
__syscall_pipe__deps: ['$PIPEFS'],
189189
__syscall_pipe: (fdPtr) => {
@@ -760,7 +760,7 @@ var SyscallsLibrary = {
760760
arg++;
761761
}
762762
var newStream;
763-
newStream = FS.createStream(stream, arg);
763+
newStream = FS.dupStream(stream, arg);
764764
return newStream.fd;
765765
}
766766
case {{{ cDefs.F_GETFD }}}:
@@ -1007,7 +1007,7 @@ var SyscallsLibrary = {
10071007
if (old.fd === newfd) return -{{{ cDefs.EINVAL }}};
10081008
var existing = FS.getStream(newfd);
10091009
if (existing) FS.close(existing);
1010-
return FS.createStream(old, newfd).fd;
1010+
return FS.dupStream(old, newfd).fd;
10111011
},
10121012
};
10131013

test/test_core.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5749,6 +5749,16 @@ def test_fs_nodefs_cloexec(self):
57495749
self.emcc_args += ['-lnodefs.js']
57505750
self.do_runf('fs/test_nodefs_cloexec.c', 'success')
57515751

5752+
@also_with_noderawfs
5753+
@requires_node
5754+
def test_fs_nodefs_dup(self):
5755+
if self.get_setting('WASMFS'):
5756+
self.set_setting('FORCE_FILESYSTEM')
5757+
self.emcc_args += ['-lnodefs.js']
5758+
expected = "fd1: 3, fd2: 4\nclose(fd1): 0\nclose(fd2): 0\nclose(fd3): 0"
5759+
5760+
self.do_runf('fs/test_nodefs_dup.c', expected)
5761+
57525762
@requires_node
57535763
def test_fs_nodefs_home(self):
57545764
self.set_setting('FORCE_FILESYSTEM')

0 commit comments

Comments
 (0)