diff options
author | Gregory Anders <greg@gpanders.com> | 2021-08-27 10:33:51 -0600 |
---|---|---|
committer | Gregory Anders <greg@gpanders.com> | 2021-08-27 10:45:25 -0600 |
commit | 4e516e53bfde35901b055bbc85d84a6d471ebc34 (patch) | |
tree | 37a704585e064569b0cd4c90f2b2296af44ae8ae | |
parent | 460019366e58e1bcd42959f76494e38bd895e762 (diff) | |
download | rneovim-4e516e53bfde35901b055bbc85d84a6d471ebc34.tar.gz rneovim-4e516e53bfde35901b055bbc85d84a6d471ebc34.tar.bz2 rneovim-4e516e53bfde35901b055bbc85d84a6d471ebc34.zip |
fix: remove trailing slashes before making directory
Remove the trailing slashes from 'undofile' and 'backupdir' before
creating directories. They cause problems on Windows which doesn't
recognize these slashes as proper path separators.
-rw-r--r-- | src/nvim/fileio.c | 20 | ||||
-rw-r--r-- | src/nvim/memline.c | 2 | ||||
-rw-r--r-- | src/nvim/undo.c | 10 |
3 files changed, 24 insertions, 8 deletions
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 5099b3e812..92b48c36cb 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -2688,7 +2688,12 @@ buf_write( /* * Isolate one directory name, using an entry in 'bdir'. */ - (void)copy_option_part(&dirp, IObuff, IOSIZE, ","); + size_t dir_len = copy_option_part(&dirp, IObuff, IOSIZE, ","); + p = IObuff + dir_len; + bool trailing_pathseps = after_pathsep((char *)IObuff, (char *)p) && p[-1] == p[-2]; + if (trailing_pathseps) { + IObuff[dir_len - 2] = NUL; + } if (*dirp == NUL && !os_isdir(IObuff)) { int ret; char *failed_dir; @@ -2698,8 +2703,7 @@ buf_write( xfree(failed_dir); } } - p = IObuff + STRLEN(IObuff); - if (after_pathsep((char *)IObuff, (char *)p) && p[-1] == p[-2]) { + if (trailing_pathseps) { // Ends with '//', Use Full path if ((p = (char_u *)make_percent_swname((char *)IObuff, (char *)fname)) != NULL) { @@ -2849,7 +2853,12 @@ nobackup: /* * Isolate one directory name and make the backup file name. */ - (void)copy_option_part(&dirp, IObuff, IOSIZE, ","); + size_t dir_len = copy_option_part(&dirp, IObuff, IOSIZE, ","); + p = IObuff + dir_len; + bool trailing_pathseps = after_pathsep((char *)IObuff, (char *)p) && p[-1] == p[-2]; + if (trailing_pathseps) { + IObuff[dir_len - 2] = NUL; + } if (*dirp == NUL && !os_isdir(IObuff)) { int ret; char *failed_dir; @@ -2859,8 +2868,7 @@ nobackup: xfree(failed_dir); } } - p = IObuff + STRLEN(IObuff); - if (after_pathsep((char *)IObuff, (char *)p) && p[-1] == p[-2]) { + if (trailing_pathseps) { // path ends with '//', use full path if ((p = (char_u *)make_percent_swname((char *)IObuff, (char *)fname)) != NULL) { diff --git a/src/nvim/memline.c b/src/nvim/memline.c index 4d435bc99f..230361b997 100644 --- a/src/nvim/memline.c +++ b/src/nvim/memline.c @@ -1442,7 +1442,7 @@ recover_names ( * Append the full path to name with path separators made into percent * signs, to dir. An unnamed buffer is handled as "" (<currentdir>/"") */ -char *make_percent_swname(const char *dir, char *name) +char *make_percent_swname(const char *dir, const char *name) FUNC_ATTR_NONNULL_ARG(1) { char *d = NULL; diff --git a/src/nvim/undo.c b/src/nvim/undo.c index e1a7dbb2d3..fb96d7e6ff 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -672,6 +672,7 @@ char *u_get_undo_file_name(const char *const buf_ffname, const bool reading) #ifdef HAVE_READLINK char fname_buf[MAXPATHL]; #endif + char *p; if (ffname == NULL) { return NULL; @@ -704,6 +705,13 @@ char *u_get_undo_file_name(const char *const buf_ffname, const bool reading) memmove(tail + tail_len + 1, ".un~", sizeof(".un~")); } else { dir_name[dir_len] = NUL; + + // Remove trailing pathseps from directory name + p = &dir_name[dir_len - 1]; + while (vim_ispathsep(*p)) { + *p-- = NUL; + } + bool has_directory = os_isdir((char_u *)dir_name); if (!has_directory && *dirp == NUL && !reading) { // Last directory in the list does not exist, create it. @@ -720,7 +728,7 @@ char *u_get_undo_file_name(const char *const buf_ffname, const bool reading) if (has_directory) { if (munged_name == NULL) { munged_name = xstrdup(ffname); - for (char *p = munged_name; *p != NUL; MB_PTR_ADV(p)) { + for (p = munged_name; *p != NUL; MB_PTR_ADV(p)) { if (vim_ispathsep(*p)) { *p = '%'; } |