From 60a477a30365c90a0f4de34527914b14de31a953 Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Tue, 2 Feb 2016 16:46:57 -0800 Subject: [PATCH] Don't crash when autosuggesting cd'ing into a directory with ~ Fixes #2696 --- src/fish_tests.cpp | 12 +++++++++++- src/highlight.cpp | 6 +++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/fish_tests.cpp b/src/fish_tests.cpp index dc999a36e..90d9dadc3 100644 --- a/src/fish_tests.cpp +++ b/src/fish_tests.cpp @@ -2330,7 +2330,7 @@ static void test_autosuggest_suggest_special() if (system("mkdir -p /tmp/autosuggest_test/start/unique2/unique3/multi4")) err(L"mkdir failed"); if (system("mkdir -p /tmp/autosuggest_test/start/unique2/unique3/multi42")) err(L"mkdir failed"); if (system("mkdir -p /tmp/autosuggest_test/start/unique2/.hiddenDir/moreStuff")) err(L"mkdir failed"); - + const wcstring wd = L"/tmp/autosuggest_test/"; perform_one_autosuggestion_special_test(L"cd /tmp/autosuggest_test/0", wd, L"cd /tmp/autosuggest_test/0foobar/", __LINE__); perform_one_autosuggestion_special_test(L"cd \"/tmp/autosuggest_test/0", wd, L"cd \"/tmp/autosuggest_test/0foobar/\"", __LINE__); @@ -2381,6 +2381,16 @@ static void test_autosuggest_suggest_special() // A single quote should defeat tilde expansion perform_one_autosuggestion_special_test(L"cd '~/test_autosuggest_suggest_specia'", wd, L"", __LINE__); + + // Don't crash on ~ (2696) + // note this was wd dependent, hence why we set it + char saved_wd[PATH_MAX] = {}; + if (NULL == getcwd(saved_wd, sizeof saved_wd)) err(L"getcwd failed"); + if (chdir("/tmp/autosuggest_test/")) err(L"chdir failed"); + + if (system("mkdir -p '/tmp/autosuggest_test/~hahaha/path1/path2/'")) err(L"mkdir failed"); + perform_one_autosuggestion_special_test(L"cd ~haha", wd, L"cd ~hahaha/path1/path2/", __LINE__); + if (chdir(saved_wd)) err(L"chdir failed"); if (system("rm -Rf '/tmp/autosuggest_test/'")) err(L"rm failed"); if (system("rm -Rf ~/test_autosuggest_suggest_special/")) err(L"rm failed"); diff --git a/src/highlight.cpp b/src/highlight.cpp index 17ed7e97b..9ed94e086 100644 --- a/src/highlight.cpp +++ b/src/highlight.cpp @@ -65,7 +65,7 @@ static const wchar_t * const highlight_var[] = }; -/* If the given path looks like it's relative to the working directory, then prepend that working directory. */ +/* If the given path looks like it's relative to the working directory, then prepend that working directory. This operates on unescaped paths only (so a ~ means a literal ~) */ static wcstring apply_working_directory(const wcstring &path, const wcstring &working_directory) { if (path.empty() || working_directory.empty()) @@ -76,7 +76,7 @@ static wcstring apply_working_directory(const wcstring &path, const wcstring &wo switch (path.at(0)) { case L'/': - case L'~': + case HOME_DIRECTORY: prepend_wd = false; break; default: @@ -1218,7 +1218,7 @@ void highlighter_t::color_redirection(const parse_node_t &redirection_node) } else { - /* Ok, we successfully expanded our target. Now verify that it works with this redirection. We will probably need it as a path (but not in the case of fd redirections */ + /* Ok, we successfully expanded our target. Now verify that it works with this redirection. We will probably need it as a path (but not in the case of fd redirections). Note that the target is now unescaped. */ const wcstring target_path = apply_working_directory(target, this->working_directory); switch (redirect_type) {