diff options
author | Chet Ramey <chet.ramey@case.edu> | 2024-08-03 13:27:21 -0400 |
---|---|---|
committer | Chet Ramey <chet.ramey@case.edu> | 2024-08-03 13:27:21 -0400 |
commit | ef3365a17a006b15cbd658c50fdfe589a5dcab20 (patch) | |
tree | e168dfd2c3485e70c8f66fad9c2becb2ee5a3b44 | |
parent | 9337fc44442954dd949ca7db027b164968e913c6 (diff) |
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
-rw-r--r-- | isearch.c | 6 | ||||
-rw-r--r-- | patchlevel | 2 | ||||
-rw-r--r-- | readline.c | 19 |
3 files changed, 22 insertions, 5 deletions
@@ -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) @@ -1,3 +1,3 @@ # Do not edit -- exists only for use by patch -11 +12 @@ -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 |