aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Rudalics2024-08-23 10:27:12 +0200
committerMartin Rudalics2024-08-23 10:27:12 +0200
commit25f537216682eecedf3905c4e005f02be007ed9c (patch)
tree8fc3f4511dc9e9f28f0e14328b21182a2484e100
parentcfcba7ddc41b84f108809bdd8d7201c181fd62ab (diff)
downloademacs-25f537216682eecedf3905c4e005f02be007ed9c.tar.gz
emacs-25f537216682eecedf3905c4e005f02be007ed9c.zip
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.
-rw-r--r--src/minibuf.c39
-rw-r--r--src/window.c3
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;
63 63
64static Lisp_Object minibuf_prompt; 64static Lisp_Object minibuf_prompt;
65 65
66/* The frame containinug the most recently opened Minibuffer. This is 66/* The frame containing the most recently opened minibuffer. This is
67 used only when `minibuffer-follows-selected-frame' is neither nil 67 used only when `minibuffer-follows-selected-frame' is neither nil
68 nor t. */ 68 nor t. */
69 69
@@ -1248,27 +1248,36 @@ static void
1248minibuffer_unwind (void) 1248minibuffer_unwind (void)
1249{ 1249{
1250 struct frame *f; 1250 struct frame *f;
1251 struct window *w;
1252 Lisp_Object window;
1253 Lisp_Object entry;
1254 1251
1255 if (NILP (exp_MB_frame)) return; /* "Can't happen." */ 1252 if (NILP (exp_MB_frame)) return; /* "Can't happen." */
1256 f = XFRAME (exp_MB_frame); 1253 f = XFRAME (exp_MB_frame);
1257 window = f->minibuffer_window;
1258 w = XWINDOW (window);
1259 if (FRAME_LIVE_P (f)) 1254 if (FRAME_LIVE_P (f))
1260 { 1255 {
1261 /* minibuf_window = sf->minibuffer_window; */ 1256 Lisp_Object window = f->minibuffer_window;
1262 if (!NILP (w->prev_buffers)) 1257
1258 if (WINDOW_LIVE_P (window))
1263 { 1259 {
1264 entry = Fcar (w->prev_buffers); 1260 struct window *w = XWINDOW (window);
1265 w->prev_buffers = Fcdr (w->prev_buffers); 1261
1266 set_window_buffer (window, Fcar (entry), 0, 0); 1262 /* minibuf_window = sf->minibuffer_window; */
1267 Fset_window_start (window, Fcar (Fcdr (entry)), Qnil); 1263 if (!NILP (w->prev_buffers))
1268 Fset_window_point (window, Fcar (Fcdr (Fcdr (entry)))); 1264 {
1265 Lisp_Object entry = Fcar (w->prev_buffers);
1266
1267 if (BUFFERP (Fcar (entry))
1268 && BUFFER_LIVE_P (XBUFFER (Fcar (entry))))
1269 {
1270 wset_prev_buffers (w, Fcdr (w->prev_buffers));
1271 set_window_buffer (window, Fcar (entry), 0, 0);
1272 Fset_window_start (window, Fcar (Fcdr (entry)), Qnil);
1273 Fset_window_point (window, Fcar (Fcdr (Fcdr (entry))));
1274 }
1275 else
1276 set_window_buffer (window, nth_minibuffer (0), 0, 0);
1277 }
1278 else
1279 set_window_buffer (window, nth_minibuffer (0), 0, 0);
1269 } 1280 }
1270 else
1271 set_window_buffer (window, nth_minibuffer (0), 0, 0);
1272 } 1281 }
1273} 1282}
1274 1283
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,
4123 specpdl_ref count = SPECPDL_INDEX (); 4123 specpdl_ref count = SPECPDL_INDEX ();
4124 bool samebuf = EQ (buffer, w->contents); 4124 bool samebuf = EQ (buffer, w->contents);
4125 4125
4126 /* It's never OK to assign WINDOW a dead buffer. */
4127 eassert (BUFFER_LIVE_P (b));
4128
4126 wset_buffer (w, buffer); 4129 wset_buffer (w, buffer);
4127 4130
4128 if (EQ (window, selected_window)) 4131 if (EQ (window, selected_window))