Pete Graner 3797fb
			     BASH PATCH REPORT
Pete Graner 3797fb
			     =================
Pete Graner 3797fb
Pete Graner 3797fb
Bash-Release: 3.2
Pete Graner 3797fb
Patch-ID: bash32-019
Pete Graner 3797fb
Pete Graner 3797fb
Bug-Reported-by:	Thomas Loeber <ifp@loeber1.de>
Pete Graner 3797fb
Bug-Reference-ID:	<200703082223.08919.ifp@loeber1.de>
Pete Graner 3797fb
Bug-Reference-URL:	http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00036.html
Pete Graner 3797fb
Pete Graner 3797fb
Bug-Description:
Pete Graner 3797fb
Pete Graner 3797fb
When rl_read_key returns -1, indicating that bash's controlling terminal
Pete Graner 3797fb
has been invalidated for some reason (e.g., receiving a SIGHUP), the error
Pete Graner 3797fb
status was not reported correctly to the caller.  This could cause input
Pete Graner 3797fb
loops. 
Pete Graner 3797fb
Pete Graner 3797fb
Patch:
Pete Graner 3797fb
Pete Graner 3797fb
*** ../bash-3.2-patched/lib/readline/complete.c	Fri Jul 28 11:35:49 2006
Pete Graner 3797fb
--- lib/readline/complete.c	Tue Mar 13 08:50:16 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 429,433 ****
Pete Graner 3797fb
        if (c == 'n' || c == 'N' || c == RUBOUT)
Pete Graner 3797fb
  	return (0);
Pete Graner 3797fb
!       if (c == ABORT_CHAR)
Pete Graner 3797fb
  	_rl_abort_internal ();
Pete Graner 3797fb
        if (for_pager && (c == NEWLINE || c == RETURN))
Pete Graner 3797fb
--- 440,444 ----
Pete Graner 3797fb
        if (c == 'n' || c == 'N' || c == RUBOUT)
Pete Graner 3797fb
  	return (0);
Pete Graner 3797fb
!       if (c == ABORT_CHAR || c < 0)
Pete Graner 3797fb
  	_rl_abort_internal ();
Pete Graner 3797fb
        if (for_pager && (c == NEWLINE || c == RETURN))
Pete Graner 3797fb
*** ../bash-3.2-patched/lib/readline/input.c	Wed Aug 16 15:15:16 2006
Pete Graner 3797fb
--- lib/readline/input.c	Wed May  2 16:07:59 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 514,518 ****
Pete Graner 3797fb
       int size;
