Skip to content

Commit 3de1b90

Browse files
authored
Fix dup2 when newfd is invalid (#22048)
Fixes: #22040
1 parent 0a0fa66 commit 3de1b90

File tree

4 files changed

+26
-2
lines changed

4 files changed

+26
-2
lines changed

src/library_fs.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,9 @@ FS.staticInit();` +
449449
// object isn't directly passed in. not possible until
450450
// SOCKFS is completed.
451451
createStream(stream, fd = -1) {
452+
#if ASSERTIONS
453+
assert(fd >= -1);
454+
#endif
452455

453456
// clone it, so we can return an instance of FSStream
454457
stream = Object.assign(new FS.FSStream(), stream);

src/library_syscall.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,6 +1009,8 @@ var SyscallsLibrary = {
10091009
assert(!flags);
10101010
#endif
10111011
if (old.fd === newfd) return -{{{ cDefs.EINVAL }}};
1012+
// Check newfd is within range of valid open file descriptors.
1013+
if (newfd < 0 || newfd >= FS.MAX_OPEN_FDS) return -{{{ cDefs.EBADF }}};
10121014
var existing = FS.getStream(newfd);
10131015
if (existing) FS.close(existing);
10141016
return FS.dupStream(old, newfd).fd;

test/unistd/dup.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,26 @@ int main() {
4343
printf("\n");
4444
errno = 0;
4545

46-
printf("DUP2 err\n");
46+
printf("DUP2 bad fds\n");
4747
f = dup2(-2, -2);
4848
printf("f: %d\n", f == -1);
4949
printf("errno: %d\n", errno);
5050
printf("close(f): %d\n", close(f));
5151
printf("\n");
5252
errno = 0;
5353

54+
printf("DUP2 bad newfd\n");
55+
f = open("/", O_RDONLY);
56+
f3 = dup2(f, -1);
57+
printf("f3: %d\n", f3);
58+
printf("errno: %d\n", errno);
59+
f3 = dup2(f, 256000);
60+
printf("f3: %d\n", f3);
61+
printf("errno: %d\n", errno);
62+
printf("close(f1): %d\n", close(f));
63+
printf("\n");
64+
errno = 0;
65+
5466
printf("DUP2 pipe\n");
5567
int p[2];
5668
pipe(p);

test/unistd/dup.out

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,18 @@ close(f1): 0
1414
close(f2): 0
1515
close(f3): -1
1616

17-
DUP2 err
17+
DUP2 bad fds
1818
f: 1
1919
errno: 8
2020
close(f): -1
2121

22+
DUP2 bad newfd
23+
f3: -1
24+
errno: 8
25+
f3: -1
26+
errno: 8
27+
close(f1): 0
28+
2229
DUP2 pipe
2330
buf: abc
2431

0 commit comments

Comments
 (0)