Wasmtime: Directories with more than ~150 files are truncated when mapped

Created on 9 Dec 2020  路  4Comments  路  Source: bytecodealliance/wasmtime

I am using this simple C program to test:

#include <dirent.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char **argv) {
  DIR *d;

  char * target = ".";
  if (argc == 2) {
      target = argv[1];
  }
  struct dirent *dir;
  d = opendir(target);
  if (d) {
    while ((dir = readdir(d)) != NULL) {
      printf("%s\n", dir->d_name);
    }

    printf("errno: %d\n", errno);
    closedir(d);
  }

  return(0);
}

I then use this bash script to generate a directory with N files in

rm -rf testfolder
mkdir -p testfolder
for n in $(seq 1 ${1:-100}); do
        touch testfolder/$(printf %04d "$n")
done

This is what happens when I run it

$ bash generate-files.sh 100

$ ls testfolder/
0001  0005  0009  0013  0017  0021  0025  0029  0033  0037  0041  0045  0049  0053  0057  0061  0065  0069  0073  0077  0081  0085  0089  0093  0097
0002  0006  0010  0014  0018  0022  0026  0030  0034  0038  0042  0046  0050  0054  0058  0062  0066  0070  0074  0078  0082  0086  0090  0094  0098
0003  0007  0011  0015  0019  0023  0027  0031  0035  0039  0043  0047  0051  0055  0059  0063  0067  0071  0075  0079  0083  0087  0091  0095  0099
0004  0008  0012  0016  0020  0024  0028  0032  0036  0040  0044  0048  0052  0056  0060  0064  0068  0072  0076  0080  0084  0088  0092  0096  0100

$ wasmtime run ls.wasm --dir=./testfolder -- testfolder | wc -l
103 # 100 files + "." ".." and the "errno" print

$ bash generate-files.sh 200

$ wasmtime run ls.wasm --dir=./testfolder -- testfolder | wc -l
147 # lots of files missing

# for example 0012
$ wasmtime run ls.wasm --dir=./testfolder -- testfolder | grep 0012

$ wasmtime run ls.wasm --dir=./testfolder -- testfolder | grep 0011
0011

Running wasmer on the same input works as expected:

$ ~/.wasmer/bin/wasmer run ls.wasm --dir=./testfolder -- testfolder | wc -l
201 # wasmer does not return "." and ".."

$ ~/.wasmer/bin/wasmer run ls.wasm --dir=./testfolder -- testfolder | grep 0012
0012

Expected Behavior

Calls to readdir returns all directory entries, even for folders with more than ~150 files.

bug impl

All 4 comments

Tested wasmtime versions are 0.19 and 0.21 (both with the same result)

I was able to reproduce, this is a wasi-common bug

Me too. #2494 is a fix for this.

Nice, that was fast! 馃檪

Was this page helpful?
0 / 5 - 0 ratings

Related issues

rrichardson picture rrichardson  路  5Comments

daubaris picture daubaris  路  3Comments

julian-seward1 picture julian-seward1  路  6Comments

bnjbvr picture bnjbvr  路  7Comments

kubkon picture kubkon  路  5Comments