# HG changeset patch # User Chong Yidong # Date 1222301152 0 # Node ID aedea0a2dba4558a2f36ebf736acdd08bd344426 # Parent 980421e378fa5d1a69cf0ab59ce01c531232ea7c (term-emulate-terminal): Encode input string before checking its length. diff -r 980421e378fa -r aedea0a2dba4 lisp/term.el --- a/lisp/term.el Thu Sep 25 00:05:40 2008 +0000 +++ b/lisp/term.el Thu Sep 25 00:05:52 2008 +0000 @@ -2718,7 +2718,11 @@ (defun term-emulate-terminal (proc str) (with-current-buffer (process-buffer proc) - (let* ((i 0) char funny count save-point save-marker old-point temp win + (let* ((i 0) char funny + count ; number of decoded chars in substring + count-bytes ; number of bytes + decoded-substring + save-point save-marker old-point temp win (buffer-undo-list t) (selected (selected-window)) last-win @@ -2777,6 +2781,10 @@ str i)) (when (not funny) (setq funny str-length)) (cond ((> funny i) + (setq decoded-substring + (decode-coding-string + (substring str i funny) + locale-coding-system)) (cond ((eq term-terminal-state 1) ;; We are in state 1, we need to wrap ;; around. Go to the beginning of @@ -2785,21 +2793,31 @@ (term-down 1 t) (term-move-columns (- (term-current-column))) (setq term-terminal-state 0))) - (setq count (- funny i)) + (setq count (length decoded-substring)) (setq temp (- (+ (term-horizontal-column) count) term-width)) (cond ((<= temp 0)) ;; All count chars fit in line. ((> count temp) ;; Some chars fit. ;; This iteration, handle only what fits. (setq count (- count temp)) + (setq count-bytes + (length + (encode-coding-string + (substring decoded-substring 0 count) + 'binary))) (setq temp 0) - (setq funny (+ count i))) + (setq funny (+ count-bytes i))) ((or (not (or term-pager-count term-scroll-with-delete)) (> (term-handle-scroll 1) 0)) (term-adjust-current-row-cache 1) (setq count (min count term-width)) - (setq funny (+ count i)) + (setq count-bytes + (length + (encode-coding-string + (substring decoded-substring 0 count) + 'binary))) + (setq funny (+ count-bytes i)) (setq term-start-line-column term-current-column)) (t ;; Doing PAGER processing. @@ -2813,7 +2831,7 @@ ;; following point if not eob nor insert-mode. (let ((old-column (current-column)) columns pos) - (insert (decode-coding-string (substring str i funny) locale-coding-system)) + (insert decoded-substring) (setq term-current-column (current-column) columns (- term-current-column old-column)) (when (not (or (eobp) term-insert-mode))