Skip to content

Commit d0ecbb8

Browse files
committed
Fix broken i53 overflow checks in libsyscall.js. NFC
Add some tests for the overload case.
1 parent b277d57 commit d0ecbb8

File tree

6 files changed

+52
-7
lines changed

6 files changed

+52
-7
lines changed

src/lib/libsyscall.js

+9-5
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,11 @@ var SyscallsLibrary = {
153153
],
154154
_mmap_js: (len, prot, flags, fd, offset, allocated, addr) => {
155155
#if FILESYSTEM && SYSCALLS_REQUIRE_FILESYSTEM
156-
if (isNaN(offset)) return {{{ cDefs.EOVERFLOW }}};
156+
#if ASSERTIONS
157+
// musl's mmap doesn't allow values over a certain limit
158+
// see OFF_MASK in mmap.c.
159+
assert(!isNaN(offset));
160+
#endif
157161
var stream = SYSCALLS.getStreamFromFD(fd);
158162
var res = FS.mmap(stream, len, offset, prot, flags);
159163
var ptr = res.ptr;
@@ -631,7 +635,7 @@ var SyscallsLibrary = {
631635
},
632636
_msync_js__i53abi: true,
633637
_msync_js: (addr, len, prot, flags, fd, offset) => {
634-
if (isNaN(offset)) return {{{ cDefs.EOVERFLOW }}};
638+
if (isNaN(offset)) return -{{{ cDefs.EOVERFLOW }}};
635639
SYSCALLS.doMsync(addr, SYSCALLS.getStreamFromFD(fd), len, flags, offset);
636640
return 0;
637641
},
@@ -670,14 +674,14 @@ var SyscallsLibrary = {
670674
},
671675
__syscall_truncate64__i53abi: true,
672676
__syscall_truncate64: (path, length) => {
673-
if (isNaN(length)) return {{{ cDefs.EOVERFLOW }}};
677+
if (isNaN(length)) return -{{{ cDefs.EOVERFLOW }}};
674678
path = SYSCALLS.getStr(path);
675679
FS.truncate(path, length);
676680
return 0;
677681
},
678682
__syscall_ftruncate64__i53abi: true,
679683
__syscall_ftruncate64: (fd, length) => {
680-
if (isNaN(length)) return {{{ cDefs.EOVERFLOW }}};
684+
if (isNaN(length)) return -{{{ cDefs.EOVERFLOW }}};
681685
FS.ftruncate(fd, length);
682686
return 0;
683687
},
@@ -995,7 +999,7 @@ var SyscallsLibrary = {
995999
},
9961000
__syscall_fallocate__i53abi: true,
9971001
__syscall_fallocate: (fd, mode, offset, len) => {
998-
if (isNaN(offset)) return {{{ cDefs.EOVERFLOW }}};
1002+
if (isNaN(offset) || isNaN(len)) return -{{{ cDefs.EOVERFLOW }}};
9991003
if (mode != 0) {
10001004
return -{{{ cDefs.ENOTSUP }}}
10011005
}

test/fcntl/test_fcntl_misc.c

+10-1
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,19 @@ int main() {
4040

4141
err = posix_fallocate(f, -1, 7);
4242
printf("posix_fallocate 3: %s\n", strerror(err));
43-
printf("\n");
4443

4544
err = posix_fallocate(f, 3, -1);
4645
printf("posix_fallocate 4: %s\n", strerror(err));
4746

47+
// Values over 2^53 are not representable in JS and
48+
// should result in EOVERFLOW.
49+
err = posix_fallocate(f, 1, 0x00ffffffffffffff);
50+
assert(err == EOVERFLOW);
51+
printf("posix_fallocate 5: %s\n", strerror(err));
52+
53+
err = posix_fallocate(f, 0x00ffffffffffffff, 1);
54+
assert(err == EOVERFLOW);
55+
printf("posix_fallocate 6: %s\n", strerror(err));
56+
4857
return 0;
4958
}

test/fcntl/test_fcntl_misc.out

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ posix_fallocate 2: 0
77
st_size: 10
88

99
posix_fallocate 3: Invalid argument
10-
1110
posix_fallocate 4: Invalid argument
11+
posix_fallocate 5: Value too large for data type
12+
posix_fallocate 6: Value too large for data type

test/fs/test_mmap.c

+5
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ void test_mmap_shared_with_offset() {
164164
// assert failure if offset is not a multiple of page size
165165
assert(map == MAP_FAILED);
166166

167+
map = (char*)mmap(0, textsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x00ffffffffffffff);
168+
// mmap offset outside MAX_SAFE_INTEGER range.
169+
assert(map == MAP_FAILED);
170+
assert(errno == EINVAL);
171+
167172
map = (char*)mmap(0, textsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
168173
assert(map != MAP_FAILED);
169174

test/unistd/truncate.c

+18
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,24 @@ int main() {
7474
errno = 0;
7575
printf("\n");
7676

77+
printf("ftruncate(0x00ffffffffffffff): %d\n", ftruncate(f, 0x00ffffffffffffff));
78+
printf("errno: %s\n", strerror(errno));
79+
fstat(f, &s);
80+
printf("st_size: %lld\n", s.st_size);
81+
assert(s.st_size == 4);
82+
memset(&s, 0, sizeof s);
83+
errno = 0;
84+
printf("\n");
85+
86+
printf("truncate(0x00ffffffffffffff): %d\n", truncate("towrite", 0x00ffffffffffffff));
87+
printf("errno: %s\n", strerror(errno));
88+
fstat(f, &s);
89+
printf("st_size: %lld\n", s.st_size);
90+
assert(s.st_size == 4);
91+
memset(&s, 0, sizeof s);
92+
errno = 0;
93+
printf("\n");
94+
7795
printf("truncate(2): %d\n", truncate("towrite", 2));
7896
printf("errno: %s\n", strerror(errno));
7997
fstat(f, &s);

test/unistd/truncate.out

+8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ ftruncate(-1): -1
1212
errno: Invalid argument
1313
st_size: 4
1414

15+
ftruncate(0x00ffffffffffffff): -1
16+
errno: Value too large for data type
17+
st_size: 4
18+
19+
truncate(0x00ffffffffffffff): -1
20+
errno: Value too large for data type
21+
st_size: 4
22+
1523
truncate(2): 0
1624
errno: No error information
1725
st_size: 2

0 commit comments

Comments
 (0)