diff options
| author | Martin Rudalics | 2024-08-23 10:27:12 +0200 |
|---|---|---|
| committer | Martin Rudalics | 2024-08-23 10:27:12 +0200 |
| commit | 25f537216682eecedf3905c4e005f02be007ed9c (patch) | |
| tree | 8fc3f4511dc9e9f28f0e14328b21182a2484e100 | |
| parent | cfcba7ddc41b84f108809bdd8d7201c181fd62ab (diff) | |
| download | emacs-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.c | 39 | ||||
| -rw-r--r-- | 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; | |||
| 63 | 63 | ||
| 64 | static Lisp_Object minibuf_prompt; | 64 | static 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 | |||
| 1248 | minibuffer_unwind (void) | 1248 | minibuffer_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)) |