]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.3218: when using xchaha20 crypt undo file is not removed v8.2.3218
authorChristian Brabandt <cb@256bit.org>
Sun, 25 Jul 2021 12:36:05 +0000 (14:36 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 25 Jul 2021 12:36:05 +0000 (14:36 +0200)
Problem:    When using xchaha20 crypt undo file is not removed.
Solution:   Reset 'undofile' and delete the file. (Christian Brabandt,
            closes #8630, closes #8467)

src/bufwrite.c
src/crypt.c
src/proto/undo.pro
src/testdir/test_crypt.vim
src/undo.c
src/version.c

index e480e57e7ca8636d632e7acc14fa3f7b4e76b7e8..a38fb1c0e86420f58722514ff7b8e01290847b59 100644 (file)
@@ -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);
index 1b2ece5db4f243a79b54fcac368ef8a42028ae62..fad6df0ddc483220805ed3391c8cabf0c9cabc29 100644 (file)
@@ -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
index 97dbef37cd0d481059b93e74251288678d6f850b..851d281f3046a74824c7f24e94daf69ef396b095 100644 (file)
@@ -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 : */
index 883c899cfeb629252354941935b3be8330173eea..2e34c80a1d877b2bc47682171c98150283692254 100644 (file)
@@ -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
index 331c1e676bae5109b1e45c5e54969cd371bb2fed..171e8177663b8ed9a7d11a81e89f6ce0d6428c02 100644 (file)
@@ -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
index 9e77d56c197084a3fac657f714a646481b0bc22c..9b334e67496338b0971a7cbaf1f5acceeacc4270 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3218,
 /**/
     3217,
 /**/