]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't clobber match data in utf-8-hfs conversion (bug#41445)
authorMattias Engdegård <mattiase@acm.org>
Fri, 22 May 2020 10:21:28 +0000 (12:21 +0200)
committerMattias Engdegård <mattiase@acm.org>
Wed, 27 May 2020 14:29:43 +0000 (16:29 +0200)
Reported by Ture Pålsson.

* lisp/international/ucs-normalize.el
(ucs-normalize-hfs-nfd-post-read-conversion)
(ucs-normalize-hfs-nfd-pre-write-conversion):
Use save-match-data to avoid match data clobber in normalisation.
* test/lisp/international/ucs-normalize-tests.el
(ucs-normalize-save-match-data): New test.

lisp/international/ucs-normalize.el
test/lisp/international/ucs-normalize-tests.el

index 201ff6b9b17181cb9f96e3f6b255695f4dc87e37..b703d3dd2f2b760e9ffe083056544d46cdf7ba65 100644 (file)
@@ -612,14 +612,16 @@ COMPOSITION-PREDICATE will be used to compose region."
 (defun ucs-normalize-hfs-nfd-post-read-conversion (len)
   (save-excursion
     (save-restriction
-      (narrow-to-region (point) (+ (point) len))
-      (ucs-normalize-HFS-NFC-region (point-min) (point-max))
-      (- (point-max) (point-min)))))
+      (save-match-data
+        (narrow-to-region (point) (+ (point) len))
+        (ucs-normalize-HFS-NFC-region (point-min) (point-max))
+        (- (point-max) (point-min))))))
 
 ;; Pre-write conversion for `utf-8-hfs'.
 ;; _from and _to are legacy arguments (see `define-coding-system').
 (defun ucs-normalize-hfs-nfd-pre-write-conversion (_from _to)
-  (ucs-normalize-HFS-NFD-region (point-min) (point-max)))
+  (save-match-data
+    (ucs-normalize-HFS-NFD-region (point-min) (point-max))))
 
 ;;; coding-system definition
 (define-coding-system 'utf-8-hfs
index c36808ad72ffe900f4db496960f0e25de25b4478..2c60bd318a203b8ea80a76ffbbcabba7f821451e 100644 (file)
@@ -341,4 +341,15 @@ implementations:
           (display-buffer (current-buffer)))
       (message "No changes to failing lines needed"))))
 
+(ert-deftest ucs-normalize-save-match-data ()
+  "Verify that match data isn't clobbered (bug#41445)"
+  (string-match (rx (+ digit)) "a47b")
+  (should (equal (match-data t) '(1 3)))
+  (should (equal
+           (decode-coding-string
+            (encode-coding-string "Käsesoßenrührlöffel" 'utf-8-hfs)
+            'utf-8-hfs)
+           "Käsesoßenrührlöffel"))
+  (should (equal (match-data t) '(1 3))))
+
 ;;; ucs-normalize-tests.el ends here