From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: martin rudalics Newsgroups: gmane.emacs.bugs Subject: bug#47244: 28.0.50; SIGSEGV in long-runnning Emacs Date: Wed, 7 Apr 2021 20:48:06 +0200 Message-ID: References: <87im5ofp3z.fsf@md5i.com> <745cb501-d742-8797-d07c-00125f60f8ec@gmx.at> <7a37c708-0ac1-3b06-9042-b4b2b6d6c5d6@gmx.at> <87v990r41n.fsf@md5i.com> <4ad20b14-f4a5-07c0-3f86-698d0934d5af@gmx.at> <58c0bfca-02e6-760f-dcff-05fdc4cca135@gmx.at> <870479cc-efd3-3a19-98a3-1d7a8b9346e8@gmx.at> <79cfe67d-3a2c-952d-7c51-20e8a4859380@gmx.at> <87czv6q1f8.fsf@md5i.com> <233daa4b-ca64-955f-2612-49a0503b1938@gmx.at> <8735w2p8oc.fsf@md5i.com> <5181da75-e80d-22e0-bdcb-a0ffdc1bac6a@gmx.at> <5c4e5857-6a76-b8e8-204b-b4a855e95a16@gmx.at> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------B9A8BF0217B8CFDAB3ABA42B" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="22428"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Michael Welsh Duggan , "schwab@linux-m68k.org" , "47244@debbugs.gnu.org" <47244@debbugs.gnu.org> To: Michael Welsh Duggan Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed Apr 07 20:49:12 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lUDEl-0005h1-EM for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 07 Apr 2021 20:49:11 +0200 Original-Received: from localhost ([::1]:41294 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lUDEk-0004Xj-8W for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 07 Apr 2021 14:49:10 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:34650) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lUDEc-0004XR-LE for bug-gnu-emacs@gnu.org; Wed, 07 Apr 2021 14:49:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:33661) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lUDEc-0005zL-EH for bug-gnu-emacs@gnu.org; Wed, 07 Apr 2021 14:49:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lUDEc-0002jf-CS for bug-gnu-emacs@gnu.org; Wed, 07 Apr 2021 14:49:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: martin rudalics Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 07 Apr 2021 18:49:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 47244 X-GNU-PR-Package: emacs Original-Received: via spool by 47244-submit@debbugs.gnu.org id=B47244.161782130610459 (code B ref 47244); Wed, 07 Apr 2021 18:49:02 +0000 Original-Received: (at 47244) by debbugs.gnu.org; 7 Apr 2021 18:48:26 +0000 Original-Received: from localhost ([127.0.0.1]:45204 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lUDE1-0002ib-DT for submit@debbugs.gnu.org; Wed, 07 Apr 2021 14:48:25 -0400 Original-Received: from mout.gmx.net ([212.227.15.19]:53845) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lUDDy-0002iM-WC for 47244@debbugs.gnu.org; Wed, 07 Apr 2021 14:48:23 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1617821291; bh=NMqWRGL0iB5nvXz1QYmrNjFWCqff5LU0cPJAHifcqyM=; h=X-UI-Sender-Class:Subject:To:Cc:References:From:Date:In-Reply-To; b=lVC+wQZAfrH5HJhtvhG7sF9hPQH2U1wqyBQ8gNiLH3bz0+BCfhPMSdwVGFUdE8L/o NXV08qyYk/ZvmfPXThoyLztoTLd93BKdKWlPzQwA6jihwBgxtt+N+x1aWpbbKWebfl SDmklDWAalM0O5zJu/mKEAp1LnZcZ9C1qBKenegc= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Original-Received: from [192.168.1.101] ([212.95.5.241]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MxlzI-1lnDsa29Nu-00zG76; Wed, 07 Apr 2021 20:48:10 +0200 In-Reply-To: Content-Language: en-US X-Provags-ID: V03:K1:BSGDFrVcx9Z9inPIiJPkTrpo8alAR60BDjBGlTDdUS99S/gA+gh hjAY1ftF9xHfaqXMFWWCjK7t4QkWUhyuFVqUnEfpmmWtyp+p66VRFff5LQRd75gCIxZHri5 n+QOxJErmXo+tNSDZG2O7CowYQDUIfgESEgOUUmbBO9+/Uu/BYq7yZqnqgHANE44rCouTRE 1UyAFeLRu33SgarlESG1Q== X-UI-Out-Filterresults: notjunk:1;V03:K0:UyS1BmiN6Io=:GrW3psHHO29Cn9dXhSMoSu DwMqWyhIAYUp7xqk/q2iiMUQ17B1NPZVA+fFWCEp4MRdWZBMNjVgcdadiHjCKHWdVqG8vsvmK mkw/zsCM1Vvqt0PdBHAOp0Oh1TubTYr4Qc7wYSRJwzEaSmOns3KIhjiQRwc8IR/rTRdMVjoEM h0GhoVtAREzPO5cf3pfZmmGpoLkrduHFkQW4fBpXRJmC2RaY5lCTgRmWS3ujSE9fUmzsV1QFD c2Gl2XTo52ukpHO3urXCxnxwSYOrzt5Kxvr82rSr8ICKz5kQcyQvXjOhsNOZjzEqrFSHf9oxK zXAhLs6weOqJcHJOSqjqgxfg5TdrXaZv8N9wEtvxMT7oX8CiBUI84bYvsSoh6AxA2TLzk7e4Z L0xo40rZqAhT4p9+louIRYn/AFmv8SDYYBUg+t3uwzWN5DQrAkrEO3NTwZQtEWUwP5OQaNe8N 8F43r3UwX85Q/MFa3A8sC7sxUVSqTIp4QNNBzqrNQvNZdSvAbDMxWfZy/mC76YLx92DZnR6LV 7GbIUMxpFVihz1WE1GRMmtCP+ntC2QQYDwgJL28+GdF7e+PprTgusUktpAjSBqPekF9r4aDDt +yiZSaXKC/ZF6rbfCpGcLKHYCxaXBzwcbhgbZPYyYaHf1Kk4eceQXrtLNX1osf8KGjoEziA9d Mu20q8GuhZmDT5PPP/NypW2lfEb9qF1F6KI/aELPH4wSkPcLjNLrwtdMKmcrfHZAud/5HzTq0 yTGtoKGKF0IYwDWhCDynUpo5iQCU9Cefur7Qk3B1eU03TvM2zFmO7MaXyNfpAFg1ZoE2LfEm X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:203704 Archived-At: This is a multi-part message in MIME format. --------------B9A8BF0217B8CFDAB3ABA42B Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit > Triggered. Here's the backtrace: > > #0 terminate_due_to_signal (sig=6, backtrace_limit=2147483647) > at ../../master/src/emacs.c:379 > #1 0x00005555557c4aa2 in die > (msg=0x5555559105c8 "window_list_length == list_length (Vwindow_list)", file=0x55555590f9cf "../../master/src/window.c", line=2585) > at ../../master/src/alloc.c:7420 > [...] > Lisp Backtrace: > "window-list-1" (0xffffbfa0) > "replace-buffer-in-windows" (0xffffc4a8) > "kill-buffer" (0xffffc710) > 0x57821b48 PVEC_COMPILED > "substitute-command-keys" (0xffffd3d8) > "command-error-default-function" (0xffffd628) > "apply" (0xffffd7e8) > 0xf2c1d0c8 PVEC_COMPILED All we can conclude from that is that Vwindow_list must have been clobbered before `kill-buffer' triggered the execution of `replace-buffer-in-windows'. When and how that happened is yet unclear. The attached should cure the crashes by simply reconstructing the full list after window_list notices that Vwindow_list has changed length. martin --------------B9A8BF0217B8CFDAB3ABA42B Content-Type: text/x-patch; name="selected_window_contents.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="selected_window_contents.diff" diff --git a/src/buffer.c b/src/buffer.c index 8e33162989..70b37e61a2 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1951,6 +1951,9 @@ DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 0= , 1, "bKill buffer: ", This gets rid of them for certain. */ reset_buffer_local_variables (b, 1); =20 + if (!b->base_buffer) + eassert (b->window_count =3D=3D 0); + bset_name (b, Qnil); =20 block_input (); @@ -1991,6 +1994,8 @@ DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 0= , 1, "bKill buffer: ", =20 run_buffer_list_update_hook (b); =20 + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents))= ); + return Qt; } =0C @@ -2151,6 +2156,9 @@ set_buffer_internal_1 (register struct buffer *b) =20 BUFFER_CHECK_INDIRECTION (b); =20 + if (!BUFFER_LIVE_P (b)) + error ("Selecting deleted buffer"); + old_buf =3D current_buffer; current_buffer =3D b; last_known_column_point =3D -1; /* Invalidate indentation cache. */= diff --git a/src/window.c b/src/window.c index eb16e2a433..71dd2428e2 100644 --- a/src/window.c +++ b/src/window.c @@ -87,6 +87,8 @@ by setting it to nil. */ Lisp_Object Vwindow_list; =20 +static int window_list_length =3D 0; + /* True mean window_change_record has to record all live frames. */ static bool window_change_record_frames; =20 @@ -307,7 +309,11 @@ wset_buffer (struct window *w, Lisp_Object val) if (BUFFERP (val)) /* Make sure that we do not assign the buffer to an internal window. */ - eassert (MARKERP (w->start) && MARKERP (w->pointm)); + { + eassert (BUFFER_LIVE_P (XBUFFER (val))); + eassert (MARKERP (w->start) && MARKERP (w->pointm)); + } + w->contents =3D val; adjust_window_count (w, 1); } @@ -315,6 +321,7 @@ wset_buffer (struct window *w, Lisp_Object val) static void wset_old_buffer (struct window *w, Lisp_Object val) { + eassert (BUFFER_LIVE_P (XBUFFER (val))); w->old_buffer =3D val; } =20 @@ -594,6 +601,8 @@ select_window_1 (Lisp_Object window, bool inhibit_poi= nt_swap) =20 selected_window =3D window; =20 + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents))= ); + /* Go to the point recorded in the window. This is important when the buffer is in more than one window. It also matters when @@ -2553,7 +2562,8 @@ add_window_to_list (struct window *w, void *user_da= ta) Lisp_Object window_list (void) { - if (!CONSP (Vwindow_list)) + if (!CONSP (Vwindow_list) + || window_list_length !=3D list_length (Vwindow_list)) { Lisp_Object tail, frame; =20 @@ -2569,6 +2579,8 @@ window_list (void) arglist =3D Fnreverse (arglist); Vwindow_list =3D nconc2 (Vwindow_list, arglist); } + + window_list_length =3D list_length (Vwindow_list); } =20 return Vwindow_list; @@ -2950,6 +2962,8 @@ DEFUN ("window-list-1", Fwindow_list_1, Swindow_lis= t_1, 0, 3, 0, CHECK_ALL_WINDOWS /* Arg is ignored */ }; =20 +static int replace_buffer_in_windows_safely_count; + static Lisp_Object window_loop (enum window_loop type, Lisp_Object obj, bool mini, Lisp_Object frames) @@ -3048,6 +3062,8 @@ window_loop (enum window_loop type, Lisp_Object obj= , bool mini, if (EQ (window, selected_window) && XBUFFER (w->contents) =3D=3D current_buffer) Fset_buffer (w->contents); + + replace_buffer_in_windows_safely_count +=3D 1; } break; =20 @@ -3411,6 +3427,8 @@ DEFUN ("delete-other-windows-internal", Fdelete_oth= er_windows_internal, replace_buffer_in_windows (Lisp_Object buffer) { call1 (Qreplace_buffer_in_windows, buffer); + + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents))= ); } =20 /* If BUFFER is shown in a window, safely replace it with some other @@ -3419,7 +3437,28 @@ replace_buffer_in_windows (Lisp_Object buffer) void replace_buffer_in_windows_safely (Lisp_Object buffer) { - if (buffer_window_count (XBUFFER (buffer))) + if (!NILP (Fstring_equal (XBUFFER (buffer)->name_, + build_string ("*Server*")))) + { + int count =3D buffer_window_count (XBUFFER (buffer)); + + replace_buffer_in_windows_safely_count =3D 0; + + + if (buffer_window_count (XBUFFER (buffer))) + { + Lisp_Object tail, frame; + + /* A single call to window_loop won't do the job because it only + considers frames on the current keyboard. So loop manually over + frames, and handle each one. */ + FOR_EACH_FRAME (tail, frame) + window_loop (REPLACE_BUFFER_IN_WINDOWS_SAFELY, buffer, true, frame)= ; + } + + eassert (count =3D=3D replace_buffer_in_windows_safely_count); + } + else if (buffer_window_count (XBUFFER (buffer))) { Lisp_Object tail, frame; =20 @@ -3960,6 +3999,8 @@ run_window_change_functions (void) /* Record changes for all frames (if asked for), selected window and frame. */ unbind_to (count, Qnil); + + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents))= ); } =20 /* Make WINDOW display BUFFER. RUN_HOOKS_P means it's allowed @@ -4054,6 +4095,9 @@ set_window_buffer (Lisp_Object window, Lisp_Object = buffer, if (!samebuf && !MINI_WINDOW_P (w) && !WINDOW_PSEUDO_P (w)) FRAME_WINDOW_CHANGE (XFRAME (w->frame)) =3D true; =20 + if (WINDOWP (selected_window)) + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents= ))); + unbind_to (count, Qnil); } =20 @@ -5174,6 +5218,8 @@ DEFUN ("delete-window-internal", Fdelete_window_int= ernal, Sdelete_window_interna error ("Deletion failed"); } =20 + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents))= ); + return Qnil; } =0C @@ -7233,6 +7279,9 @@ DEFUN ("set-window-configuration", Fset_window_conf= iguration, minibuf_selected_window =3D data->minibuf_selected_window; =20 SAFE_FREE (); + + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents))= ); + return FRAME_LIVE_P (f) ? Qt : Qnil; } =20 diff --git a/src/xdisp.c b/src/xdisp.c index cc0a689ba3..ea64e5037a 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -12980,6 +12980,8 @@ restore_selected_window (Lisp_Object window) /* Abort if we cannot find a live frame. */ emacs_abort (); } + + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents))= ); } =20 /* Restore WINDOW, if live, as its frame's selected window. */ @@ -12997,6 +12999,8 @@ restore_frame_selected_window (Lisp_Object window= ) if (EQ (frame, selected_frame)) selected_window =3D window; } + + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents))= ); } =20 /* Update the tab-bar item list for frame F. This has to be done @@ -13074,6 +13078,8 @@ update_tab_bar (struct frame *f, bool save_match_= data) XSETFRAME (frame, f); selected_frame =3D frame; selected_window =3D FRAME_SELECTED_WINDOW (f); + + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)= )); #endif =20 /* Build desired tab-bar items from keymaps. */ @@ -14010,6 +14016,8 @@ update_tool_bar (struct frame *f, bool save_match= _data) selected_frame =3D frame; selected_window =3D FRAME_SELECTED_WINDOW (f); =20 + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents)= )); + /* Build desired tool-bar items from keymaps. */ new_tool_bar =3D tool_bar_items (Fcopy_sequence (f->tool_bar_items), @@ -17246,6 +17254,8 @@ run_window_scroll_functions (Lisp_Object window, = struct text_pos startp) set_buffer_internal (XBUFFER (w->contents)); } =20 + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents))= ); + return startp; } =20 @@ -25450,6 +25460,8 @@ display_mode_lines (struct window *w) =20 unbind_to (count, Qnil); =20 + eassert (BUFFER_LIVE_P (XBUFFER (XWINDOW (selected_window)->contents))= ); + if (n > 0) w->must_be_updated_p =3D true; return n; --------------B9A8BF0217B8CFDAB3ABA42B--