]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix accessing dpyinfo after it is deallocated
authorPo Lu <luangruo@yahoo.com>
Mon, 4 Jul 2022 04:56:24 +0000 (12:56 +0800)
committerPo Lu <luangruo@yahoo.com>
Mon, 4 Jul 2022 04:56:42 +0000 (12:56 +0800)
* src/xterm.c (x_connection_closed): Print disconnect error for
the last terminal before freeing it.

src/xterm.c

index c5acb4508372618e00b3525a9d33a3d4ef0be7c4..6a357b473d6d35935f752a0de2005c417e77a06e 100644 (file)
@@ -23501,43 +23501,47 @@ For details, see etc/PROBLEMS.\n",
         /* We have just closed all frames on this display. */
         emacs_abort ();
 
-      XSETTERMINAL (tmp, dpyinfo->terminal);
-      Fdelete_terminal (tmp, Qnoelisp);
-    }
-
-  unblock_input ();
+      /* This was the last terminal remaining, so print the error
+        message and associated error handlers and kill Emacs.  */
+      if (dpyinfo->terminal == terminal_list
+         && !terminal_list->next_terminal)
+       {
+         fprintf (stderr, "%s\n", error_msg);
 
-  if (terminal_list == 0)
-    {
-      fprintf (stderr, "%s\n", error_msg);
+         if (!ioerror && dpyinfo)
+           {
+             /* Dump the list of error handlers for debugging
+                purposes.  */
 
-      if (!ioerror)
-       {
-         /* Dump the list of error handlers for debugging
-            purposes.  */
+             fprintf (stderr, "X error handlers currently installed:\n");
 
-         fprintf (stderr, "X error handlers currently installed:\n");
+             for (failable = dpyinfo->failable_requests;
+                  failable < dpyinfo->next_failable_request;
+                  ++failable)
+               {
+                 if (failable->end)
+                   fprintf (stderr, "Ignoring errors between %lu to %lu\n",
+                            failable->start, failable->end);
+                 else
+                   fprintf (stderr, "Ignoring errors from %lu onwards\n",
+                            failable->start);
+               }
 
-         for (failable = dpyinfo->failable_requests;
-              failable < dpyinfo->next_failable_request;
-              ++failable)
-           {
-             if (failable->end)
-               fprintf (stderr, "Ignoring errors between %lu to %lu\n",
-                        failable->start, failable->end);
-             else
-               fprintf (stderr, "Ignoring errors from %lu onwards\n",
-                        failable->start);
+             for (stack = x_error_message; stack; stack = stack->prev)
+               fprintf (stderr, "Trapping errors from %lu\n",
+                        stack->first_request);
            }
-
-         for (stack = x_error_message; stack; stack = stack->prev)
-           fprintf (stderr, "Trapping errors from %lu\n",
-                    stack->first_request);
        }
 
-      Fkill_emacs (make_fixnum (70), Qnil);
+      XSETTERMINAL (tmp, dpyinfo->terminal);
+      Fdelete_terminal (tmp, Qnoelisp);
     }
 
+  unblock_input ();
+
+  if (terminal_list == 0)
+    Fkill_emacs (make_fixnum (70), Qnil);
+
   totally_unblock_input ();
 
   unbind_to (idx, Qnil);