summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Brabandt <cb@256bit.org>2021-07-25 14:36:05 +0200
committerBram Moolenaar <Bram@vim.org>2021-07-25 14:36:05 +0200
commit8a4c812ede5b01a8e71082c1ff4ebfcbf1bd515f (patch)
tree2da838678bac4dd3d5fa1681e818517421e0e86b
parent3ed0d9379683246a77aa8c1a59da7a0ac6395339 (diff)
patch 8.2.3218: when using xchaha20 crypt undo file is not removedv8.2.3218
Problem: When using xchaha20 crypt undo file is not removed. Solution: Reset 'undofile' and delete the file. (Christian Brabandt, closes #8630, closes #8467)
-rw-r--r--src/bufwrite.c17
-rw-r--r--src/crypt.c5
-rw-r--r--src/proto/undo.pro1
-rw-r--r--src/testdir/test_crypt.vim7
-rw-r--r--src/undo.c22
-rw-r--r--src/version.c2
6 files changed, 43 insertions, 11 deletions
diff --git a/src/bufwrite.c b/src/bufwrite.c
index e480e57e7c..a38fb1c0e8 100644
--- a/src/bufwrite.c
+++ b/src/bufwrite.c
@@ -1982,8 +1982,6 @@ restore_backup:
write_info.bw_start_lnum = start;
#ifdef FEAT_PERSISTENT_UNDO
- // TODO: if the selected crypt method prevents the undo file from being
- // written, and existing undo file should be deleted.
write_undo_file = (buf->b_p_udf
&& overwriting
&& !append
@@ -1991,11 +1989,22 @@ restore_backup:
# ifdef CRYPT_NOT_INPLACE
// writing undo file requires
// crypt_encode_inplace()
- && (curbuf->b_cryptstate == NULL
- || crypt_works_inplace(curbuf->b_cryptstate))
+ && (buf->b_cryptstate == NULL
+ || crypt_works_inplace(buf->b_cryptstate))
# endif
&& reset_changed
&& !checking_conversion);
+# ifdef CRYPT_NOT_INPLACE
+ // remove undo file if encrypting it is not possible
+ if (buf->b_p_udf
+ && overwriting
+ && !append
+ && !filtering
+ && !checking_conversion
+ && buf->b_cryptstate != NULL
+ && !crypt_works_inplace(buf->b_cryptstate))
+ u_undofile_reset_and_delete(buf);
+# endif
if (write_undo_file)
// Prepare for computing the hash value of the text.
sha256_start(&sha_ctx);
diff --git a/src/crypt.c b/src/crypt.c
index 1b2ece5db4..fad6df0ddc 100644
--- a/src/crypt.c
+++ b/src/crypt.c
@@ -616,11 +616,8 @@ crypt_check_swapfile_curbuf(void)
// swap and undo files, so disable them
mf_close_file(curbuf, TRUE); // remove the swap file
set_option_value((char_u *)"swf", 0, NULL, OPT_LOCAL);
-#ifdef FEAT_PERSISTENT_UNDO
- set_option_value((char_u *)"udf", 0, NULL, OPT_LOCAL);
-#endif
msg_scroll = TRUE;
- msg(_("Note: Encryption of swapfile not supported, disabling swap- and undofile"));
+ msg(_("Note: Encryption of swapfile not supported, disabling swap file"));
}
}
#endif
diff --git a/src/proto/undo.pro b/src/proto/undo.pro
index 97dbef37cd..851d281f30 100644
--- a/src/proto/undo.pro
+++ b/src/proto/undo.pro
@@ -27,5 +27,6 @@ int anyBufIsChanged(void);
int bufIsChangedNotTerm(buf_T *buf);
int curbufIsChanged(void);
void f_undofile(typval_T *argvars, typval_T *rettv);
+void u_undofile_reset_and_delete(buf_T *buf);
void f_undotree(typval_T *argvars, typval_T *rettv);
/* vim: set ft=c : */
diff --git a/src/testdir/test_crypt.vim b/src/testdir/test_crypt.vim
index 883c899cfe..2e34c80a1d 100644
--- a/src/testdir/test_crypt.vim
+++ b/src/testdir/test_crypt.vim
@@ -133,7 +133,7 @@ func Test_uncrypt_xchacha20_invalid()
catch
call assert_exception('pre-mature')
endtry
- call assert_match("Note: Encryption of swapfile not supported, disabling swap- and undofile", execute(':5messages'))
+ call assert_match("Note: Encryption of swapfile not supported, disabling swap file", execute(':5messages'))
call assert_equal(0, &swapfile)
call assert_equal("xchacha20", &cryptmethod)
@@ -152,7 +152,7 @@ func Test_uncrypt_xchacha20_2()
call feedkeys(":X\<CR>sodium\<CR>sodium\<CR>", 'xt')
" swapfile disabled
call assert_equal(0, &swapfile)
- call assert_match("Note: Encryption of swapfile not supported, disabling swap- and undofile", execute(':messages'))
+ call assert_match("Note: Encryption of swapfile not supported, disabling swap file", execute(':messages'))
w!
" encrypted using xchacha20
call assert_match("\[xchacha20\]", execute(':messages'))
@@ -176,7 +176,7 @@ func Test_uncrypt_xchacha20_3_persistent_undo()
sp Xcrypt_sodium_undo.txt
set cryptmethod=xchacha20 undofile
call feedkeys(":X\<CR>sodium\<CR>sodium\<CR>", 'xt')
- call assert_equal(0, &undofile)
+ call assert_equal(1, &undofile)
let ufile=undofile(@%)
call append(0, ['monday', 'tuesday', 'wednesday', 'thursday', 'friday'])
call cursor(1, 1)
@@ -189,6 +189,7 @@ func Test_uncrypt_xchacha20_3_persistent_undo()
normal dd
set undolevels=100
w!
+ call assert_equal(0, &undofile)
bw!
call feedkeys(":sp Xcrypt_sodium_undo.txt\<CR>sodium\<CR>", 'xt')
" should fail
diff --git a/src/undo.c b/src/undo.c
index 331c1e676b..171e817766 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -3669,6 +3669,28 @@ f_undofile(typval_T *argvars UNUSED, typval_T *rettv)
rettv->vval.v_string = NULL;
#endif
}
+#ifdef FEAT_PERSISTENT_UNDO
+/*
+ * Reset undofile option and delete the undofile
+ */
+ void
+u_undofile_reset_and_delete(buf_T *buf)
+{
+ char_u *file_name;
+
+ if (!buf->b_p_udf)
+ return;
+
+ file_name = u_get_undo_file_name(buf->b_ffname, TRUE);
+ if (file_name != NULL)
+ {
+ mch_remove(file_name);
+ vim_free(file_name);
+ }
+
+ set_option_value((char_u *)"undofile", 0L, NULL, OPT_LOCAL);
+}
+ #endif
/*
* "undotree()" function
diff --git a/src/version.c b/src/version.c
index 9e77d56c19..9b334e6749 100644
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3218,
+/**/
3217,
/**/
3216,