Skip to content

Commit

Permalink
patch 8.2.3218: when using xchaha20 crypt undo file is not removed
Browse files Browse the repository at this point in the history
Problem:    When using xchaha20 crypt undo file is not removed.
Solution:   Reset 'undofile' and delete the file. (Christian Brabandt,
            closes #8630, closes #8467)
  • Loading branch information
chrisbra authored and brammool committed Jul 25, 2021
1 parent 3ed0d93 commit 8a4c812
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 11 deletions.
17 changes: 13 additions & 4 deletions src/bufwrite.c
Expand Up @@ -1982,20 +1982,29 @@ buf_write(
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
&& !filtering
# 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);
Expand Down
5 changes: 1 addition & 4 deletions src/crypt.c
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions src/proto/undo.pro
Expand Up @@ -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 : */
7 changes: 4 additions & 3 deletions src/testdir/test_crypt.vim
Expand Up @@ -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)
Expand All @@ -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'))
Expand All @@ -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)
Expand All @@ -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
Expand Down
22 changes: 22 additions & 0 deletions src/undo.c
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -755,6 +755,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3218,
/**/
3217,
/**/
Expand Down

0 comments on commit 8a4c812

Please sign in to comment.