summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2014-08-13 21:58:28 +0200
committerBram Moolenaar <Bram@vim.org>2014-08-13 21:58:28 +0200
commit2be795084f053928879d758443e199ef147cc07e (patch)
treef463c710036022d066b5d852bcd1dac1140d2dab
parent5a669b94814a5ca1ff69f76f18c75a90f4404ca6 (diff)
updated for version 7.4.403v7.4.403
Problem: Valgrind reports errors when running test 72. (Dominique Pelle) Solution: Reset the local 'cryptmethod' option before storing the seed. Set the seed in the memfile even when there is no block0 yet.
-rw-r--r--src/fileio.c1
-rw-r--r--src/memline.c33
-rw-r--r--src/option.c8
-rw-r--r--src/version.c2
4 files changed, 43 insertions, 1 deletions
diff --git a/src/fileio.c b/src/fileio.c
index a028b22a5c..17490ac21a 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2944,6 +2944,7 @@ check_for_cryptkey(cryptkey, ptr, sizep, filesizep, newfile, fname, did_ask)
* Avoids accidentally overwriting the file with garbage. */
curbuf->b_p_ro = TRUE;
+ /* Set the cryptmethod local to the buffer. */
crypt_set_cm_option(curbuf, method);
if (cryptkey == NULL && !*did_ask)
{
diff --git a/src/memline.c b/src/memline.c
index a5053f0233..7adb2dc990 100644
--- a/src/memline.c
+++ b/src/memline.c
@@ -235,6 +235,7 @@ typedef enum {
} upd_block0_T;
#ifdef FEAT_CRYPT
+static void ml_set_mfp_crypt __ARGS((buf_T *buf));
static void ml_set_b0_crypt __ARGS((buf_T *buf, ZERO_BL *b0p));
#endif
static int ml_check_b0_id __ARGS((ZERO_BL *b0p));
@@ -433,6 +434,25 @@ error:
#if defined(FEAT_CRYPT) || defined(PROTO)
/*
+ * Prepare encryption for "buf" for the current key and method.
+ */
+ static void
+ml_set_mfp_crypt(buf)
+ buf_T *buf;
+{
+ if (*buf->b_p_key != NUL)
+ {
+ int method_nr = crypt_get_method_nr(buf);
+
+ if (method_nr > CRYPT_M_ZIP)
+ {
+ /* Generate a seed and store it in the memfile. */
+ sha2_seed(buf->b_ml.ml_mfp->mf_seed, MF_SEED_LEN, NULL, 0);
+ }
+ }
+}
+
+/*
* Prepare encryption for "buf" with block 0 "b0p".
*/
static void
@@ -915,8 +935,19 @@ ml_upd_block0(buf, what)
ZERO_BL *b0p;
mfp = buf->b_ml.ml_mfp;
- if (mfp == NULL || (hp = mf_get(mfp, (blocknr_T)0, 1)) == NULL)
+ if (mfp == NULL)
return;
+ hp = mf_get(mfp, (blocknr_T)0, 1);
+ if (hp == NULL)
+ {
+#ifdef FEAT_CRYPT
+ /* Possibly update the seed in the memfile before there is a block0. */
+ if (what == UB_CRYPT)
+ ml_set_mfp_crypt(buf);
+#endif
+ return;
+ }
+
b0p = (ZERO_BL *)(hp->bh_data);
if (ml_check_b0_id(b0p) == FAIL)
EMSG(_("E304: ml_upd_block0(): Didn't get block 0??"));
diff --git a/src/option.c b/src/option.c
index 62556b69c9..f928b3ba94 100644
--- a/src/option.c
+++ b/src/option.c
@@ -6163,6 +6163,14 @@ did_set_string_option(opt_idx, varp, new_value_alloced, oldval, errbuf,
p_cm = vim_strsave((char_u *)"zip");
new_value_alloced = TRUE;
}
+ /* When using ":set cm=name" the local value is going to be empty.
+ * Do that here, otherwise the crypt functions will still use the
+ * local value. */
+ if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0)
+ {
+ free_string_option(curbuf->b_p_cm);
+ curbuf->b_p_cm = empty_option;
+ }
/* Need to update the swapfile when the effective method changed.
* Set "s" to the effective old value, "p" to the effective new
diff --git a/src/version.c b/src/version.c
index e98036195f..b832539c0e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 403,
+/**/
402,
/**/
401,