# HG changeset patch # User Christian Brabandt # Date 1486304104 -3600 # Node ID c9da7f9137af09395750f84b00cf59daae2c5926 # Parent 63f95d6b8f60bd074c529ba9b3ed1e03077a7595 patch 8.0.0307: asan detects a memory error when EXITFREE is defined commit https://github.com/vim/vim/commit/955f198fc546cc30a34361932d3f454a61df0efa Author: Bram Moolenaar Date: Sun Feb 5 15:10:51 2017 +0100 patch 8.0.0307: asan detects a memory error when EXITFREE is defined Problem: Asan detects a memory error when EXITFREE is defined. (Dominique Pelle) Solution: In getvcol() check for ml_get_buf() returning an empty string. Also skip adjusting the scroll position. Set "exiting" in mch_exit() for all systems. diff --git a/src/charset.c b/src/charset.c --- a/src/charset.c +++ b/src/charset.c @@ -1296,6 +1296,10 @@ getvcol( posptr = NULL; /* continue until the NUL */ else { + /* Special check for an empty line, which can happen on exit, when + * ml_get_buf() always returns an empty string. */ + if (*ptr == NUL) + pos->col = 0; posptr = ptr + pos->col; #ifdef FEAT_MBYTE if (has_mbyte) diff --git a/src/os_amiga.c b/src/os_amiga.c --- a/src/os_amiga.c +++ b/src/os_amiga.c @@ -889,6 +889,8 @@ mch_early_init(void) void mch_exit(int r) { + exiting = TRUE; + if (raw_in) /* put terminal in 'normal' mode */ { settmode(TMODE_COOK); diff --git a/src/os_mswin.c b/src/os_mswin.c --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -201,6 +201,8 @@ int _stricoll(char *a, char *b) void mch_exit(int r) { + exiting = TRUE; + display_errors(); ml_close_all(TRUE); /* remove all memfiles */ diff --git a/src/os_win32.c b/src/os_win32.c --- a/src/os_win32.c +++ b/src/os_win32.c @@ -2538,8 +2538,9 @@ mch_init(void) void mch_exit(int r) { + exiting = TRUE; + stoptermcap(); - if (g_fWindInitCalled) settmode(TMODE_COOK); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 307, +/**/ 306, /**/ 305, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -5708,7 +5708,10 @@ win_new_height(win_T *wp, int height) wp->w_height = height; wp->w_skipcol = 0; - scroll_to_fraction(wp, prev_height); + /* There is no point in adjusting the scroll position when exiting. Some + * values might be invalid. */ + if (!exiting) + scroll_to_fraction(wp, prev_height); } void