1
0
mirror of https://github.com/rfivet/uemacs.git synced 2024-12-24 01:56:26 -05:00

character input: make sure we have enough bytes for a full utf8 character

.. but we do have that 0.1s delay, so if somebody feeds us non-utf8
sequences, we won't delay forever.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Linus Torvalds 2012-07-10 18:11:30 -07:00
parent 3abd3dba42
commit 6e4a45c005

21
posix.c
View File

@ -153,7 +153,7 @@ int ttgetc(void)
static char buffer[32]; static char buffer[32];
static int pending; static int pending;
unicode_t c; unicode_t c;
int count, bytes = 1; int count, bytes = 1, expected;
count = pending; count = pending;
if (!count) { if (!count) {
@ -167,8 +167,25 @@ int ttgetc(void)
if (c >= 32 && c < 128) if (c >= 32 && c < 128)
goto done; goto done;
/*
* Lazy. We don't bother calculating the exact
* expected length. We want at least two characters
* for the special character case (ESC+[) and for
* the normal short UTF8 sequence that starts with
* the 110xxxxx pattern.
*
* But if we have any of the other patterns, just
* try to get more characters. At worst, that will
* just result in a barely perceptible 0.1 second
* delay for some *very* unusual utf8 character
* input.
*/
expected = 2;
if ((c & 0xe0) == 0xe0)
expected = 6;
/* Special character - try to fill buffer */ /* Special character - try to fill buffer */
if (count == 1) { if (count < expected) {
int n; int n;
ntermios.c_cc[VMIN] = 0; ntermios.c_cc[VMIN] = 0;
ntermios.c_cc[VTIME] = 1; /* A .1 second lag */ ntermios.c_cc[VTIME] = 1; /* A .1 second lag */