From b72dcebdabfc3b7b28c9542633bd48b43bcc6365 Mon Sep 17 00:00:00 2001 From: Pip Cet Date: Sun, 24 May 2026 12:05:50 +0000 Subject: [PATCH] Avoid crash in self-insert-command with non-ASCII auto-fill * src/cmds.c (internal_self_insert): If the autofill function changed the newline character we inserted, don't attempt to restore point. * test/src/cmds-tests.el (self-insert-nonascii-autofill): New. --- src/cmds.c | 2 +- test/src/cmds-tests.el | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/cmds.c b/src/cmds.c index e9dee5ed2e3..9ca9a6d28de 100644 --- a/src/cmds.c +++ b/src/cmds.c @@ -489,7 +489,7 @@ internal_self_insert (int c, EMACS_INT n) SET_PT_BOTH (PT - 1, PT_BYTE - 1); auto_fill_result = call0 (Qinternal_auto_fill); /* Test PT < ZV in case the auto-fill-function is strange. */ - if (c == '\n' && PT < ZV) + if (c == '\n' && PT < ZV && FETCH_BYTE (PT) == '\n') SET_PT_BOTH (PT + 1, PT_BYTE + 1); if (!NILP (auto_fill_result)) hairy = 2; diff --git a/test/src/cmds-tests.el b/test/src/cmds-tests.el index 8c0e4706e3c..2038c01942f 100644 --- a/test/src/cmds-tests.el +++ b/test/src/cmds-tests.el @@ -48,5 +48,22 @@ (self-insert-command 0 10) (should-not (equal pt 0))))) +(ert-deftest self-insert-nonascii-autofill () + "Test `self-insert-command' with a non-ASCII autofill function." + (with-temp-buffer + (let ((auto-fill-function + (lambda () + (delete-char 1) + (insert #x2000) + (forward-char -1)))) + (dotimes (_ 10) + (self-insert-command 1 10) + (goto-char 2) + (should (equal (point) 2)) + (should (equal (length (buffer-string)) 1)) + (should (equal (format "%S" (buffer-string)) + "\"\x2000\"")) + (delete-char -1))))) + (provide 'cmds-tests) ;;; cmds-tests.el ends here