@@ -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