parser: Stop crashing when cwd isn't readable

Everything seems to be working, so instead of crashing just print an
error and return.

Fixes #6597
This commit is contained in:
Fabian Homborg 2020-02-14 17:18:27 +01:00
parent 56040d2d7f
commit ceba851d44
2 changed files with 18 additions and 1 deletions

View File

@ -85,7 +85,7 @@ parser_t::parser_t(std::shared_ptr<env_stack_t> vars) : variables(std::move(vars
int cwd = open_cloexec(".", O_RDONLY); int cwd = open_cloexec(".", O_RDONLY);
if (cwd < 0) { if (cwd < 0) {
perror("Unable to open the current working directory"); perror("Unable to open the current working directory");
abort(); return;
} }
libdata().cwd_fd = std::make_shared<const autoclose_fd_t>(cwd); libdata().cwd_fd = std::make_shared<const autoclose_fd_t>(cwd);
} }

View File

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