File readline82-012 of Package readline
READLINE PATCH REPORT
=====================
Readline-Release: 8.2
Patch-ID: readline82-012
Bug-Reported-by: Grisha Levit <grishalevit@gmail.com>
Bug-Reference-ID: <CAMu=BroaH+41uumYt89FPqt8Fsatj-d6mZzmPV2HZYjtcbvbvw@mail.gmail.com>
Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-readline/2023-11/msg00019.html
Bug-Description:
If a user happens to bind do-lowercase-version to something that isn't a
capital letter, so _rl_to_lower doesn't change anything and the result is
still bound to do-lowercase-version, readline can recurse infinitely.
Patch (apply with `patch -p0'):
*** ../readline-8.2-patched/readline.c Thu Aug 11 18:35:37 2022
--- readline.c Fri Feb 2 12:05:36 2024
***************
*** 900,905 ****
/* Special case rl_do_lowercase_version (). */
if (func == rl_do_lowercase_version)
! /* Should we do anything special if key == ANYOTHERKEY? */
! return (_rl_dispatch (_rl_to_lower ((unsigned char)key), map));
rl_executing_keymap = map;
--- 912,926 ----
/* Special case rl_do_lowercase_version (). */
if (func == rl_do_lowercase_version)
! {
! /* Should we do anything special if key == ANYOTHERKEY? */
! newkey = _rl_to_lower ((unsigned char)key);
! if (newkey != key)
! return (_rl_dispatch (newkey, map));
! else
! {
! rl_ding (); /* gentle failure */
! return 0;
! }
! }
rl_executing_keymap = map;
***************
*** 1110,1114 ****
func = m[ANYOTHERKEY].function;
if (type == ISFUNC && func == rl_do_lowercase_version)
! r = _rl_dispatch (_rl_to_lower ((unsigned char)key), map);
else if (type == ISFUNC)
{
--- 1131,1139 ----
func = m[ANYOTHERKEY].function;
if (type == ISFUNC && func == rl_do_lowercase_version)
! {
! int newkey = _rl_to_lower ((unsigned char)key);
! /* check that there is actually a lowercase version to avoid infinite recursion */
! r = (newkey != key) ? _rl_dispatch (newkey, map) : 1;
! }
else if (type == ISFUNC)
{
*** ../readline-8.2-patched/isearch.c Thu Aug 11 18:35:37 2022
--- isearch.c Fri Feb 2 12:05:36 2024
***************
*** 429,433 ****
f = cxt->keymap[c].function;
if (f == rl_do_lowercase_version)
! f = cxt->keymap[_rl_to_lower (c)].function;
}
--- 431,439 ----
f = cxt->keymap[c].function;
if (f == rl_do_lowercase_version)
! {
! f = cxt->keymap[_rl_to_lower (c)].function;
! if (f == rl_do_lowercase_version)
! f = rl_insert;
! }
}
*** ../readline-8.2/patchlevel 2013-11-15 08:11:11.000000000 -0500
--- patchlevel 2014-03-21 08:28:40.000000000 -0400
***************
*** 1,3 ****
# Do not edit -- exists only for use by patch
! 11
--- 1,3 ----
# Do not edit -- exists only for use by patch
! 12