patch 7.4.2347
Problem:    Crash when closing a buffer while Visual mode is active.
            (Dominique Pelle)
Solution:   Adjust the position before computing the number of lines.
            When closing the current buffer stop Visual mode.
diff --git a/src/buffer.c b/src/buffer.c
index 398fee7..3bfd975 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -578,6 +578,11 @@
     if (buf->b_ffname == NULL)
 	del_buf = TRUE;
 
+    /* When closing the current buffer stop Visual mode before freeing
+     * anything. */
+    if (buf == curbuf)
+	end_visual_mode();
+
     /*
      * Free all things allocated for this buffer.
      * Also calls the "BufDelete" autocommands when del_buf is TRUE.
@@ -1379,6 +1384,10 @@
 	    }
 	}
 
+	/* When closing the current buffer stop Visual mode. */
+	if (buf == curbuf)
+	    end_visual_mode();
+
 	/*
 	 * If deleting the last (listed) buffer, make it empty.
 	 * The last (listed) buffer cannot be unloaded.
diff --git a/src/normal.c b/src/normal.c
index edaa740..92ef575 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -1609,6 +1609,8 @@
 	    oap->start = curwin->w_cursor;
 	}
 
+	/* Just in case lines were deleted that make the position invalid. */
+	check_pos(curwin->w_buffer, &oap->end);
 	oap->line_count = oap->end.lnum - oap->start.lnum + 1;
 
 #ifdef FEAT_VIRTUALEDIT
@@ -9451,10 +9453,7 @@
 #ifdef FEAT_MBYTE
     /* prevent from moving onto a trail byte */
     if (has_mbyte)
-    {
-	check_pos(curwin->w_buffer, &oap->end);
 	mb_adjustpos(curwin->w_buffer, &oap->end);
-    }
 #endif
 
     getvvcol(curwin, &(oap->start), &oap->start_vcol, NULL, &oap->end_vcol);
diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim
index b894a63..79af7b2 100644
--- a/src/testdir/test_normal.vim
+++ b/src/testdir/test_normal.vim
@@ -1998,3 +1998,17 @@
   " clean up
   bw!
 endfu
+
+func! Test_normal47_visual_buf_wipe()
+  " This was causing a crash or ml_get error.
+  enew!
+  call setline(1,'xxx')
+  normal $
+  new
+  call setline(1, range(1,2))
+  2
+  exe "norm \<C-V>$"
+  bw!
+  norm yp
+  set nomodified
+endfu
diff --git a/src/version.c b/src/version.c
index 55f8541..8740a98 100644
--- a/src/version.c
+++ b/src/version.c
@@ -764,6 +764,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2347,
+/**/
     2346,
 /**/
     2345,