From: Chet Ramey Date: Sat, 3 Aug 2024 17:27:21 +0000 (-0400) Subject: Readline-8.2 patch 12: prevent infinite recursion if a key sequence is bound to do... X-Git-Tag: readline-8.3~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef3365a17a006b15cbd658c50fdfe589a5dcab20;p=thirdparty%2Freadline.git Readline-8.2 patch 12: prevent infinite recursion if a key sequence is bound to do-lowercase-version but converting to lowercase doesn't change the key --- diff --git a/isearch.c b/isearch.c index c2d4d23..227b692 100644 --- a/isearch.c +++ b/isearch.c @@ -428,7 +428,11 @@ add_character: { f = cxt->keymap[c].function; if (f == rl_do_lowercase_version) - f = cxt->keymap[_rl_to_lower (c)].function; + { + f = cxt->keymap[_rl_to_lower (c)].function; + if (f == rl_do_lowercase_version) + f = rl_insert; + } } if (f == rl_reverse_search_history) diff --git a/patchlevel b/patchlevel index f01eabb..0938386 100644 --- a/patchlevel +++ b/patchlevel @@ -1,3 +1,3 @@ # Do not edit -- exists only for use by patch -11 +12 diff --git a/readline.c b/readline.c index 9d42a8d..d649af5 100644 --- a/readline.c +++ b/readline.c @@ -899,8 +899,17 @@ _rl_dispatch_subseq (register int key, Keymap map, int got_subseq) { /* 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)); + { + /* 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; rl_executing_key = key; @@ -1109,7 +1118,11 @@ _rl_subseq_result (int r, Keymap map, int key, int got_subseq) type = m[ANYOTHERKEY].type; func = m[ANYOTHERKEY].function; if (type == ISFUNC && func == rl_do_lowercase_version) - r = _rl_dispatch (_rl_to_lower ((unsigned char)key), map); + { + 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) { /* If we shadowed a function, whatever it is, we somehow need a