Pete Graner 3797fb
  {
Pete Graner 3797fb
!   int mb_len = 0;
Pete Graner 3797fb
    size_t mbchar_bytes_length;
Pete Graner 3797fb
    wchar_t wc;
Pete Graner 3797fb
--- 522,526 ----
Pete Graner 3797fb
       int size;
Pete Graner 3797fb
  {
Pete Graner 3797fb
!   int mb_len, c;
Pete Graner 3797fb
    size_t mbchar_bytes_length;
Pete Graner 3797fb
    wchar_t wc;
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 521,531 ****
Pete Graner 3797fb
    memset(&ps, 0, sizeof (mbstate_t));
Pete Graner 3797fb
    memset(&ps_back, 0, sizeof (mbstate_t));
Pete Graner 3797fb
!   
Pete Graner 3797fb
    while (mb_len < size)
Pete Graner 3797fb
      {
Pete Graner 3797fb
        RL_SETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
!       mbchar[mb_len++] = rl_read_key ();
Pete Graner 3797fb
        RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
  
Pete Graner 3797fb
        mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
Pete Graner 3797fb
        if (mbchar_bytes_length == (size_t)(-1))
Pete Graner 3797fb
--- 529,545 ----
Pete Graner 3797fb
    memset(&ps, 0, sizeof (mbstate_t));
Pete Graner 3797fb
    memset(&ps_back, 0, sizeof (mbstate_t));
Pete Graner 3797fb
! 
Pete Graner 3797fb
!   mb_len = 0;  
Pete Graner 3797fb
    while (mb_len < size)
Pete Graner 3797fb
      {
Pete Graner 3797fb
        RL_SETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
!       c = rl_read_key ();
Pete Graner 3797fb
        RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
  
Pete Graner 3797fb
+       if (c < 0)
Pete Graner 3797fb
+ 	break;
Pete Graner 3797fb
+ 
Pete Graner 3797fb
+       mbchar[mb_len++] = c;
Pete Graner 3797fb
+ 
Pete Graner 3797fb
        mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
Pete Graner 3797fb
        if (mbchar_bytes_length == (size_t)(-1))
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 565,569 ****
Pete Graner 3797fb
    c = first;
Pete Graner 3797fb
    memset (mb, 0, mlen);
Pete Graner 3797fb
!   for (i = 0; i < mlen; i++)
Pete Graner 3797fb
      {
Pete Graner 3797fb
        mb[i] = (char)c;
Pete Graner 3797fb
--- 579,583 ----
Pete Graner 3797fb
    c = first;
Pete Graner 3797fb
    memset (mb, 0, mlen);
Pete Graner 3797fb
!   for (i = 0; c >= 0 && i < mlen; i++)
Pete Graner 3797fb
      {
Pete Graner 3797fb
        mb[i] = (char)c;
Pete Graner 3797fb
*** ../bash-3.2-patched/lib/readline/isearch.c	Mon Dec 26 17:18:53 2005
Pete Graner 3797fb
--- lib/readline/isearch.c	Fri Mar  9 14:30:59 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 328,333 ****
Pete Graner 3797fb
  
Pete Graner 3797fb
    f = (rl_command_func_t *)NULL;
Pete Graner 3797fb
!  
Pete Graner 3797fb
!  /* Translate the keys we do something with to opcodes. */
Pete Graner 3797fb
    if (c >= 0 && _rl_keymap[c].type == ISFUNC)
Pete Graner 3797fb
      {
Pete Graner 3797fb
--- 328,340 ----
Pete Graner 3797fb
  
Pete Graner 3797fb
    f = (rl_command_func_t *)NULL;
Pete Graner 3797fb
! 
Pete Graner 3797fb
!   if (c < 0)
Pete Graner 3797fb
!     {
Pete Graner 3797fb
!       cxt->sflags |= SF_FAILED;
Pete Graner 3797fb
!       cxt->history_pos = cxt->last_found_line;
Pete Graner 3797fb
!       return -1;
Pete Graner 3797fb
!     }
Pete Graner 3797fb
! 
Pete Graner 3797fb
!   /* Translate the keys we do something with to opcodes. */
Pete Graner 3797fb
    if (c >= 0 && _rl_keymap[c].type == ISFUNC)
Pete Graner 3797fb
      {
Pete Graner 3797fb
*** ../bash-3.2-patched/lib/readline/misc.c	Mon Dec 26 17:20:46 2005
Pete Graner 3797fb
--- lib/readline/misc.c	Fri Mar  9 14:44:11 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 147,150 ****
Pete Graner 3797fb
--- 147,152 ----
Pete Graner 3797fb
  	  rl_clear_message ();
Pete Graner 3797fb
  	  RL_UNSETSTATE(RL_STATE_NUMERICARG);
Pete Graner 3797fb
+ 	  if (key < 0)
Pete Graner 3797fb
+ 	    return -1;
Pete Graner 3797fb
  	  return (_rl_dispatch (key, _rl_keymap));
Pete Graner 3797fb
  	}
Pete Graner 3797fb
*** ../bash-3.2-patched/lib/readline/readline.c	Wed Aug 16 15:00:36 2006
Pete Graner 3797fb
--- lib/readline/readline.c	Fri Mar  9 14:47:24 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 646,649 ****
Pete Graner 3797fb
--- 669,677 ----
Pete Graner 3797fb
      {
Pete Graner 3797fb
        nkey = _rl_subseq_getchar (cxt->okey);
Pete Graner 3797fb
+       if (nkey < 0)
Pete Graner 3797fb
+ 	{
Pete Graner 3797fb
+ 	  _rl_abort_internal ();
Pete Graner 3797fb
+ 	  return -1;
Pete Graner 3797fb
+ 	}
Pete Graner 3797fb
        r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg);
Pete Graner 3797fb
        cxt->flags |= KSEQ_DISPATCHED;
Pete Graner 3797fb
*** ../bash-3.2-patched/lib/readline/text.c	Fri Jul 28 11:55:27 2006
Pete Graner 3797fb
--- lib/readline/text.c	Sun Mar 25 13:41:38 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 858,861 ****
Pete Graner 3797fb
--- 864,870 ----
Pete Graner 3797fb
    RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
  
Pete Graner 3797fb
+   if (c < 0)
Pete Graner 3797fb
+     return -1;
Pete Graner 3797fb
+ 
Pete Graner 3797fb
  #if defined (HANDLE_SIGNALS)
Pete Graner 3797fb
    if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1521,1524 ****
Pete Graner 3797fb
--- 1530,1536 ----
Pete Graner 3797fb
    mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX);
Pete Graner 3797fb
  
Pete Graner 3797fb
+   if (mb_len <= 0)
Pete Graner 3797fb
+     return -1;
Pete Graner 3797fb
+ 
Pete Graner 3797fb
    if (count < 0)
Pete Graner 3797fb
      return (_rl_char_search_internal (-count, bdir, mbchar, mb_len));
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1537,1540 ****
Pete Graner 3797fb
--- 1549,1555 ----
Pete Graner 3797fb
    RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
  
Pete Graner 3797fb
+   if (c < 0)
Pete Graner 3797fb
+     return -1;
Pete Graner 3797fb
+ 
Pete Graner 3797fb
    if (count < 0)
Pete Graner 3797fb
      return (_rl_char_search_internal (-count, bdir, c));
Pete Graner 3797fb
*** ../bash-3.2-patched/lib/readline/vi_mode.c	Sat Jul 29 16:42:28 2006
Pete Graner 3797fb
--- lib/readline/vi_mode.c	Fri Mar  9 15:02:11 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 887,890 ****
Pete Graner 3797fb
--- 887,897 ----
Pete Graner 3797fb
    c = rl_read_key ();
Pete Graner 3797fb
    RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
+ 
Pete Graner 3797fb
+   if (c < 0)
Pete Graner 3797fb
+     {
Pete Graner 3797fb
+       *nextkey = 0;
Pete Graner 3797fb
+       return -1;
Pete Graner 3797fb
+     }
Pete Graner 3797fb
+ 
Pete Graner 3797fb
    *nextkey = c;
Pete Graner 3797fb
  
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 903,906 ****
Pete Graner 3797fb
--- 910,918 ----
Pete Graner 3797fb
  	  c = rl_read_key ();	/* real command */
Pete Graner 3797fb
  	  RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
+ 	  if (c < 0)
Pete Graner 3797fb
+ 	    {
Pete Graner 3797fb
+ 	      *nextkey = 0;
Pete Graner 3797fb
+ 	      return -1;
Pete Graner 3797fb
+ 	    }
Pete Graner 3797fb
  	  *nextkey = c;
Pete Graner 3797fb
  	}
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1225,1236 ****
Pete Graner 3797fb
       _rl_callback_generic_arg *data;
Pete Graner 3797fb
  {
Pete Graner 3797fb
  #if defined (HANDLE_MULTIBYTE)
Pete Graner 3797fb
!   _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
Pete Graner 3797fb
  #else
Pete Graner 3797fb
    RL_SETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
!   _rl_vi_last_search_char = rl_read_key ();
Pete Graner 3797fb
    RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
  #endif
Pete Graner 3797fb
  
Pete Graner 3797fb
    _rl_callback_func = 0;
Pete Graner 3797fb
    _rl_want_redisplay = 1;
Pete Graner 3797fb
--- 1243,1262 ----
Pete Graner 3797fb
       _rl_callback_generic_arg *data;
Pete Graner 3797fb
  {
Pete Graner 3797fb
+   int c;
Pete Graner 3797fb
  #if defined (HANDLE_MULTIBYTE)
Pete Graner 3797fb
!   c = _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
Pete Graner 3797fb
  #else
Pete Graner 3797fb
    RL_SETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
!   c = rl_read_key ();
Pete Graner 3797fb
    RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
  #endif
Pete Graner 3797fb
  
Pete Graner 3797fb
+   if (c <= 0)
Pete Graner 3797fb
+     return -1;
Pete Graner 3797fb
+ 
Pete Graner 3797fb
+ #if !defined (HANDLE_MULTIBYTE)
Pete Graner 3797fb
+   _rl_vi_last_search_char = c;
Pete Graner 3797fb
+ #endif
Pete Graner 3797fb
+ 
Pete Graner 3797fb
    _rl_callback_func = 0;
Pete Graner 3797fb
    _rl_want_redisplay = 1;
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1248,1251 ****
Pete Graner 3797fb
--- 1274,1278 ----
Pete Graner 3797fb
       int count, key;
Pete Graner 3797fb
  {
Pete Graner 3797fb
+   int c;
Pete Graner 3797fb
  #if defined (HANDLE_MULTIBYTE)
Pete Graner 3797fb
    static char *target;
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1294,1302 ****
Pete Graner 3797fb
  	{
Pete Graner 3797fb
  #if defined (HANDLE_MULTIBYTE)
Pete Graner 3797fb
! 	  _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
Pete Graner 3797fb
  #else
Pete Graner 3797fb
  	  RL_SETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
! 	  _rl_vi_last_search_char = rl_read_key ();
Pete Graner 3797fb
  	  RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
  #endif
Pete Graner 3797fb
  	}
Pete Graner 3797fb
--- 1321,1335 ----
Pete Graner 3797fb
  	{
Pete Graner 3797fb
  #if defined (HANDLE_MULTIBYTE)
Pete Graner 3797fb
! 	  c = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
Pete Graner 3797fb
! 	  if (c <= 0)
Pete Graner 3797fb
! 	    return -1;
Pete Graner 3797fb
! 	  _rl_vi_last_search_mblen = c;
Pete Graner 3797fb
  #else
Pete Graner 3797fb
  	  RL_SETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
! 	  c = rl_read_key ();
Pete Graner 3797fb
  	  RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
+ 	  if (c < 0)
Pete Graner 3797fb
+ 	    return -1;
Pete Graner 3797fb
+ 	  _rl_vi_last_search_char = c;
Pete Graner 3797fb
  #endif
Pete Graner 3797fb
  	}
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1468,1471 ****
Pete Graner 3797fb
--- 1501,1507 ----
Pete Graner 3797fb
    RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
  
Pete Graner 3797fb
+   if (c < 0)
Pete Graner 3797fb
+     return -1;
Pete Graner 3797fb
+ 
Pete Graner 3797fb
  #if defined (HANDLE_MULTIBYTE)
Pete Graner 3797fb
    if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1486,1489 ****
Pete Graner 3797fb
--- 1522,1528 ----
Pete Graner 3797fb
    _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
Pete Graner 3797fb
  
Pete Graner 3797fb
+   if (c < 0)
Pete Graner 3797fb
+     return -1;
Pete Graner 3797fb
+ 
Pete Graner 3797fb
    _rl_callback_func = 0;
Pete Graner 3797fb
    _rl_want_redisplay = 1;
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1517,1520 ****
Pete Graner 3797fb
--- 1556,1562 ----
Pete Graner 3797fb
      _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
Pete Graner 3797fb
  
Pete Graner 3797fb
+   if (c < 0)
Pete Graner 3797fb
+     return -1;
Pete Graner 3797fb
+ 
Pete Graner 3797fb
    return (_rl_vi_change_char (count, c, mb));
Pete Graner 3797fb
  }
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1651,1655 ****
Pete Graner 3797fb
    RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
  
Pete Graner 3797fb
!   if (ch < 'a' || ch > 'z')
Pete Graner 3797fb
      {
Pete Graner 3797fb
        rl_ding ();
Pete Graner 3797fb
--- 1693,1697 ----
Pete Graner 3797fb
    RL_UNSETSTATE(RL_STATE_MOREINPUT);
Pete Graner 3797fb
  
Pete Graner 3797fb
!   if (ch < 0 || ch < 'a' || ch > 'z')	/* make test against 0 explicit */
Pete Graner 3797fb
      {
Pete Graner 3797fb
        rl_ding ();
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1703,1707 ****
Pete Graner 3797fb
        return 0;
Pete Graner 3797fb
      }
Pete Graner 3797fb
!   else if (ch < 'a' || ch > 'z')
Pete Graner 3797fb
      {
Pete Graner 3797fb
        rl_ding ();
Pete Graner 3797fb
--- 1745,1749 ----
Pete Graner 3797fb
        return 0;
Pete Graner 3797fb
      }
Pete Graner 3797fb
!   else if (ch < 0 || ch < 'a' || ch > 'z')	/* make test against 0 explicit */
Pete Graner 3797fb
      {
Pete Graner 3797fb
        rl_ding ();
Pete Graner 3797fb
*** ../bash-3.2/patchlevel.h	Thu Apr 13 08:31:04 2006
Pete Graner 3797fb
--- patchlevel.h	Mon Oct 16 14:22:54 2006
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 26,30 ****
Pete Graner 3797fb
     looks for to find the patch level (for the sccs version string). */
Pete Graner 3797fb
  
Pete Graner 3797fb
! #define PATCHLEVEL 18
Pete Graner 3797fb
  
Pete Graner 3797fb
  #endif /* _PATCHLEVEL_H_ */
Pete Graner 3797fb
--- 26,30 ----
Pete Graner 3797fb
     looks for to find the patch level (for the sccs version string). */
Pete Graner 3797fb
  
Pete Graner 3797fb
! #define PATCHLEVEL 19
Pete Graner 3797fb
  
Pete Graner 3797fb
  #endif /* _PATCHLEVEL_H_ */