]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.403 v7.4.403
authorBram Moolenaar <Bram@vim.org>
Wed, 13 Aug 2014 19:58:28 +0000 (21:58 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 13 Aug 2014 19:58:28 +0000 (21:58 +0200)
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.

src/fileio.c
src/memline.c
src/option.c
src/version.c

index a028b22a5c42cc57f2b0159808c03605745d85d9..17490ac21a22c73fe467e25d585127fea2625315 100644 (file)
@@ -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)
        {
index a5053f02336273be7c8499f7288d135dbaefba33..7adb2dc9905ea6a21fca2b7d5d44b62e1f412fa0 100644 (file)
@@ -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));
@@ -432,6 +433,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".
  */
@@ -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??"));
index 62556b69c9b05c306aa97a13cc349202950d14ad..f928b3ba941dd5b112c249c58fef05a240359150 100644 (file)
@@ -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
index e98036195f05415cf41dabf6c5e2bc16cda1c8a2..b832539c0e420b12fe068b2e9cf65170501b71fc 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    403,
 /**/
     402,
 /**/