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