Hi Anton,
Anton Lindqvist wrote on Fri, May 19, 2017 at 02:11:37PM +0200:
> Hi,
> Another UTF-8 related bug reported by tb@. How to re-produce:
>
> 1. Enable vi mode:
>
> $ set -o vi
>
> 2. Input the following characters: öa
>
> 3. Press escape and then x twice.
>
> 4. An invalid UTF-8 character is displayed.
>
> Similar to one of my previous diffs, looks like the column counter is
> wrong. The diff below fixes the problem and includes a regression test.
> I'm not running vi mode myself so further testing would be appreciated.
Yes, that is correct, from both testing and code inspection.
I'd prefer to also delete the condition that becomes obsolete,
see below.
OK?
Ingo
Index: vi.c
===================================================================
RCS file: /cvs/src/bin/ksh/vi.c,v
retrieving revision 1.44
diff -u -p -r1.44 vi.c
--- vi.c 17 Oct 2016 18:39:43 -0000 1.44
+++ vi.c 19 May 2017 14:15:27 -0000
@@ -1154,8 +1154,10 @@ vi_cmd(int argcnt, const char *cmd)
expand_word(1);
break;
}
- if (insert == 0 && es->cursor != 0 && es->cursor >= es->linelen)
- es->cursor--;
+ if (insert == 0 && es->cursor >= es->linelen)
+ while (es->cursor > 0)
+ if (!isu8cont(es->cbuf[--es->cursor]))
+ break;
}
return 0;
}
> Index: regress/bin/ksh/vi/vi.sh
> ===================================================================
> RCS file: /cvs/src/regress/bin/ksh/vi/vi.sh,v
> retrieving revision 1.1
> diff -u -p -r1.1 vi.sh
> --- regress/bin/ksh/vi/vi.sh 12 Jan 2016 09:00:39 -0000 1.1
> +++ regress/bin/ksh/vi/vi.sh 19 May 2017 10:47:44 -0000
> @@ -168,6 +168,7 @@ testseq "abcd\00332X" " $ abcd\b\b\bd \
> # x: Delete character.
> # |: Move to column.
> testseq "abcd\00332|2x" " $ abcd\b\b\bd \b\b\b\r\nad"
> +testseq "\0303\0266a\0033xx" " $ \0303\0266a\b \b\b \b\b\r"
>
> # Y: Yank to end of line.
> testseq "abcd\0033hYp" " $ abcd\b\bccdd\b\b\r\nabccdd"
>