From: Jan D Date: Thu, 14 May 2015 14:21:02 +0000 (+0200) Subject: Don't access display after i/o error (Bug#19147). X-Git-Tag: emacs-25.0.90~2099 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=9341956c8240e5552e27d6e3d67990d824c632b2;p=emacs.git Don't access display after i/o error (Bug#19147). * xterm.c (x_connection_closed): Add third arg ioerror. If ioerror, set display to 0 (Bug#19147). (x_error_quitter): Call x_connection_closed with third arg false. (x_io_error_quitter): Call x_connection_closed with third arg true. --- diff --git a/src/xterm.c b/src/xterm.c index d9032fa5a14..9616dab8648 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -259,7 +259,7 @@ static int x_dispatch_event (XEvent *, Display *); #endif /* Don't declare this _Noreturn because we want no interference with debugging failing X calls. */ -static void x_connection_closed (Display *, const char *); +static void x_connection_closed (Display *, const char *, bool); static void x_wm_set_window_state (struct frame *, int); static void x_wm_set_icon_pixmap (struct frame *, ptrdiff_t); static void x_initialize (void); @@ -8456,7 +8456,7 @@ static char *error_msg; the text of an error message that lead to the connection loss. */ static void -x_connection_closed (Display *dpy, const char *error_message) +x_connection_closed (Display *dpy, const char *error_message, bool ioerror) { struct x_display_info *dpyinfo = x_display_info_for_display (dpy); Lisp_Object frame, tail; @@ -8475,6 +8475,7 @@ x_connection_closed (Display *dpy, const char *error_message) dpyinfo->reference_count++; dpyinfo->terminal->reference_count++; } + if (ioerror) dpyinfo->display = 0; /* First delete frames whose mini-buffers are on frames that are on the dead display. */ @@ -8612,7 +8613,7 @@ x_error_quitter (Display *display, XErrorEvent *event) XGetErrorText (display, event->error_code, buf, sizeof (buf)); sprintf (buf1, "X protocol error: %s on protocol request %d", buf, event->request_code); - x_connection_closed (display, buf1); + x_connection_closed (display, buf1, false); } @@ -8627,7 +8628,7 @@ x_io_error_quitter (Display *display) snprintf (buf, sizeof buf, "Connection lost to X server `%s'", DisplayString (display)); - x_connection_closed (display, buf); + x_connection_closed (display, buf, true); return 0; }