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