READLINE PATCH REPORT
                           =====================

Readline-Release: 8.2
Patch-ID: readline82-012

Bug-Reported-by:        Grisha Levit <grishale...@gmail.com>
Bug-Reference-ID:       
<CAMu=broah+41uumyt89fpqt8fsatj-d6mzzmpv2hzyjtcbv...@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

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
                 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRU    c...@case.edu    http://tiswww.cwru.edu/~chet/

Reply via email to