patch 8.1.0015: cursor color wrong when closing a terminal window

Problem:    Cursor color wrong when closing a terminal window, ending up in
            another terminal window. (Dominique Pelle)
Solution:   Bail out of terminal_loop() when the buffer changes.
            (closes #2942)
diff --git a/src/terminal.c b/src/terminal.c
index dea902f..817e6b9 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -183,14 +183,7 @@
  * 1. Generic code for all systems.
  */
 
-    static void
-cursor_color_copy(char_u** to_color, char_u* from_color)
-{
-    vim_free(*to_color);
-    *to_color = (from_color == NULL) ? NULL : vim_strsave(from_color);
-}
-
-	static int
+    static int
 cursor_color_equal(char_u *lhs_color, char_u *rhs_color)
 {
     if (lhs_color != NULL && rhs_color != NULL)
@@ -198,7 +191,17 @@
     return lhs_color == NULL && rhs_color == NULL;
 }
 
-	static char_u *
+    static void
+cursor_color_copy(char_u **to_color, char_u *from_color)
+{
+    // Avoid a free & alloc if the value is already right.
+    if (cursor_color_equal(*to_color, from_color))
+	return;
+    vim_free(*to_color);
+    *to_color = (from_color == NULL) ? NULL : vim_strsave(from_color);
+}
+
+    static char_u *
 cursor_color_get(char_u *color)
 {
     return (color == NULL) ? (char_u *)"" : color;
@@ -2119,7 +2122,7 @@
 	    while (must_redraw != 0)
 		if (update_screen(0) == FAIL)
 		    break;
-	if (!term_use_loop_check(TRUE))
+	if (!term_use_loop_check(TRUE) || in_terminal_loop != curbuf->b_term)
 	    /* job finished while redrawing */
 	    break;
 
@@ -2127,7 +2130,7 @@
 	restore_cursor = TRUE;
 
 	c = term_vgetc();
-	if (!term_use_loop_check(TRUE))
+	if (!term_use_loop_check(TRUE) || in_terminal_loop != curbuf->b_term)
 	{
 	    /* Job finished while waiting for a character.  Push back the
 	     * received character. */
@@ -2178,7 +2181,8 @@
 #ifdef FEAT_CMDL_INFO
 	    clear_showcmd();
 #endif
-	    if (!term_use_loop_check(TRUE))
+	    if (!term_use_loop_check(TRUE)
+					 || in_terminal_loop != curbuf->b_term)
 		/* job finished while waiting for a character */
 		break;