From: Dmitry Antipov Date: Thu, 11 Dec 2014 13:26:00 +0000 (+0300) Subject: Never pass an invalid X connection descriptor to an input reading loop X-Git-Tag: emacs-25.0.90~2635^2~112 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3e92b9882bc5218a5b5962f9e85d0cbca719afc8;p=emacs.git Never pass an invalid X connection descriptor to an input reading loop Fixes: debbugs:19147 * xterm.c (x_delete_terminal): Call emacs_close for X connection descriptor if called from x_connection_closed and always delete this descriptor from keyboard waiting set (Bug#19147). --- diff --git a/src/ChangeLog b/src/ChangeLog index 2a6e2373fcd..27c08580cb8 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2014-12-11 Dmitry Antipov + + * xterm.c (x_delete_terminal): Call emacs_close for X connection + descriptor if called from x_connection_closed and always delete + this descriptor from keyboard waiting set (Bug#19147). + 2014-12-10 Eli Zaretskii * bidi.c (BIDI_CACHE_MAX_ELTS_PER_SLOT): New macro. diff --git a/src/xterm.c b/src/xterm.c index 98f2a27c1ce..1ccc38ca313 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -11318,8 +11318,7 @@ x_delete_terminal (struct terminal *terminal) xim_close_dpy (dpyinfo); #endif - /* If called from x_connection_closed, the display may already be closed - and dpyinfo->display was set to 0 to indicate that. */ + /* Normally, the display is available... */ if (dpyinfo->display) { x_destroy_all_bitmaps (dpyinfo); @@ -11360,17 +11359,23 @@ x_delete_terminal (struct terminal *terminal) XCloseDisplay (dpyinfo->display); #endif #endif /* ! USE_GTK */ - - /* No more input on this descriptor. Do not close it because - it's already closed by X(t)CloseDisplay (Bug#18403). */ - eassert (0 <= dpyinfo->connection); - delete_keyboard_wait_descriptor (dpyinfo->connection); - - /* Mark as dead. */ + /* Do not close the connection here because it's already closed + by X(t)CloseDisplay (Bug#18403). */ dpyinfo->display = NULL; - dpyinfo->connection = -1; } + /* ...but if called from x_connection_closed, the display may already + be closed and dpyinfo->display was set to 0 to indicate that. Since + X server is most likely gone, explicit close is the only reliable + way to continue and avoid Bug#19147. */ + else if (dpyinfo->connection >= 0) + emacs_close (dpyinfo->connection); + + /* No more input on this descriptor. */ + delete_keyboard_wait_descriptor (dpyinfo->connection); + /* Mark as dead. */ + dpyinfo->connection = -1; + x_delete_display (dpyinfo); unblock_input (); }