[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
emacs-30 25f53721668: Avoid putting a dead buffer in the minibuffer wind
From: |
Martin Rudalics |
Subject: |
emacs-30 25f53721668: Avoid putting a dead buffer in the minibuffer window (Bug#72487) |
Date: |
Fri, 23 Aug 2024 04:28:35 -0400 (EDT) |
branch: emacs-30
commit 25f537216682eecedf3905c4e005f02be007ed9c
Author: Martin Rudalics <rudalics@gmx.at>
Commit: Martin Rudalics <rudalics@gmx.at>
Avoid putting a dead buffer in the minibuffer window (Bug#72487)
* src/minibuf.c (minibuffer_unwind): Make sure that the buffer
referenced by the first element of the list of previous buffers
of the minibuffer window is live before assigning it to the
minibuffer window (Bug#72487).
* src/window.c (set_window_buffer): Assert that BUFFER is live.
---
src/minibuf.c | 39 ++++++++++++++++++++++++---------------
src/window.c | 3 +++
2 files changed, 27 insertions(+), 15 deletions(-)
diff --git a/src/minibuf.c b/src/minibuf.c
index 1dfee0a59c9..f16880011f7 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -63,7 +63,7 @@ Lisp_Object last_minibuf_string;
static Lisp_Object minibuf_prompt;
-/* The frame containinug the most recently opened Minibuffer. This is
+/* The frame containing the most recently opened minibuffer. This is
used only when `minibuffer-follows-selected-frame' is neither nil
nor t. */
@@ -1248,27 +1248,36 @@ static void
minibuffer_unwind (void)
{
struct frame *f;
- struct window *w;
- Lisp_Object window;
- Lisp_Object entry;
if (NILP (exp_MB_frame)) return; /* "Can't happen." */
f = XFRAME (exp_MB_frame);
- window = f->minibuffer_window;
- w = XWINDOW (window);
if (FRAME_LIVE_P (f))
{
- /* minibuf_window = sf->minibuffer_window; */
- if (!NILP (w->prev_buffers))
+ Lisp_Object window = f->minibuffer_window;
+
+ if (WINDOW_LIVE_P (window))
{
- entry = Fcar (w->prev_buffers);
- w->prev_buffers = Fcdr (w->prev_buffers);
- set_window_buffer (window, Fcar (entry), 0, 0);
- Fset_window_start (window, Fcar (Fcdr (entry)), Qnil);
- Fset_window_point (window, Fcar (Fcdr (Fcdr (entry))));
+ struct window *w = XWINDOW (window);
+
+ /* minibuf_window = sf->minibuffer_window; */
+ if (!NILP (w->prev_buffers))
+ {
+ Lisp_Object entry = Fcar (w->prev_buffers);
+
+ if (BUFFERP (Fcar (entry))
+ && BUFFER_LIVE_P (XBUFFER (Fcar (entry))))
+ {
+ wset_prev_buffers (w, Fcdr (w->prev_buffers));
+ set_window_buffer (window, Fcar (entry), 0, 0);
+ Fset_window_start (window, Fcar (Fcdr (entry)), Qnil);
+ Fset_window_point (window, Fcar (Fcdr (Fcdr (entry))));
+ }
+ else
+ set_window_buffer (window, nth_minibuffer (0), 0, 0);
+ }
+ else
+ set_window_buffer (window, nth_minibuffer (0), 0, 0);
}
- else
- set_window_buffer (window, nth_minibuffer (0), 0, 0);
}
}
diff --git a/src/window.c b/src/window.c
index ff28bac5306..dba2d6a3523 100644
--- a/src/window.c
+++ b/src/window.c
@@ -4123,6 +4123,9 @@ set_window_buffer (Lisp_Object window, Lisp_Object buffer,
specpdl_ref count = SPECPDL_INDEX ();
bool samebuf = EQ (buffer, w->contents);
+ /* It's never OK to assign WINDOW a dead buffer. */
+ eassert (BUFFER_LIVE_P (b));
+
wset_buffer (w, buffer);
if (EQ (window, selected_window))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- emacs-30 25f53721668: Avoid putting a dead buffer in the minibuffer window (Bug#72487),
Martin Rudalics <=