| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.730 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.4.730 |
| Problem: When setting the crypt key and using a swap file, text may be |
| encrypted twice or unencrypted text remains in the swap file. |
| (Issue 369) |
| Solution: Call ml_preserve() before re-encrypting. Set correct index for |
| next pointer block. |
| Files: src/memfile.c, src/memline.c, src/proto/memline.pro, src/option.c |
| |
| |
| |
| |
| |
| *** 811,816 **** |
| --- 811,818 ---- |
| * |
| * Return the block header to the caller, including the memory block, so |
| * it can be re-used. Make sure the page_count is right. |
| + * |
| + * Returns NULL if no block is released. |
| */ |
| static bhdr_T * |
| mf_release(mfp, page_count) |
| |
| *** 1219,1225 **** |
| } |
| |
| /* |
| ! * Lookup a translation from the trans lists and delete the entry |
| * |
| * Return the positive new number when found, the old number when not found |
| */ |
| --- 1221,1227 ---- |
| } |
| |
| /* |
| ! * Lookup a translation from the trans lists and delete the entry. |
| * |
| * Return the positive new number when found, the old number when not found |
| */ |
| |
| |
| |
| *** 488,494 **** |
| ml_set_crypt_key(buf, old_key, old_cm) |
| buf_T *buf; |
| char_u *old_key; |
| ! int old_cm; |
| { |
| memfile_T *mfp = buf->b_ml.ml_mfp; |
| bhdr_T *hp; |
| --- 488,494 ---- |
| ml_set_crypt_key(buf, old_key, old_cm) |
| buf_T *buf; |
| char_u *old_key; |
| ! char_u *old_cm; |
| { |
| memfile_T *mfp = buf->b_ml.ml_mfp; |
| bhdr_T *hp; |
| |
| *** 500,514 **** |
| DATA_BL *dp; |
| blocknr_T bnum; |
| int top; |
| |
| if (mfp == NULL) |
| return; /* no memfile yet, nothing to do */ |
| |
| /* Set the key, method and seed to be used for reading, these must be the |
| * old values. */ |
| mfp->mf_old_key = old_key; |
| ! mfp->mf_old_cm = old_cm; |
| ! if (old_cm > 0) |
| mch_memmove(mfp->mf_old_seed, mfp->mf_seed, MF_SEED_LEN); |
| |
| /* Update block 0 with the crypt flag and may set a new seed. */ |
| --- 500,529 ---- |
| DATA_BL *dp; |
| blocknr_T bnum; |
| int top; |
| + int old_method; |
| |
| if (mfp == NULL) |
| return; /* no memfile yet, nothing to do */ |
| + old_method = crypt_method_nr_from_name(old_cm); |
| + |
| + /* First make sure the swapfile is in a consistent state, using the old |
| + * key and method. */ |
| + { |
| + char_u *new_key = buf->b_p_key; |
| + char_u *new_buf_cm = buf->b_p_cm; |
| + |
| + buf->b_p_key = old_key; |
| + buf->b_p_cm = old_cm; |
| + ml_preserve(buf, FALSE); |
| + buf->b_p_key = new_key; |
| + buf->b_p_cm = new_buf_cm; |
| + } |
| |
| /* Set the key, method and seed to be used for reading, these must be the |
| * old values. */ |
| mfp->mf_old_key = old_key; |
| ! mfp->mf_old_cm = old_method; |
| ! if (old_method > 0 && *old_key != NUL) |
| mch_memmove(mfp->mf_old_seed, mfp->mf_seed, MF_SEED_LEN); |
| |
| /* Update block 0 with the crypt flag and may set a new seed. */ |
| |
| *** 561,568 **** |
| { |
| if (pp->pb_pointer[idx].pe_bnum < 0) |
| { |
| ! /* Skip data block with negative block number. */ |
| ! ++idx; /* get same block again for next index */ |
| continue; |
| } |
| |
| --- 576,585 ---- |
| { |
| if (pp->pb_pointer[idx].pe_bnum < 0) |
| { |
| ! /* Skip data block with negative block number. |
| ! * Should not happen, because of the ml_preserve() |
| ! * above. Get same block again for next index. */ |
| ! ++idx; |
| continue; |
| } |
| |
| |
| *** 579,584 **** |
| --- 596,602 ---- |
| |
| bnum = pp->pb_pointer[idx].pe_bnum; |
| page_count = pp->pb_pointer[idx].pe_page_count; |
| + idx = 0; |
| continue; |
| } |
| } |
| |
| *** 605,610 **** |
| --- 623,630 ---- |
| idx = ip->ip_index + 1; /* go to next index */ |
| page_count = 1; |
| } |
| + if (hp != NULL) |
| + mf_put(mfp, hp, FALSE, FALSE); /* release previous block */ |
| |
| if (error > 0) |
| EMSG(_("E843: Error while updating swap file crypt")); |
| |
| *** 4859,4864 **** |
| --- 4879,4888 ---- |
| if (dp->db_id != DATA_ID) |
| return data; |
| |
| + state = ml_crypt_prepare(mfp, offset, FALSE); |
| + if (state == NULL) |
| + return data; |
| + |
| new_data = (char_u *)alloc(size); |
| if (new_data == NULL) |
| return NULL; |
| |
| *** 4870,4876 **** |
| mch_memmove(new_data, dp, head_end - (char_u *)dp); |
| |
| /* Encrypt the text. */ |
| - state = ml_crypt_prepare(mfp, offset, FALSE); |
| crypt_encode(state, text_start, text_len, new_data + dp->db_txt_start); |
| crypt_free_state(state); |
| |
| --- 4894,4899 ---- |
| |
| *** 4882,4888 **** |
| } |
| |
| /* |
| ! * Decrypt the text in "data" if it points to a data block. |
| */ |
| void |
| ml_decrypt_data(mfp, data, offset, size) |
| --- 4905,4911 ---- |
| } |
| |
| /* |
| ! * Decrypt the text in "data" if it points to an encrypted data block. |
| */ |
| void |
| ml_decrypt_data(mfp, data, offset, size) |
| |
| *** 4907,4916 **** |
| || dp->db_txt_end > size) |
| return; /* data was messed up */ |
| |
| - /* Decrypt the text in place. */ |
| state = ml_crypt_prepare(mfp, offset, TRUE); |
| ! crypt_decode_inplace(state, text_start, text_len); |
| ! crypt_free_state(state); |
| } |
| } |
| |
| --- 4930,4942 ---- |
| || dp->db_txt_end > size) |
| return; /* data was messed up */ |
| |
| state = ml_crypt_prepare(mfp, offset, TRUE); |
| ! if (state != NULL) |
| ! { |
| ! /* Decrypt the text in place. */ |
| ! crypt_decode_inplace(state, text_start, text_len); |
| ! crypt_free_state(state); |
| ! } |
| } |
| } |
| |
| |
| *** 4943,4948 **** |
| --- 4969,4976 ---- |
| key = buf->b_p_key; |
| seed = mfp->mf_seed; |
| } |
| + if (*key == NUL) |
| + return NULL; |
| |
| if (method_nr == CRYPT_M_ZIP) |
| { |
| |
| |
| |
| *** 1,6 **** |
| /* memline.c */ |
| int ml_open __ARGS((buf_T *buf)); |
| ! void ml_set_crypt_key __ARGS((buf_T *buf, char_u *old_key, int old_cm)); |
| void ml_setname __ARGS((buf_T *buf)); |
| void ml_open_files __ARGS((void)); |
| void ml_open_file __ARGS((buf_T *buf)); |
| --- 1,6 ---- |
| /* memline.c */ |
| int ml_open __ARGS((buf_T *buf)); |
| ! void ml_set_crypt_key __ARGS((buf_T *buf, char_u *old_key, char_u *old_cm)); |
| void ml_setname __ARGS((buf_T *buf)); |
| void ml_open_files __ARGS((void)); |
| void ml_open_file __ARGS((buf_T *buf)); |
| |
| |
| |
| *** 6163,6169 **** |
| # endif |
| if (STRCMP(curbuf->b_p_key, oldval) != 0) |
| /* Need to update the swapfile. */ |
| ! ml_set_crypt_key(curbuf, oldval, crypt_get_method_nr(curbuf)); |
| } |
| |
| else if (gvarp == &p_cm) |
| --- 6163,6170 ---- |
| # endif |
| if (STRCMP(curbuf->b_p_key, oldval) != 0) |
| /* Need to update the swapfile. */ |
| ! ml_set_crypt_key(curbuf, oldval, |
| ! *curbuf->b_p_cm == NUL ? p_cm : curbuf->b_p_cm); |
| } |
| |
| else if (gvarp == &p_cm) |
| |
| *** 6207,6214 **** |
| else |
| p = curbuf->b_p_cm; |
| if (STRCMP(s, p) != 0) |
| ! ml_set_crypt_key(curbuf, curbuf->b_p_key, |
| ! crypt_method_nr_from_name(s)); |
| |
| /* If the global value changes need to update the swapfile for all |
| * buffers using that value. */ |
| --- 6208,6214 ---- |
| else |
| p = curbuf->b_p_cm; |
| if (STRCMP(s, p) != 0) |
| ! ml_set_crypt_key(curbuf, curbuf->b_p_key, s); |
| |
| /* If the global value changes need to update the swapfile for all |
| * buffers using that value. */ |
| |
| *** 6218,6225 **** |
| |
| for (buf = firstbuf; buf != NULL; buf = buf->b_next) |
| if (buf != curbuf && *buf->b_p_cm == NUL) |
| ! ml_set_crypt_key(buf, buf->b_p_key, |
| ! crypt_method_nr_from_name(oldval)); |
| } |
| } |
| } |
| --- 6218,6224 ---- |
| |
| for (buf = firstbuf; buf != NULL; buf = buf->b_next) |
| if (buf != curbuf && *buf->b_p_cm == NUL) |
| ! ml_set_crypt_key(buf, buf->b_p_key, oldval); |
| } |
| } |
| } |
| |
| |
| |
| *** 743,744 **** |
| --- 743,746 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 730, |
| /**/ |
| |
| -- |
| From "know your smileys": |
| :-X My lips are sealed |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |