diff options
author | Rory Nesbitt <ranesbitt@live.co.uk> | 2023-09-27 18:09:55 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-27 10:09:55 -0700 |
commit | a66b0fdfaa35715c832b98b8941cc5673505e0c2 (patch) | |
tree | c61ba5de9fcbcccb9209657cbe3013a0881a385d /src/nvim | |
parent | bfdec5b0e71991ebc0a8ad7c12d39f7a9cc56f07 (diff) | |
download | rneovim-a66b0fdfaa35715c832b98b8941cc5673505e0c2.tar.gz rneovim-a66b0fdfaa35715c832b98b8941cc5673505e0c2.tar.bz2 rneovim-a66b0fdfaa35715c832b98b8941cc5673505e0c2.zip |
feat: NVIM_APPNAME supports relative paths #25233
Problem:
NVIM_APPNAME does not allow path separators in the name, so relative
paths can't be used:
NVIM_APPNAME="neovim-configs/first-config" nvim
NVIM_APPNAME="neovim-configs/second-config" nvim
Solution:
Let NVIM_APPNAME be a relative path. Absolute paths are not supported.
fix #23056
fix #24966
Diffstat (limited to 'src/nvim')
-rw-r--r-- | src/nvim/fileio.c | 7 | ||||
-rw-r--r-- | src/nvim/main.c | 2 | ||||
-rw-r--r-- | src/nvim/os/stdpaths.c | 20 |
3 files changed, 21 insertions, 8 deletions
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 7ff3e0ec6e..7609eb12b4 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -3279,12 +3279,18 @@ static void vim_mktempdir(void) char tmp[TEMP_FILE_PATH_MAXLEN]; char path[TEMP_FILE_PATH_MAXLEN]; char user[40] = { 0 }; + char appname[40] = { 0 }; (void)os_get_username(user, sizeof(user)); // Usernames may contain slashes! #19240 memchrsub(user, '/', '_', sizeof(user)); memchrsub(user, '\\', '_', sizeof(user)); + // Appname may be a relative path, replace slashes to make it name-like. + xstrlcpy(appname, get_appname(), sizeof(appname)); + memchrsub(appname, '/', '%', sizeof(appname)); + memchrsub(appname, '\\', '%', sizeof(appname)); + // Make sure the umask doesn't remove the executable bit. // "repl" has been reported to use "0177". mode_t umask_save = umask(0077); @@ -3298,7 +3304,6 @@ static void vim_mktempdir(void) // "/tmp/" exists, now try to create "/tmp/nvim.<user>/". add_pathsep(tmp); - const char *appname = get_appname(); xstrlcat(tmp, appname, sizeof(tmp)); xstrlcat(tmp, ".", sizeof(tmp)); xstrlcat(tmp, user, sizeof(tmp)); diff --git a/src/nvim/main.c b/src/nvim/main.c index 4b3244de12..720387cb17 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -251,7 +251,7 @@ int main(int argc, char **argv) argv0 = argv[0]; if (!appname_is_valid()) { - os_errmsg("$NVIM_APPNAME is not a valid file name.\n"); + os_errmsg("$NVIM_APPNAME must be a name or relative path.\n"); exit(1); } diff --git a/src/nvim/os/stdpaths.c b/src/nvim/os/stdpaths.c index 53ddda22fa..b129eb445a 100644 --- a/src/nvim/os/stdpaths.c +++ b/src/nvim/os/stdpaths.c @@ -69,15 +69,23 @@ const char *get_appname(void) return env_val; } -/// Ensure that APPNAME is valid. In particular, it cannot contain directory separators. +/// Ensure that APPNAME is valid. Must be a name or relative path. bool appname_is_valid(void) { const char *appname = get_appname(); - const size_t appname_len = strlen(appname); - for (size_t i = 0; i < appname_len; i++) { - if (appname[i] == PATHSEP) { - return false; - } + if (path_is_absolute(appname) + // TODO(justinmk): on Windows, path_is_absolute says "/" is NOT absolute. Should it? + || strequal(appname, "/") + || strequal(appname, "\\") + || strequal(appname, ".") + || strequal(appname, "..") +#ifdef BACKSLASH_IN_FILENAME + || strstr(appname, "\\..") != NULL + || strstr(appname, "..\\") != NULL +#endif + || strstr(appname, "/..") != NULL + || strstr(appname, "../") != NULL) { + return false; } return true; } |