From 1f0159de361af5d03a0469570cc6b7ea1ff45e4a Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sun, 19 Apr 2020 00:19:16 +0300 Subject: [PATCH] Make _inp_edited() more robust --- src/ui/inputwin.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c index 40875935..8362ee00 100644 --- a/src/ui/inputwin.c +++ b/src/ui/inputwin.c @@ -324,6 +324,10 @@ _inp_write(char *line, int offset) static int _inp_edited(const wint_t ch) { + // Use own state to be thread-safe with possible pthreads. C standard + // guarantees that initial value of the state will be zeroed buffer. + static mbstate_t mbstate; + // backspace if (ch == 127) { return 1; @@ -341,7 +345,10 @@ _inp_edited(const wint_t ch) // printable char bytes[MB_CUR_MAX+1]; - size_t utf_len = wcrtomb(bytes, ch, (mbstate_t*)NULL); + size_t utf_len = wcrtomb(bytes, ch, &mbstate); + if (utf_len == (size_t)-1) { + return 0; + } bytes[utf_len] = '\0'; gunichar unichar = g_utf8_get_char(bytes);