@@ -695,9 +695,9 @@ var SyscallsLibrary = {
695695 var pos = 0;
696696 var off = FS.llseek(stream, 0, {{{ cDefs.SEEK_CUR }}});
697697
698- var idx = Math.floor(off / struct_size);
699-
700- while ( idx < stream.getdents.length && pos + struct_size <= count ) {
698+ var startIdx = Math.floor(off / struct_size);
699+ var endIdx = Math.min(stream.getdents.length, startIdx + Math.floor(count/struct_size))
700+ for (var idx = startIdx; idx < endIdx; idx++ ) {
701701 var id;
702702 var type;
703703 var name = stream.getdents[idx];
@@ -711,7 +711,17 @@ var SyscallsLibrary = {
711711 type = 4; // DT_DIR
712712 }
713713 else {
714- var child = FS.lookupNode(stream.node, name);
714+ var child;
715+ try {
716+ child = FS.lookupNode(stream.node, name);
717+ } catch (e) {
718+ // If the entry is not a directory, file, or symlink, nodefs
719+ // lookupNode will raise EINVAL. Skip these and continue.
720+ if (e?.errno === {{{ cDefs.EINVAL }}}) {
721+ continue;
722+ }
723+ throw e;
724+ }
715725 id = child.id;
716726 type = FS.isChrdev(child.mode) ? 2 : // DT_CHR, character device.
717727 FS.isDir(child.mode) ? 4 : // DT_DIR, directory.
@@ -727,7 +737,6 @@ var SyscallsLibrary = {
727737 {{{ makeSetValue('dirp + pos', C_STRUCTS.dirent.d_type, 'type', 'i8') }}};
728738 stringToUTF8(name, dirp + pos + {{{ C_STRUCTS.dirent.d_name }}}, 256);
729739 pos += struct_size;
730- idx += 1;
731740 }
732741 FS.llseek(stream, idx * struct_size, {{{ cDefs.SEEK_SET }}});
733742 return pos;
0 commit comments