diff options
author | Christian Brabandt <cb@256bit.org> | 2021-07-25 14:36:05 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-07-25 14:36:05 +0200 |
commit | 8a4c812ede5b01a8e71082c1ff4ebfcbf1bd515f (patch) | |
tree | 2da838678bac4dd3d5fa1681e818517421e0e86b | |
parent | 3ed0d9379683246a77aa8c1a59da7a0ac6395339 (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.c | 17 | ||||
-rw-r--r-- | src/crypt.c | 5 | ||||
-rw-r--r-- | src/proto/undo.pro | 1 | ||||
-rw-r--r-- | src/testdir/test_crypt.vim | 7 | ||||
-rw-r--r-- | src/undo.c | 22 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |