diff --git a/src/parser.cpp b/src/parser.cpp index 320fa8649..0accab384 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -85,7 +85,7 @@ parser_t::parser_t(std::shared_ptr vars) : variables(std::move(vars int cwd = open_cloexec(".", O_RDONLY); if (cwd < 0) { perror("Unable to open the current working directory"); - abort(); + return; } libdata().cwd_fd = std::make_shared(cwd); } diff --git a/tests/checks/init-unreadable-cwd.fish b/tests/checks/init-unreadable-cwd.fish new file mode 100644 index 000000000..fee220847 --- /dev/null +++ b/tests/checks/init-unreadable-cwd.fish @@ -0,0 +1,17 @@ +#RUN: %fish -C 'set -g fish %fish' %s +# Test that fish doesn't crash if cwd is unreadable at the start (#6597) + +set -l oldpwd $PWD +set -l tmpdir (mktemp -d) + +# $fish might be a relative path (e.g. "../test/root/bin/fish") +set -l fish (builtin realpath $fish) +cd $tmpdir +chmod 000 . +$fish -c 'echo Look Ma! No crashing!' +#CHECK: Look Ma! No crashing! +#CHECKERR: Unable to open the current working directory: Permission denied + +# Careful here, Solaris' rm tests if the directory is in $PWD, so we need to cd back +cd $oldpwd +rmdir $tmpdir