]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve detection of suspicious uses of bidi controls
authorEli Zaretskii <eliz@gnu.org>
Sat, 22 Jan 2022 09:58:05 +0000 (11:58 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 22 Jan 2022 09:58:05 +0000 (11:58 +0200)
* lisp/international/textsec.el
(textsec-bidi-controls-suspicious-p): New function.
(textsec-name-suspicious-p): Use it.

* test/lisp/international/textsec-tests.el (test-suspicious-name):
Enable the test that was previously failing with
'bidi-find-overridden-directionality'.

lisp/international/textsec.el
test/lisp/international/textsec-tests.el

index 223c0d5c92f2835d42dc3673a772a958241c9da7..adef64bfdf0ad70db4dd06167589ed709c2d648b 100644 (file)
@@ -287,6 +287,22 @@ certain other unusual mixtures of characters."
    ((string-match-p "\\`\\.\\|\\.\\'\\|\\.\\." local)
     (format "`%s' contains invalid dots" local))))
 
+(defun textsec-bidi-controls-suspicious-p (string)
+  "Return non-nil of STRING uses bidi controls in suspicious ways.
+If STRING doesn't include any suspicious uses of bidirectional
+formatting control characters, return nil.  Otherwise, return the
+index of the first character in STRING affected by such suspicious
+use of bidi controls.  If the returned value is beyond the length
+of STRING, it means any text following STRING on display might be
+affected by bidi controls in STRING."
+  (with-temp-buffer
+    ;; We add a string that's representative of some text that could
+    ;; follow STRING, with the purpose of detecting residual bidi
+    ;; state at end of STRING which could then affect the following
+    ;; text.
+    (insert string "a1א:!")
+    (bidi-find-overridden-directionality 1 (point-max) nil)))
+
 (defun textsec-name-suspicious-p (name)
   "Say whether NAME looks suspicious.
 NAME is (for instance) the free-text display name part of an
@@ -310,10 +326,11 @@ other unusual mixtures of characters."
                                           ?\N{arabic letter mark})))))
                    name)
          ;; We have bidirectional formatting characters, but check
-         ;; whether they affect LTR characters.  If not, it's not
-         ;; suspicious.
-         (bidi-find-overridden-directionality 0 (length name) name))
-    (format "The string contains bidirectional control characters"))
+         ;; whether they affect any other characters in suspicious
+         ;; ways.  If not, NAME is not suspicious.
+         (fixnump (textsec-bidi-controls-suspicious-p name)))
+    (format "`%s' contains suspicious uses of bidirectional control characters"
+            name))
    ((textsec-suspicious-nonspacing-p name))))
 
 (defun textsec-suspicious-nonspacing-p (string)
index c3c7e9b59a4c22adc08b27fc09c7797c0ee5fdf0..ee0af66d9923908ced42f36dc8b33ad597a011c2 100644 (file)
   (should (textsec-name-suspicious-p "LÅRS INGEBRIGTSEN"))
   (should-not (textsec-name-suspicious-p "LÅRS INGEBRIGTSEN"))
 
-  ;;; FIXME -- this test fail with `bidi-find-overridden-directionality'.
-  (when nil
-    (should (textsec-name-suspicious-p
-             "Lars Ingebrigtsen\N{LEFT-TO-RIGHT OVERRIDE}")))
+  (should (textsec-name-suspicious-p
+           "Lars Ingebrigtsen\N{LEFT-TO-RIGHT OVERRIDE}"))
   (should (textsec-name-suspicious-p
            "Lars Ingebrigtsen\N{LEFT-TO-RIGHT OVERRIDE}f"))
   (should-not (textsec-name-suspicious-p