emscripten-core / emscripten-core/emscripten
rmdir() fails with CASE_INSENSITIVE_FS enabled
- Dominant language
- C++
- Stars
- 27.6k
- Forks
- 3.6k
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 105
Description
rmdir() fails for a name with a different letter case. Also, note the output of second `readdir()`. It doesn't contain "." and "..".
**Version of emscripten/emsdk:**
```
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.20 (5d878c99921ec247d34fb26a20b5a13d60d69e93)
clang version 16.0.0 (https://github.com/llvm/llvm-project 75767a0f9a926641edbef08e31ec2148ff45da67)
Target: wasm32-unknown-emscripten
Thread model: posix
```
**Failing code:**
```cpp
#include
#include
#include
#include
#include
void readdir(const char *dname)
{
printf("Files in '%s': ", dname);
DIR *d = opendir(dname);
if (d)
{
struct dirent *dir;
while ((dir = readdir(d)) != NULL)
{
if (dir->d_type & (DT_DIR | DT_REG))
{
printf("%s ", dir->d_name);
}
}
closedir(d);
}
printf("\n");
}
int main()
{
assert(mkdir("Subdir", S_IRWXUGO) == 0);
FILE *fp = fopen("SubDir/Test.txt", "wt");
assert(fp);
assert(fputs("test", fp) >= 0);
assert(fclose(fp) == 0);
readdir("subdir");
assert(unlink("SUBDIR/TEST.TXT") == 0);
readdir("subdir");
int err = rmdir("SUBDIR");
if (err)
perror("rmdir");
assert(err == 0); // fails
return 0;
}
```
**Full link command and output with `-v` appended:**
```
rm -rf build
mkdir -p build
em++ -v -sCASE_INSENSITIVE_FS=1 -std=c++11 main.cpp -o build/unlink.html
emrun build/unlink.html --browser chrome
```
Build output:
```
"/Users/admin/src/emsdk/upstream/bin/clang++" -target wasm32-unknown-emscripten -fignore-exceptions -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -DEMSCRIPTEN -D__EMSCRIPTEN_major__=3 -D__EMSCRIPTEN_minor__=1 -D__EMSCRIPTEN_tiny__=20 -I/Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include/SDL --sysroot=/Users/admin/src/emsdk/upstream/emscripten/cache/sysroot -Xclang -iwithsysroot/include/compat -v -std=c++11 main.cpp -c -o /var/folders/jy/c7h5q7q91jj__0wcv7m6zhyw0000gn/T/emscripten_temp_dbnv034x/main_0.o
clang version 16.0.0 (https://github.com/llvm/llvm-project 75767a0f9a926641edbef08e31ec2148ff45da67)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /Users/admin/src/emsdk/upstream/bin
(in-process)
"/Users/admin/src/emsdk/upstream/bin/clang-16" -cc1 -triple wasm32-unknown-emscripten -emit-obj -mrelax-all --mrelax-relocations -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model static -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu generic -mllvm -treat-scalable-fixed-error-as-warning -debugger-tuning=gdb -v -fcoverage-compilation-dir=/Users/admin/src/emdemo/unlink -resource-dir /Users/admin/src/emsdk/upstream/lib/clang/16.0.0 -D EMSCRIPTEN -D __EMSCRIPTEN_major__=3 -D __EMSCRIPTEN_minor__=1 -D __EMSCRIPTEN_tiny__=20 -I /Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include/SDL -isysroot /Users/admin/src/emsdk/upstream/emscripten/cache/sysroot -internal-isystem /Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1 -internal-isystem /Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1 -internal-isystem /Users/admin/src/emsdk/upstream/lib/clang/16.0.0/include -internal-isystem /Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten -internal-isystem /Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include -std=c++11 -fdeprecated-macro -fdebug-compilation-dir=/Users/admin/src/emdemo/unlink -ferror-limit 19 -fvisibility default -fgnuc-version=4.2.1 -fcxx-exceptions -fignore-exceptions -fexceptions -fcolor-diagnostics -iwithsysroot/include/compat -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o /var/folders/jy/c7h5q7q91jj__0wcv7m6zhyw0000gn/T/emscripten_temp_dbnv034x/main_0.o -x c++ main.cpp
clang -cc1 version 16.0.0 based upon LLVM 16.0.0git default target x86_64-apple-darwin20.6.0
ignoring nonexistent directory "/Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1"
ignoring nonexistent directory "/Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
/Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include/SDL
/Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include/compat
/Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1
/Users/admin/src/emsdk/upstream/lib/clang/16.0.0/include
/Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
"/Users/admin/src/emsdk/upstream/bin/wasm-ld" -o build/unlink.wasm /var/folders/jy/c7h5q7q91jj__0wcv7m6zhyw0000gn/T/emscripten_temp_dbnv034x/main_0.o -L/Users/admin/src/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten -lGL -lal -lhtml5 -lstubs-debug -lnoexit -lc-debug -ldlmalloc -lcompiler_rt -lc++-noexcept -lc++abi-noexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --import-undefined --strip-debug --export-if-defined=main --export-if-defined=__start_em_asm --export-if-defined=__stop_em_asm --export-if-defined=__start_em_js --export-if-defined=__stop_em_js --export-if-defined=__main_argc_argv --export-if-defined=fflush --export=emscripten_stack_get_end --export=emscripten_stack_get_free --export=emscripten_stack_get_base --export=emscripten_stack_init --export=stackSave --export=stackRestore --export=stackAlloc --export=__wasm_call_ctors --export=__errno_location --export=__get_temp_ret --export=__set_temp_ret --export-table -z stack-size=5242880 --initial-memory=16777216 --no-entry --max-memory=16777216 --global-base=1024
"/Users/admin/src/emsdk/upstream/bin/wasm-emscripten-finalize" --dyncalls-i64 --pass-arg=legalize-js-interface-exported-helpers build/unlink.wasm -o build/unlink.wasm --detect-features
"/Users/admin/src/emsdk/node/14.18.2_64bit/bin/node" /Users/admin/src/emsdk/upstream/emscripten/src/compiler.js /var/folders/jy/c7h5q7q91jj__0wcv7m6zhyw0000gn/T/tmphr4xyn1y.json
"/Users/admin/src/emsdk/upstream/bin/llvm-objcopy" build/unlink.wasm build/unlink.wasm --remove-section=.debug* --remove-section=producers
"/Users/admin/src/emsdk/node/14.18.2_64bit/bin/node" /Users/admin/src/emsdk/upstream/emscripten/tools/preprocessor.js /var/folders/jy/c7h5q7q91jj__0wcv7m6zhyw0000gn/T/emscripten_temp_dbnv034x/settings.js shell.html
```
Program output:
```
unlink.html:1237 Files in 'subdir': . .. Test.txt
unlink.html:1237 Files in 'subdir':
unlink.js:1589 rmdir: Directory not empty
unlink.js:922 Aborted(Assertion failed: err == 0, at: main.cpp,43,main)
unlink.js:36 Uncaught RuntimeError: Aborted(Assertion failed: err == 0, at: main.cpp,43,main)
at abort (unlink.js:941:11)
at ___assert_fail (unlink.js:1307:7)
at unlink.wasm:0x710
at unlink.wasm:0x72f
at unlink.js:985:22
at callMain (unlink.js:5027:15)
at doRun (unlink.js:5081:23)
at unlink.js:5092:7
```
Contributor guide
Assessment
This issue has not been assessed yet.