diff --git a/ChangeLog b/ChangeLog index 0ad374e40458dfe826c131a11e67de300f393b6b..09e4faae357d7c8562582a5fa0e4804bcea66764 100644 --- a/ChangeLog +++ b/ChangeLog @@ -75,6 +75,11 @@ CVS code - regexec_safe() - Rename to safe_regexec() for consistency. (DLR) - winio.c: + statusq() + - Make sure that the vsnprintf(foo) call and foo's subsequent + null termination both take the proper number of bytes when + using multibyte characters, so that multibyte prompt strings + aren't prematurely cut off. (DLR) titlebar() - Make sure that the (mv)?waddnstr() calls take the proper number of bytes when using multibyte characters, so that diff --git a/src/winio.c b/src/winio.c index 11cc87d1a3580ad2557d7952cc80595f7717573c..30e02b4b7a885132ef5fc25fc39496c476e2ec8c 100644 --- a/src/winio.c +++ b/src/winio.c @@ -2652,7 +2652,7 @@ int statusq(bool allow_tabs, const shortcut *s, const char *def, const char *msg, ...) { va_list ap; - char *foo = charalloc(COLS - 3); + char *foo = charalloc(((COLS - 4) * mb_cur_max()) + 1); int ret; #ifndef DISABLE_TABCOMP bool list = FALSE; @@ -2661,9 +2661,9 @@ int statusq(bool allow_tabs, const shortcut *s, const char *def, bottombars(s); va_start(ap, msg); - vsnprintf(foo, COLS - 4, msg, ap); + vsnprintf(foo, (COLS - 4) * mb_cur_max(), msg, ap); va_end(ap); - foo[COLS - 4] = '\0'; + null_at(&foo, actual_x(foo, COLS - 4)); ret = nanogetstr(allow_tabs, foo, def, #ifndef NANO_SMALL