]> git.eshelyaron.com Git - emacs.git/commitdiff
A better fix for bug#60096
authorEli Zaretskii <eliz@gnu.org>
Fri, 16 Dec 2022 14:29:51 +0000 (16:29 +0200)
committerEli Zaretskii <eliz@gnu.org>
Fri, 16 Dec 2022 14:29:51 +0000 (16:29 +0200)
* lisp/startup.el (initial-scratch-message):
* lisp/simple.el (get-scratch-buffer-create): Revert last changes.

* src/window.c (Fset_window_configuration): Force recalculation of
Vwindow_list after restoring the windows.
* src/buffer.c (other_buffer_safely): Make sure we always return a
valid buffer, even if 'get-scratch-buffer-create' signals an
error.

lisp/simple.el
lisp/startup.el
src/buffer.c
src/window.c

index dcc2242e49f360beaf7a02b5deb6b35980f112fc..654b56a088641fe8a93796a2bcc4b18e50f8cb9b 100644 (file)
@@ -10683,12 +10683,7 @@ too short to have a dst element.
         ;; we just created it.
         (with-current-buffer scratch
           (when initial-scratch-message
-            ;; We used to run this through substitute-command-keys,
-            ;; but that might be unsafe in some rare cases, and this
-            ;; function must never fail and signal an error, because
-            ;; it is called from other_buffer_safely, which must
-            ;; always produce a valid buffer.
-            (insert initial-scratch-message)
+            (insert (substitute-command-keys initial-scratch-message))
             (set-buffer-modified-p nil))
           (funcall initial-major-mode))
         scratch)))
index 7f8e8d55db851da7f18075088f7fd666626e733d..6270de2ace69ab881798ff2afc731179d6db5835 100644 (file)
@@ -1669,7 +1669,7 @@ Changed settings will be marked as \"CHANGED outside of Customize\"."
 
 (defcustom initial-scratch-message (purecopy "\
 ;; This buffer is for text that is not saved, and for Lisp evaluation.
-;; To create a file, visit it with \"C-x C-f\" and enter text in its buffer.
+;; To create a file, visit it with \\[find-file] and enter text in its buffer.
 
 ")
   "Initial documentation displayed in *scratch* buffer at startup.
index 9a30faa0e1a64194b4fad37f9b84efabae6745a7..443f90ff8943e5046f143be7decc7db43ef58d67 100644 (file)
@@ -1747,7 +1747,18 @@ other_buffer_safely (Lisp_Object buffer)
     if (candidate_buffer (buf, buffer))
       return buf;
 
-  return safe_call (1, Qget_scratch_buffer_create);
+  /* This function must return a valid buffer, since it is frequently
+     our last line of defense in the face of the expected buffers
+     becoming dead under our feet.  safe_call below could return nil
+     if recreating *scratch* in Lisp, which does some fancy stuff,
+     signals an error in some weird use case.  */
+  buf = safe_call (1, Qget_scratch_buffer_create);
+  if (NILP (buf))
+    {
+      AUTO_STRING (scratch, "*scratch*");
+      buf = Fget_buffer_create (scratch, Qnil);
+    }
+  return buf;
 }
 \f
 DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, Sbuffer_enable_undo,
index f116b9a9d723f147274abcf1880ea9befd339f86..90fa6ac2dfeced2c3929644caa36175e8b42ae25 100644 (file)
@@ -2639,7 +2639,7 @@ window_list (void)
          Lisp_Object arglist = Qnil;
 
          /* We are visiting windows in canonical order, and add
-            new windows at the front of args[1], which means we
+            new windows at the front of arglist, which means we
             have to reverse this list at the end.  */
          foreach_window (XFRAME (frame), add_window_to_list, &arglist);
          arglist = Fnreverse (arglist);
@@ -7329,6 +7329,14 @@ the return value is nil.  Otherwise the value is t.  */)
            last_selected_window)
        = selected_window;
 
+      /* We may have deleted windows above.  Then again, maybe we
+        haven't: the functions we call to maybe delete windows can
+        decide a window cannot be deleted.  Force recalculation of
+        Vwindow_list next time it is needed, to make sure stale
+        windows with no buffers don't escape into the wild, which
+        will cause crashes elsewhere.  */
+      Vwindow_list = Qnil;
+
       if (NILP (data->focus_frame)
          || (FRAMEP (data->focus_frame)
              && FRAME_LIVE_P (XFRAME (data->focus_frame))))