summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPip Cet <pipcet@protonmail.com>2026-05-24 09:17:44 +0000
committerPip Cet <pipcet@protonmail.com>2026-05-24 09:23:05 +0000
commitc146e3643c4eb2fc52fa730df9388544a31feb40 (patch)
treef049bc2ea738c5c858cf98961563d86c51612ce5
parent6932c940fda848422cb6c66c81c9d7a108e8320b (diff)
Fix off-by-one error in 'styled_format'
This would (rarely) result in composition properties being shared across the concatenation of two copies of a string. * src/editfns.c (styled_format): Include the first argument in the range. * test/src/editfns-tests.el (editfns-tests--format-composition-property): New.
-rw-r--r--src/editfns.c2
-rw-r--r--test/src/editfns-tests.el9
2 files changed, 10 insertions, 1 deletions
diff --git a/src/editfns.c b/src/editfns.c
index 341e241dfcb..4089edb1074 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -4398,7 +4398,7 @@ styled_format (ptrdiff_t nargs, Lisp_Object *args, bool message)
props = extend_property_ranges (props, len, new_len);
/* If successive arguments have properties, be sure that
the value of `composition' property be the copy. */
- if (1 < i && info[i - 1].end)
+ if (1 <= i && info[i - 1].end)
make_composition_value_copy (props);
add_text_properties_from_list (val, props,
make_fixnum (info[i].start));
diff --git a/test/src/editfns-tests.el b/test/src/editfns-tests.el
index 9bdd5cf5db6..e6f80d0ef48 100644
--- a/test/src/editfns-tests.el
+++ b/test/src/editfns-tests.el
@@ -938,4 +938,13 @@ sufficiently large to avoid truncation."
(pos-bol 2) (pos-eol 2))
(should (equal (buffer-string) "toto\nEmacs forever!\n"))))
+(ert-deftest editfns-tests--format-composition-property ()
+ "Check that composition properties are un-identified by `format'."
+ (let* ((s (compose-chars ?a ?b ?c))
+ (str (format "%s%s%s" s s s)))
+ (should-not (eq (get-text-property 0 'composition str)
+ (get-text-property 3 'composition str)))
+ (should-not (eq (get-text-property 3 'composition str)
+ (get-text-property 6 'composition str)))))
+
;;; editfns-tests.el ends here