bug#81504: [PATCH] Restore current buffer after clone-indirect-buffer-hook errors

Sean Whitton <[email protected]> Fri, 31 Jul 2026 11:27:17 +0100
Newsgroups gmane.emacs.bugs
Message-ID <[email protected]>
Donjuanplatinum [30/Jul  9:35pm +08] wrote:
> Sean Whitton <[email protected]> writes:
>
>> Donjuanplatinum via "Bug reports for GNU Emacs, the Swiss army knife of text editors" [28/Jul  1:47am +08] wrote:
>>> Version: 31.0.50
>>> Base-Commit: 810e9d675ba484dabade1a9f30201d2848c5e2ea
>>>
>>> In `make-indirect-buffer` with clone argument, if
>>> `clone-indirect-buffer-hook` return an error, `current-buffer` will not
>>> be restored.
>>>
>>> To make the error in emacs -Q:
>>>
>>>
>>>    (progn
>>>       (generate-new-buffer "base")
>>>       (with-current-buffer "base" (insert "text"))
>>>       (set-buffer "base")
>>>       (let ((clone-indirect-buffer-hook
>>>              (list (lambda () (error "hook error")))))
>>>         (condition-case nil
>>>             (make-indirect-buffer "base" "ind" t)
>>>           (error nil)))
>>>       (buffer-name (current-buffer)))
>>>
>>> Expected: "base"
>>> But get: "ind"
>>>
>>> The Clone path in Fmake_indirect_buffer use set_buffer_internal_1 to
>>> restore the current-buffer, but when clone-indirect-buffer-hook return
>>> an error, it will skip the set_buffer_internal_1.
>>>
>>> The attached patch replaces it with record_unwind_current_buffer so that
>>> it will following the standard specpdl pattern to restore the current-buffer.
>>
>> Should we be restoring the current buffer here?  I'm not sure there is
>> any particular reason why we should, and calling code can always use
>> with-current-buffer or save-current-buffer if it needs to ensure that
>> it's restored?
> Thank you for taking a look.
>
> I think the function already intends to restore the current buffer on
> the normal path. Otherwise, why does it save old_b and call
> set_buffer_internal_1 (old_b) before returning?
>
> My patch only makes the error path behave same with the normal path.

I see what you mean.

I can't install the full patch because I don't think you've assigned
copyright for contributions to Emacs to the FSF.  If you'd be interested
in doing that we can start that process?

In the meantime I've installed the C changes, because it does not seem
essential to have a test for this.  But after copyright assignment we
can install the test anyway.

-- 
Sean Whitton