Only inherit a PWD if it resolves to "."

Fixes #5647
This commit is contained in:
ridiculousfish 2019-02-18 13:11:01 -08:00
parent e26ab3d81c
commit 5c994b0d47
4 changed files with 32 additions and 6 deletions

View File

@ -1,3 +1,12 @@
# fish 3.0.2
This release of fish contains the following ixes:
### Fixes and improvements
- The PWD environment variable is now ignored if it does not resolve to the true working directory (#5647).
# fish 3.0.1 (released February 11, 2019)
This release of fish fixes a number of major issues discovered in fish 3.0.0.

View File

@ -960,12 +960,13 @@ void env_init(const struct config_paths_t *paths /* or NULL */) {
}
}
// initialize the PWD variable if necessary
// Note we may inherit a virtual PWD that doesn't match what getcwd would return; respect that.
// Note we treat PWD as read-only so it was not set in vars.
const char *incoming_pwd = getenv("PWD");
if (incoming_pwd && incoming_pwd[0]) {
env_set_one(L"PWD", ENV_EXPORT | ENV_GLOBAL, str2wcstring(incoming_pwd));
// Note we may inherit a virtual PWD that doesn't match what getcwd would return; respect that
// if and only if it matches getcwd (#5647). Note we treat PWD as read-only so it was not set in
// vars.
const char *incoming_pwd_cstr = getenv("PWD");
wcstring incoming_pwd = incoming_pwd_cstr ? str2wcstring(incoming_pwd_cstr) : wcstring{};
if (!incoming_pwd.empty() && paths_are_same_file(incoming_pwd, L".")) {
env_set_one(L"PWD", ENV_EXPORT | ENV_GLOBAL, std::move(incoming_pwd));
} else {
env_set_pwd_from_getcwd();
}

View File

@ -46,8 +46,22 @@ mkdir -p $base/realhome
set fish_path $PWD/../test/root/bin/fish
ln -s $base/realhome $base/linkhome
cd $base/linkhome
set -l real_getcwd (pwd -P)
env HOME=$base/linkhome $fish_path -c 'echo PWD is $PWD'
# Do not inherit a virtual PWD that fails to resolve to getcwd (#5647)
env HOME=$base/linkhome PWD=/tmp $fish_path -c 'echo $PWD' | read output_pwd
test (realpath $output_pwd) = $real_getcwd
and echo "BogusPWD test 1 succeeded"
or echo "BogusPWD test 1 failed: $output_pwd vs $real_getcwd"
env HOME=$base/linkhome PWD=/path/to/nowhere $fish_path -c 'echo $PWD' | read output_pwd
test (realpath $output_pwd) = $real_getcwd
and echo "BogusPWD test 2 succeeded"
or echo "BogusPWD test 2 failed: $output_pwd vs $real_getcwd"
# cd back before removing the test directory again.
cd $oldpwd
rm -Rf $base

View File

@ -21,3 +21,5 @@ cd:
####################
# Virtual PWD inheritance
PWD is /tmp/cdcomp_test/linkhome
BogusPWD test 1 succeeded
BogusPWD test 2 succeeded