Skip to content

Commit 4c015a3

Browse files
committed
Merge pull request #2157 from rfk/rfk/fileno-error-reporting
Ensure that fileno() returns -1 when given an invalid file pointer.
2 parents 01efb0b + fee89ee commit 4c015a3

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

src/library.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2420,7 +2420,9 @@ LibraryManager.library = {
24202420
fileno: function(stream) {
24212421
// int fileno(FILE *stream);
24222422
// http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html
2423-
return FS.getStreamFromPtr(stream).fd;
2423+
stream = FS.getStreamFromPtr(stream);
2424+
if (!stream) return -1;
2425+
return stream.fd;
24242426
},
24252427
ftrylockfile: function() {
24262428
// int ftrylockfile(FILE *file);

tests/test_core.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4066,6 +4066,28 @@ def test_fscanf(self):
40664066
self.emcc_args += ['--embed-file', 'three_numbers.txt']
40674067
self.do_run(src, 'match = 3\nx = -1.0, y = 0.1, z = -0.1\n')
40684068

4069+
def test_fileno(self):
4070+
if self.emcc_args is None: return self.skip('requires emcc')
4071+
open(os.path.join(self.get_dir(), 'empty.txt'), 'w').write('')
4072+
src = r'''
4073+
#include <stdio.h>
4074+
#include <unistd.h>
4075+
int main()
4076+
{
4077+
FILE* fp = fopen("empty.txt", "r");
4078+
if (fp) {
4079+
printf("%d\n", fp);
4080+
printf("%d\n", fileno(fp));
4081+
printf("%d\n", fileno((FILE*)42)); // nonexistent stream
4082+
} else {
4083+
printf("failed to open empty.txt\n");
4084+
}
4085+
return 0;
4086+
}
4087+
'''
4088+
self.emcc_args += ['--embed-file', 'empty.txt']
4089+
self.do_run(src, '4\n3\n-1\n')
4090+
40694091
def test_readdir(self):
40704092
src = open(path_from_root('tests', 'dirent', 'test_readdir.c'), 'r').read()
40714093
self.do_run(src, 'success', force_c=True)

0 commit comments

Comments
 (0)