Mercurial > vim
changeset 15288:e3dfd25b0679 v8.1.0652
patch 8.1.0652: freeing memory for balloon eval too early
commit https://github.com/vim/vim/commit/6d9e71ad994fd428ecea76741376807cd18308ec
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Dec 28 19:13:34 2018 +0100
patch 8.1.0652: freeing memory for balloon eval too early
Problem: Freeing memory for balloon eval too early.
Solution: Store the pointer in BalloonEval and free it later. (Yasuhiro
Matsumoto, closes #3725)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 28 Dec 2018 19:15:06 +0100 |
parents | 79208fd35054 |
children | 1f06588e1317 |
files | src/beval.h src/gui_w32.c src/version.c |
diffstat | 3 files changed, 14 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/beval.h +++ b/src/beval.h @@ -76,6 +76,9 @@ typedef struct BalloonEvalStruct int *vts; // vartabstop setting for this buffer #endif char_u *msg; +#ifdef FEAT_GUI_W32 + void *tofree; +#endif } BalloonEval; #define EVAL_OFFSET_X 15 /* displacement of beval topleft corner from pointer */
--- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -8787,7 +8787,6 @@ make_tooltipw(BalloonEval *beval, char * { TOOLINFOW *pti; int ToolInfoSize; - WCHAR *tofree = NULL; if (multiline_balloon_available() == TRUE) ToolInfoSize = sizeof(TOOLINFOW_NEW); @@ -8817,8 +8816,8 @@ make_tooltipw(BalloonEval *beval, char * RECT rect; TOOLINFOW_NEW *ptin = (TOOLINFOW_NEW *)pti; pti->lpszText = LPSTR_TEXTCALLBACKW; - tofree = enc_to_utf16((char_u*)text, NULL); - ptin->lParam = (LPARAM)tofree; + beval->tofree = enc_to_utf16((char_u*)text, NULL); + ptin->lParam = (LPARAM)beval->tofree; // switch multiline tooltips on if (GetClientRect(s_textArea, &rect)) SendMessageW(beval->balloon, TTM_SETMAXTIPWIDTH, 0, @@ -8827,8 +8826,8 @@ make_tooltipw(BalloonEval *beval, char * else { // do this old way - tofree = enc_to_utf16((char_u*)text, NULL); - pti->lpszText = tofree; + beval->tofree = enc_to_utf16((char_u*)text, NULL); + pti->lpszText = (LPWSTR)beval->tofree; } // Limit ballooneval bounding rect to CursorPos neighbourhood. @@ -8851,8 +8850,6 @@ make_tooltipw(BalloonEval *beval, char * mouse_event(MOUSEEVENTF_MOVE, 2, 2, 0, 0); mouse_event(MOUSEEVENTF_MOVE, (DWORD)-1, (DWORD)-1, 0, 0); vim_free(pti); - if (tofree != NULL) - vim_free(tofree); } #endif @@ -8898,7 +8895,8 @@ make_tooltip(BalloonEval *beval, char *t RECT rect; TOOLINFO_NEW *ptin = (TOOLINFO_NEW *)pti; pti->lpszText = LPSTR_TEXTCALLBACK; - ptin->lParam = (LPARAM)text; + beval->tofree = vim_strsave((char_u*)text); + ptin->lParam = (LPARAM)beval->tofree; if (GetClientRect(s_textArea, &rect)) /* switch multiline tooltips on */ SendMessage(beval->balloon, TTM_SETMAXTIPWIDTH, 0, (LPARAM)rect.right); @@ -9106,9 +9104,9 @@ TrackUserActivity(UINT uMsg) gui_mch_destroy_beval_area(BalloonEval *beval) { #ifdef FEAT_VARTABS - if (beval->vts) - vim_free(beval->vts); -#endif + vim_free(beval->vts); +#endif + vim_free(beval->tofree); vim_free(beval); } #endif /* FEAT_BEVAL_GUI */