READLINE PATCH REPORT ===================== Readline-Release: 8.2 Patch-ID: readline82-012 Bug-Reported-by: Grisha Levit Bug-Reference-ID: 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