From f3b38b46ebbe34f5a56ca166da9cdb27d4827724 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Thu, 30 Oct 2025 21:27:37 +0800 Subject: [PATCH] vim-patch:9.1.1292: statusline not correctly evaluated Problem: statusline not correctly evaluated (Peter Kenny, after v9.1.1291) Solution: revert part of patch v9.1.1291 (Hirohito Higashi) fixes: vim/vim#17095 closes: vim/vim#17094 https://github.com/vim/vim/commit/c8ce81b0dcaddefc65e3d445c92c9e0253bd9173 Co-authored-by: Hirohito Higashi --- src/nvim/statusline.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/nvim/statusline.c b/src/nvim/statusline.c index 3d8610d26f..724c8b6642 100644 --- a/src/nvim/statusline.c +++ b/src/nvim/statusline.c @@ -1418,11 +1418,18 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, OptIndex op && strchr(str, '%') != NULL && evaldepth < MAX_STL_EVAL_DEPTH) { size_t parsed_usefmt = (size_t)(block_start - usefmt); - size_t new_fmt_len = parsed_usefmt + strlen(str) + strlen(fmt_p) + 3; + size_t str_length = strlen(str); + size_t fmt_length = strlen(fmt_p); + size_t new_fmt_len = parsed_usefmt + str_length + fmt_length + 3; char *new_fmt = xmalloc(new_fmt_len * sizeof(char)); + char *new_fmt_p = new_fmt; - vim_snprintf(new_fmt, new_fmt_len, "%.*s%s%s%s", - (int)parsed_usefmt, usefmt, str, "%}", fmt_p); + new_fmt_p = (char *)memcpy(new_fmt_p, usefmt, parsed_usefmt) + parsed_usefmt; + new_fmt_p = (char *)memcpy(new_fmt_p, str, str_length) + str_length; + new_fmt_p = (char *)memcpy(new_fmt_p, "%}", 2) + 2; + new_fmt_p = (char *)memcpy(new_fmt_p, fmt_p, fmt_length) + fmt_length; + *new_fmt_p = 0; + new_fmt_p = NULL; if (usefmt != fmt) { xfree(usefmt);