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
index eb8baa9..984d765 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -1296,6 +1296,10 @@
 	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
index 9266380..87fcca9 100644
--- a/src/os_amiga.c
+++ b/src/os_amiga.c
@@ -889,6 +889,8 @@
     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
index 14fe8c6..5f6e11d 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -201,6 +201,8 @@
     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
index d35061f..adbb199 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -2538,8 +2538,9 @@
     void
 mch_exit(int r)
 {
-    stoptermcap();
+    exiting = TRUE;
 
+    stoptermcap();
     if (g_fWindInitCalled)
 	settmode(TMODE_COOK);
 
diff --git a/src/version.c b/src/version.c
index e0fa3cb..5627b3d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    307,
+/**/
     306,
 /**/
     305,
diff --git a/src/window.c b/src/window.c
index ee5f7aa..6b7bd35 100644
--- a/src/window.c
+++ b/src/window.c
@@ -5708,7 +5708,10 @@
     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