summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-10-14 17:52:23 +0100
committerBram Moolenaar <Bram@vim.org>2021-10-14 17:52:23 +0100
commit340dd0fbe462a15a9678cfba02085b4adcc45f02 (patch)
treec306b977fa7adba5010d56cedd4cfc530f77349f
parent051a8a375f8fb6a931fbc5ccca714a200d9b327f (diff)
downloadvim-git-340dd0fbe462a15a9678cfba02085b4adcc45f02.tar.gz
patch 8.2.3509: undo file is not syncedv8.2.3509
Problem: Undo file is not synced. (Sami Farin) Solution: Sync the undo file if 'fsync' is set. (Christian Brabandt, closes #8879, closes #8920)
-rw-r--r--runtime/doc/options.txt4
-rw-r--r--src/undo.c5
-rw-r--r--src/version.c2
3 files changed, 9 insertions, 2 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 6bf0a5820..91df5df2e 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -3610,8 +3610,8 @@ A jump table for the options with a short description can be found at |Q_op|.
systems without an fsync() implementation, this variable is always
off.
Also see 'swapsync' for controlling fsync() on swap files.
- 'fsync' also applies to |writefile()|, unless a flag is used to
- overrule it.
+ 'fsync' also applies to |writefile()| (unless a flag is used to
+ overrule it) and when writing undo files (see |undo-persistence|).
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
diff --git a/src/undo.c b/src/undo.c
index 814130108..033fa6ea0 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -1786,6 +1786,11 @@ u_write_undo(
write_ok = FALSE;
#endif
+#if defined(UNIX) && defined(HAVE_FSYNC)
+ if (p_fs && fflush(fp) == 0 && vim_fsync(fd) != 0)
+ write_ok = FALSE;
+#endif
+
write_error:
fclose(fp);
if (!write_ok)
diff --git a/src/version.c b/src/version.c
index 2125972bb..31f00157b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3509,
+/**/
3508,
/**/
3507,