]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix ietf-drums-remove-whitespace unmatched " and (
authorBob Rogers <rogers@rgrjr.com>
Sun, 13 Feb 2022 08:32:13 +0000 (09:32 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 13 Feb 2022 08:32:13 +0000 (09:32 +0100)
* lisp/mail/ietf-drums.el:
+ (ietf-drums-skip-comment):  New helper function.
+ (ietf-drums-remove-comments):  Use ietf-drums-skip-comment.
+ (ietf-drums-remove-whitespace):  Handle unterminated quotes and
comments, as ietf-drums-remove-comments already does.
* test/lisp/mail/ietf-drums-tests.el:
+ Test unterminated quote and comment for
ietf-drums-remove-whitespace and ietf-drums-remove-comments (bug#53965).

lisp/mail/ietf-drums.el
test/lisp/mail/ietf-drums-tests.el

index db77aba172fb66c31bf99015caceec001b209a60..85aa27235fcc7be0bac112ffd4cb4d4c82d174d4 100644 (file)
@@ -65,6 +65,21 @@ backslash and doublequote.")
     (modify-syntax-entry ?\' "_" table)
     table))
 
+(defvar ietf-drums-comment-syntax-table
+  (let ((table (copy-syntax-table ietf-drums-syntax-table)))
+    (modify-syntax-entry ?\" "w" table)
+    table)
+  "In comments, DQUOTE is normal and does not start a string.")
+
+(defun ietf-drums--skip-comment ()
+  ;; From just before the start of a comment, go to the end.  Returns
+  ;; point.  If the comment is unterminated, go to point-max.
+  (condition-case ()
+      (with-syntax-table ietf-drums-comment-syntax-table
+       (forward-sexp 1))
+    (scan-error (goto-char (point-max))))
+  (point))
+
 (defun ietf-drums-token-to-list (token)
   "Translate TOKEN into a list of characters."
   (let ((i 0)
@@ -109,14 +124,7 @@ backslash and doublequote.")
              (forward-sexp 1)
            (error (goto-char (point-max)))))
         ((eq c ?\()
-         (delete-region
-              (point)
-              (condition-case nil
-                  (with-syntax-table (copy-syntax-table ietf-drums-syntax-table)
-                    (modify-syntax-entry ?\" "w")
-                    (forward-sexp 1)
-                    (point))
-                (error (point-max)))))
+         (delete-region (point) (ietf-drums--skip-comment)))
         (t
          (forward-char 1))))
       (buffer-string))))
@@ -130,9 +138,11 @@ backslash and doublequote.")
        (setq c (char-after))
        (cond
         ((eq c ?\")
-         (forward-sexp 1))
+         (condition-case ()
+             (forward-sexp 1)
+           (scan-error (goto-char (point-max)))))
         ((eq c ?\()
-         (forward-sexp 1))
+          (ietf-drums--skip-comment))
         ((memq c '(?\  ?\t ?\n ?\r))
          (delete-char 1))
         (t
index 4cc38b8763ab2e4aad47190dc6935cc6ea639c3e..b13937bf736b587468f587fd3cf887c573a80575 100644 (file)
   (should (equal (ietf-drums-remove-comments
                   "random (first) (second (and)) (third) not fourth")
                  "random    not fourth"))
+  ;; Test some unterminated comments.
+  (should (equal (ietf-drums-remove-comments "test an (unterminated comment")
+                 "test an "))
+  (should (equal (ietf-drums-remove-comments "test an \"unterminated quote")
+                 ;; returns the string unchanged (and doesn't barf).
+                 "test an \"unterminated quote"))
+  (should (equal (ietf-drums-remove-comments
+                  ;; note that double-quote is not special.
+                  "test (unterminated comments with \"quoted (\" )stuff")
+                 "test "))
 
   ;; ietf-drums-remove-whitespace
   (should (equal (ietf-drums-remove-whitespace "random string")
   (should (equal (ietf-drums-remove-whitespace
                   "random (first) (second (and)) (third) not fourth")
                  "random(first)(second (and))(third)notfourth"))
+  ;; Test some unterminated comments and quotes.
+  (should (equal (ietf-drums-remove-whitespace
+                  "random (first) (second (and)) (third unterminated")
+                 "random(first)(second (and))(third unterminated"))
+  (should (equal (ietf-drums-remove-whitespace "random \"non terminated string")
+                 "random\"non terminated string"))
 
   ;; ietf-drums-strip
   (should (equal (ietf-drums-strip "random string") "randomstring"))