patch 8.2.1219: symlink not followed if dirname ends in //
Problem: Symlink not followed if dirname ends in //.
Solution: Resolve symlink earlier. (Tomáš Janoušek, closes #6454)
diff --git a/src/memline.c b/src/memline.c
index 347b44d..084a8b0 100644
--- a/src/memline.c
+++ b/src/memline.c
@@ -3287,10 +3287,12 @@
#endif
/*
- * Replace line lnum, with buffering, in current buffer.
+ * Replace line "lnum", with buffering, in current buffer.
*
* If "copy" is TRUE, make a copy of the line, otherwise the line has been
* copied to allocated memory already.
+ * If "copy" is FALSE the "line" may be freed to add text properties!
+ * Do not use it after calling ml_replace().
*
* Check: The caller of this function should probably also call
* changed_lines(), unless update_screen(NOT_VALID) is used.
@@ -4366,6 +4368,11 @@
char_u *fname_res = fname;
#ifdef HAVE_READLINK
char_u fname_buf[MAXPATHL];
+
+ // Expand symlink in the file name, so that we put the swap file with the
+ // actual file instead of with the symlink.
+ if (resolve_symlink(fname, fname_buf) == OK)
+ fname_res = fname_buf;
#endif
#if defined(UNIX) || defined(MSWIN) // Need _very_ long file names
@@ -4375,7 +4382,7 @@
if (after_pathsep(dir_name, s) && len > 1 && s[-1] == s[-2])
{ // Ends with '//', Use Full path
r = NULL;
- if ((s = make_percent_swname(dir_name, fname)) != NULL)
+ if ((s = make_percent_swname(dir_name, fname_res)) != NULL)
{
r = modname(s, (char_u *)".swp", FALSE);
vim_free(s);
@@ -4384,13 +4391,6 @@
}
#endif
-#ifdef HAVE_READLINK
- // Expand symlink in the file name, so that we put the swap file with the
- // actual file instead of with the symlink.
- if (resolve_symlink(fname, fname_buf) == OK)
- fname_res = fname_buf;
-#endif
-
r = buf_modname(
(buf->b_p_sn || buf->b_shortname),
fname_res,