From 567199b68fb5a171c0c006e9d4ac94ca61c5cda0 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 24 Apr 2013 16:52:36 +0200 Subject: 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) --- src/buffer.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'src/buffer.c') diff --git a/src/buffer.c b/src/buffer.c index 5ee6299901..1840e10961 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -3506,7 +3506,7 @@ build_stl_str_hl(wp, out, outlen, fmt, use_sandbox, fillchar, 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, use_sandbox, fillchar, 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, use_sandbox, fillchar, 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) -- cgit v1.2.3