]> git.eshelyaron.com Git - emacs.git/commitdiff
Handle completely undecoded input in term (Bug#29918)
authorNoam Postavsky <npostavs@gmail.com>
Wed, 17 Jul 2019 11:20:20 +0000 (07:20 -0400)
committerNoam Postavsky <npostavs@gmail.com>
Sun, 21 Jul 2019 01:35:21 +0000 (21:35 -0400)
* lisp/term.el (term-emulate-terminal): Avoid errors if the whole
decoded string is eight-bit characters.  Don't attempt to save the
string for next iteration in that case.
* test/lisp/term-tests.el (term-decode-partial)
(term-undecodable-input): New tests.

lisp/term.el
test/lisp/term-tests.el

index cbef68dc0aceb5dfc4390a67845c793152d62f2d..9785ce30249e236500aac223c43e235dc34c2747 100644 (file)
@@ -2900,11 +2900,12 @@ See `term-prompt-regexp'."
                           ;; next time.
                           (when (= funny str-length)
                             (let ((partial 0))
-                              (while (eq (char-charset (aref decoded-substring
-                                                             (- count 1 partial)))
-                                         'eight-bit)
+                              (while (and (< partial count)
+                                          (eq (char-charset (aref decoded-substring
+                                                                  (- count 1 partial)))
+                                              'eight-bit))
                                 (cl-incf partial))
-                              (when (> partial 0)
+                              (when (> count partial 0)
                                 (setq term-terminal-undecoded-bytes
                                       (substring decoded-substring (- partial)))
                                 (setq decoded-substring
index c2b90dea60468ea3e9d54341344ab5622e866b1c..237e19d6b159fe24e59a468e408410d410deecf4 100644 (file)
@@ -144,6 +144,25 @@ This is a reduced example from GNU nano's initial screen."
                     `("\e[1;3r" "\e[2;1H" ,x "\r\e[1A" ,y))
                    (concat y "\n" x)))))
 
+(ert-deftest term-decode-partial () ;; Bug#25288.
+  "Test multibyte characters sent into multiple chunks."
+  ;; Set `locale-coding-system' so test will be deterministic.
+  (let* ((locale-coding-system 'utf-8-unix)
+         (string (make-string 7 ?ш))
+         (bytes (encode-coding-string string locale-coding-system)))
+    (should (equal string
+                   (term-test-screen-from-input
+                    40 1 `(,(substring bytes 0 (/ (length bytes) 2))
+                           ,(substring bytes (/ (length bytes) 2))))))))
+
+(ert-deftest term-undecodable-input () ;; Bug#29918.
+  "Undecodable bytes should be passed through without error."
+  (let* ((locale-coding-system 'utf-8-unix) ; As above.
+         (bytes "\376\340\360\370")
+         (string (decode-coding-string bytes locale-coding-system)))
+    (should (equal string
+                   (term-test-screen-from-input
+                    40 1 bytes)))))
 
 (provide 'term-tests)