Mercurial > vim
changeset 4333:f39af3419570 v7.3.916
updated for version 7.3.916
Problem: Using freed memory when pasting with the mouse (Issue 130).
Solution: Get the byte value early. (hint by Dominique Pelle)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 24 Apr 2013 16:52:36 +0200 |
parents | 84991fa5e74f |
children | 8541b4c02df4 |
files | src/buffer.c src/version.c |
diffstat | 2 files changed, 19 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/src/buffer.c +++ b/src/buffer.c @@ -3506,7 +3506,7 @@ build_stl_str_hl(wp, out, outlen, fmt, u char_u *p; char_u *s; char_u *t; - char_u *linecont; + int byteval; #ifdef FEAT_EVAL win_T *o_curwin; buf_T *o_curbuf; @@ -3573,12 +3573,21 @@ build_stl_str_hl(wp, out, outlen, fmt, u fillchar = '-'; #endif - /* - * Get line & check if empty (cursorpos will show "0-1"). - * If inversion is possible we use it. Else '=' characters are used. - */ - linecont = ml_get_buf(wp->w_buffer, wp->w_cursor.lnum, FALSE); - empty_line = (*linecont == NUL); + /* Get line & check if empty (cursorpos will show "0-1"). Note that + * p will become invalid when getting another buffer line. */ + p = ml_get_buf(wp->w_buffer, wp->w_cursor.lnum, FALSE); + empty_line = (*p == NUL); + + /* Get the byte value now, in case we need it below. This is more + * efficient than making a copy of the line. */ + if (wp->w_cursor.col > (colnr_T)STRLEN(p)) + byteval = 0; + else +#ifdef FEAT_MBYTE + byteval = (*mb_ptr2char)(p + wp->w_cursor.col); +#else + byteval = p[wp->w_cursor.col]; +#endif groupdepth = 0; p = out; @@ -3956,16 +3965,7 @@ build_stl_str_hl(wp, out, outlen, fmt, u case STL_BYTEVAL_X: base = 'X'; case STL_BYTEVAL: - if (wp->w_cursor.col > (colnr_T)STRLEN(linecont)) - num = 0; - else - { -#ifdef FEAT_MBYTE - num = (*mb_ptr2char)(linecont + wp->w_cursor.col); -#else - num = linecont[wp->w_cursor.col]; -#endif - } + num = byteval; if (num == NL) num = 0; else if (num == CAR && get_fileformat(wp->w_buffer) == EOL_MAC)