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 18:16:35 +0200 Message-ID: <5c4e5857-6a76-b8e8-204b-b4a855e95a16@gmx.at> 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> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------B0F930BDFE975DD54EF12AB0" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="14456"; 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 18:37:51 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 1lUBBe-0003fq-3j for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 07 Apr 2021 18:37:50 +0200 Original-Received: from localhost ([::1]:53612 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lUBBd-0008CP-3j for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 07 Apr 2021 12:37:49 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:51404) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lUArW-0004Fn-7o for bug-gnu-emacs@gnu.org; Wed, 07 Apr 2021 12:17:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:33520) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lUArV-0000u1-UK for bug-gnu-emacs@gnu.org; Wed, 07 Apr 2021 12:17:01 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lUArV-0007I8-M9 for bug-gnu-emacs@gnu.org; Wed, 07 Apr 2021 12:17:01 -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 16:17:01 +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.161781221728015 (code B ref 47244); Wed, 07 Apr 2021 16:17:01 +0000 Original-Received: (at 47244) by debbugs.gnu.org; 7 Apr 2021 16:16:57 +0000 Original-Received: from localhost ([127.0.0.1]:45066 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lUArQ-0007Hn-Oa for submit@debbugs.gnu.org; Wed, 07 Apr 2021 12:16:57 -0400 Original-Received: from mout.gmx.net ([212.227.15.19]:38411) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lUArO-0007Ha-QY for 47244@debbugs.gnu.org; Wed, 07 Apr 2021 12:16:55 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1617812198; bh=5MPxK2JUOGFhhnCszlmsE0s7xqElRsmMyiXVzFx83Mc=; h=X-UI-Sender-Class:Subject:To:Cc:References:From:Date:In-Reply-To; b=HqvGNBaiWcPyz3PafADmeDUXAdsWyT5IPq8+mNmVzGzBJCrLp7ddremM2X7A2YdJD hZwZV8RatnKFZp60PAN1bppGBanfoed1VSX2w1i5lM2fFowKWgdRp2S9r4EbUMCIdc Pkrm4lC/KsjWIKz8n59lLysWvsTY6SB21SaNAbCI= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Original-Received: from [192.168.1.100] ([212.95.5.199]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1Mel3n-1m1re42wqL-00amDm; Wed, 07 Apr 2021 18:16:37 +0200 In-Reply-To: Content-Language: en-US X-Provags-ID: V03:K1:H3L3ndvBMc4TDoC9yV7XYlF6+mJbTKJvKJCiy7OyuiBCL8DwXjt qtZmfJFL+9aVpJTMFXmoe/D2cd67hztr5T5+xTETH5S4ceG/rSkfCgpNpcBXALWwjcQtBgq 1X1srVvS4OvfGd+avxRLeLWpeRxWF3PDiqhmtw3xpVb5uTbIDYdcwerA585GuB9INCi3O7/ ByG7BpYFpKJeIbPFeu7jg== X-UI-Out-Filterresults: notjunk:1;V03:K0:dLDbch7lAAE=:9DzMGq4vUz4RUoHsXxnQac 1wpDXVRHith0RWVqfKsxf0k3Moqrvy8oquxFW0N8APJI5p2GnCiLhkv60Vzaq3DFhqWwbgCzy 7Zl9iAwk3xu544w5tSBba44/cqKg4SlUaVVM6uTBDcBfoC6mSG7iQV+984AC85SHof0sNHAUS UxQQ3LgfGije+j2gNWgDje4PopZPgL+DarJbzgLcMsANKfILXqmz+eMg7GPcZsOjNTTE7kB9f PibLo0THs1FTXVrhpMAsDHvLyWpq1tZ6b245PDEN6+m9ArmKye+y54xMLYIpC4OOZuRKYN7Z6 MWLHrYiPLWtbcUbgjATEy+A8Hu1yOqp32qN32PdKWHLx/yEzpKHmnGrZPtW6ML0wciylGWiYP 1lDX30Kt6NSR0jD+rZ158w/6+TQF3Kl84MvgRSljOFApqakzGU8gjUeGorLbXVvwfMEF6EPii vvEH79eLOuDaFA4+cH91Dq4rIw5tJ3g+DUrPZaQBgs6l/bf4NujtORUDWfhsb8KdaIEDoxuid wpq5aZDpU+VxFpVtdUMKb7vgRSiYJWIxkV4D8lHgBbAv+z20Q712yxCz70cARCR69PDiGkVvQ B2PeRz2MT2s58sDpILTKYuYieQ8jh7xBsjZ4GzmRsb8hkinwldjJCfLJucP3J/Nstpyx+Vy1N Q9XzYmUuyM5y9eMOdzcpaum/X6GYx3M/8k5gcm50+Sjy/5w1K5rr/lY6elmFOjHddu3g94nW0 qEeRsFZsXCTikRAkqcRhnSj1nNi8X7VDDdieo1Pa5VaDTfl2ZCsfcXbTnSJe35RpZwQpGV5E 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:203692 Archived-At: This is a multi-part message in MIME format. --------------B0F930BDFE975DD54EF12AB0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit > Don't know where to go from here, but I have a breakpoint set on > > replace_buffer_in_windows_safely_count = 0; > > conditioned on count != 0. Good. IIUC this > (gdb) p list_length(Vwindow_list) > $2 = 2 and this > (gdb) xlist > $13 = 0x1a > Lisp_Int0 > $14 = 6 together indicate that Vwindow_list spontaneously shrinks from 6 to 2 elements (which is "impossible" as we know already). Attaching the next patch which should catch this situation automatically. It will still be of no help because we won't catch the one that apparently clobbers that list but hopefully more useful than the previous diff. martin --------------B0F930BDFE975DD54EF12AB0 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..c6fbe24742 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 @@ -2569,7 +2578,11 @@ window_list (void) arglist =3D Fnreverse (arglist); Vwindow_list =3D nconc2 (Vwindow_list, arglist); } + + window_list_length =3D list_length (Vwindow_list); } + else + eassert (window_list_length =3D=3D list_length (Vwindow_list)); =20 return Vwindow_list; } @@ -2950,6 +2963,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 +3063,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 +3428,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 +3438,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 +4000,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 +4096,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 +5219,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 +7280,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; --------------B0F930BDFE975DD54EF12AB0--