Handle completely undecoded input in term (Bug#29918)

* 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.
This commit is contained in:
Noam Postavsky 2019-07-17 07:20:20 -04:00
parent 021f32cca1
commit 150bdfe43a
2 changed files with 24 additions and 4 deletions

View 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

View 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)