Configuration Information [Automatically generated, do not change]: Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -g -O2 uname output: Linux westring 6.12.28 #1 SMP PREEMPT_DYNAMIC Fri May 9 16:58:50 CDT 2025 x86_64 AMD Ryzen 5 7600 6-Core Processor AuthenticAMD GNU/Linux Machine Type: x86_64-pc-linux-gnu
Bash Version: 5.3 Patch Level: 0 Release Status: maint Description: When formatting long messages that wont fit into its buffer, readline will reallocate the buffer to be just as large as is needed, but it will then not make use of the whole buffer for the formatted message, resulting in the last character being left out. Fixing the call to vsnprintf() alone would fix the exhibited _behavior_. However, readline also decides to perform the reallocation of the buffer "too early". This explains why the bug is triggered already when the prompt in the example below is only 126 characters. The 128 bytes of the buffer would be sufficient for holding the 126 characters of the prompt, a '/', and a terminating '\0', but readline is off by one and therefor performs the reallocation and the faulty formatting even in this case. The attached patch fixes both these issues. Repeat-By: 1. Enable vi line editing 2. Set PS1 to at be least 126 characters long 3. Hit Escape to get out of insert mode 4. Hit / to start a history search Expected result: The / is displayed after the PS1 prompt Actual result: Only the prompt is displayed Fix: diff --git c/lib/readline/display.c w/lib/readline/display.c index edb525d3..5c5f58d8 100644 --- c/lib/readline/display.c +++ w/lib/readline/display.c @@ -3143,14 +3143,14 @@ rl_message (const char *format, ...) #if defined (HAVE_VSNPRINTF) bneed = vsnprintf (msg_buf, msg_bufsiz, format, args); - if (bneed >= msg_bufsiz - 1) + if (bneed > msg_bufsiz - 1) { msg_bufsiz = bneed + 1; msg_buf = xrealloc (msg_buf, msg_bufsiz); va_end (args); va_start (args, format); - vsnprintf (msg_buf, msg_bufsiz - 1, format, args); + vsnprintf (msg_buf, msg_bufsiz, format, args); } #else vsprintf (msg_buf, format, args); -- Torgny Lyon