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.
This commit is contained in:
Martin Rudalics 2024-08-23 10:27:12 +02:00
parent cfcba7ddc4
commit 25f5372166
2 changed files with 27 additions and 15 deletions

View file

@ -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);
}
}

View file

@ -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))