Patch 8.0.0582
Problem: Illegal memory access with z= command. (Dominique Pelle)
Solution: Avoid case folded text to be longer than the original text. Use
MB_PTR2LEN() instead of MB_BYTE2LEN().
Files: src/spell.c, src/testdir/test_spell.vim
*** ../vim-8.0.0581/src/spell.c 2017-03-29 17:30:23.168136866 +0200
--- src/spell.c 2017-04-22 23:44:08.384237267 +0200
***************
*** 3123,3129 ****
if (has_mbyte)
{
! l = MB_BYTE2LEN(*p);
s = p;
if (l == 1)
{
--- 3123,3129 ----
if (has_mbyte)
{
! l = MB_PTR2LEN(p);
s = p;
if (l == 1)
{
***************
*** 3808,3813 ****
--- 3808,3817 ----
vim_strncpy(su->su_badword, su->su_badptr, su->su_badlen);
(void)spell_casefold(su->su_badptr, su->su_badlen,
su->su_fbadword, MAXWLEN);
+ /* TODO: make this work if the case-folded text is longer than the
original
+ * text. Currently an illegal byte causes wrong pointer computations. */
+ su->su_fbadword[su->su_badlen] = NUL;
+
/* get caps flags for bad word */
su->su_badflags = badword_captype(su->su_badptr,
su->su_badptr + su->su_badlen);
***************
*** 4937,4948 ****
{
int l;
! #ifdef FEAT_MBYTE
! if (has_mbyte)
! l = MB_BYTE2LEN(fword[sp->ts_fidx]);
! else
! #endif
! l = 1;
if (fword_ends)
{
/* Copy the skipped character to preword. */
--- 4941,4947 ----
{
int l;
! l = MB_PTR2LEN(fword + sp->ts_fidx);
if (fword_ends)
{
/* Copy the skipped character to preword. */
***************
*** 5109,5117 ****
/* Correct ts_fidx for the byte length of the
* character (we didn't check that before). */
sp->ts_fidx = sp->ts_fcharstart
! + MB_BYTE2LEN(
! fword[sp->ts_fcharstart]);
!
/* For changing a composing character adjust
* the score from SCORE_SUBST to
* SCORE_SUBCOMP. */
--- 5108,5115 ----
/* Correct ts_fidx for the byte length of the
* character (we didn't check that before). */
sp->ts_fidx = sp->ts_fcharstart
! + MB_PTR2LEN(
! fword + sp->ts_fcharstart);
/* For changing a composing character adjust
* the score from SCORE_SUBST to
* SCORE_SUBCOMP. */
***************
*** 5232,5238 ****
if (has_mbyte)
{
c = mb_ptr2char(fword + sp->ts_fidx);
! stack[depth].ts_fidx += MB_BYTE2LEN(fword[sp->ts_fidx]);
if (enc_utf8 && utf_iscomposing(c))
stack[depth].ts_score -= SCORE_DEL - SCORE_DELCOMP;
else if (c == mb_ptr2char(fword + stack[depth].ts_fidx))
--- 5230,5236 ----
if (has_mbyte)
{
c = mb_ptr2char(fword + sp->ts_fidx);
! stack[depth].ts_fidx += MB_PTR2LEN(fword + sp->ts_fidx);
if (enc_utf8 && utf_iscomposing(c))
stack[depth].ts_score -= SCORE_DEL - SCORE_DELCOMP;
else if (c == mb_ptr2char(fword + stack[depth].ts_fidx))
***************
*** 5456,5464 ****
#ifdef FEAT_MBYTE
if (has_mbyte)
{
! n = MB_BYTE2LEN(*p);
c = mb_ptr2char(p + n);
! mch_memmove(p + MB_BYTE2LEN(p[n]), p, n);
mb_char2bytes(c, p);
}
else
--- 5454,5462 ----
#ifdef FEAT_MBYTE
if (has_mbyte)
{
! n = MB_PTR2LEN(p);
c = mb_ptr2char(p + n);
! mch_memmove(p + MB_PTR2LEN(p + n), p, n);
mb_char2bytes(c, p);
}
else
***************
*** 5550,5560 ****
#ifdef FEAT_MBYTE
if (has_mbyte)
{
! n = MB_BYTE2LEN(*p);
c2 = mb_ptr2char(p + n);
! fl = MB_BYTE2LEN(p[n]);
c = mb_ptr2char(p + n + fl);
! tl = MB_BYTE2LEN(p[n + fl]);
mch_memmove(p + fl + tl, p, n);
mb_char2bytes(c, p);
mb_char2bytes(c2, p + tl);
--- 5548,5558 ----
#ifdef FEAT_MBYTE
if (has_mbyte)
{
! n = MB_PTR2LEN(p);
c2 = mb_ptr2char(p + n);
! fl = MB_PTR2LEN(p + n);
c = mb_ptr2char(p + n + fl);
! tl = MB_PTR2LEN(p + n + fl);
mch_memmove(p + fl + tl, p, n);
mb_char2bytes(c, p);
mb_char2bytes(c2, p + tl);
***************
*** 5627,5636 ****
#ifdef FEAT_MBYTE
if (has_mbyte)
{
! n = MB_BYTE2LEN(*p);
! n += MB_BYTE2LEN(p[n]);
c = mb_ptr2char(p + n);
! tl = MB_BYTE2LEN(p[n]);
mch_memmove(p + tl, p, n);
mb_char2bytes(c, p);
}
--- 5625,5634 ----
#ifdef FEAT_MBYTE
if (has_mbyte)
{
! n = MB_PTR2LEN(p);
! n += MB_PTR2LEN(p + n);
c = mb_ptr2char(p + n);
! tl = MB_PTR2LEN(p + n);
mch_memmove(p + tl, p, n);
mb_char2bytes(c, p);
}
***************
*** 5693,5701 ****
if (has_mbyte)
{
c = mb_ptr2char(p);
! tl = MB_BYTE2LEN(*p);
! n = MB_BYTE2LEN(p[tl]);
! n += MB_BYTE2LEN(p[tl + n]);
mch_memmove(p, p + tl, n);
mb_char2bytes(c, p + n);
}
--- 5691,5699 ----
if (has_mbyte)
{
c = mb_ptr2char(p);
! tl = MB_PTR2LEN(p);
! n = MB_PTR2LEN(p + tl);
! n += MB_PTR2LEN(p + tl + n);
mch_memmove(p, p + tl, n);
mb_char2bytes(c, p + n);
}
*** ../vim-8.0.0581/src/testdir/test_spell.vim 2017-02-25 14:20:56.784372170
+0100
--- src/testdir/test_spell.vim 2017-04-22 22:43:42.251575350 +0200
***************
*** 18,20 ****
--- 18,29 ----
bwipe!
set nospell
endfunc
+
+ func Test_z_equal_on_invalid_utf8_word()
+ split
+ set spell
+ call setline(1, "\xff")
+ norm z=
+ set nospell
+ bwipe!
+ endfunc
*** ../vim-8.0.0581/src/version.c 2017-04-22 22:40:07.256963436 +0200
--- src/version.c 2017-04-22 23:48:32.254538011 +0200
***************
*** 766,767 ****
--- 766,769 ----
{ /* Add new patch number below this line */
+ /**/
+ 582,
/**/
--
CONCORDE: Quickly, sir, come this way!
LAUNCELOT: No! It's not right for my idiom. I must escape more ... more ...
CONCORDE: Dramatically, sir?
LAUNCELOT: Dramatically.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.