| BASH PATCH REPORT |
| ================= |
| |
| Bash-Release: 3.2 |
| Patch-ID: bash32-019 |
| |
| 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 bash'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: |
| |
| *** ../bash-3.2-patched/lib/readline/complete.c Fri Jul 28 11:35:49 2006 |
| --- lib/readline/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)) |
| *** ../bash-3.2-patched/lib/readline/input.c Wed Aug 16 15:15:16 2006 |
| --- lib/readline/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; |
| *** ../bash-3.2-patched/lib/readline/isearch.c Mon Dec 26 17:18:53 2005 |
| --- lib/readline/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) |
| { |
| *** ../bash-3.2-patched/lib/readline/misc.c Mon Dec 26 17:20:46 2005 |
| --- lib/readline/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)); |
| } |
| *** ../bash-3.2-patched/lib/readline/readline.c Wed Aug 16 15:00:36 2006 |
| --- lib/readline/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; |
| *** ../bash-3.2-patched/lib/readline/text.c Fri Jul 28 11:55:27 2006 |
| --- lib/readline/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)); |
| *** ../bash-3.2-patched/lib/readline/vi_mode.c Sat Jul 29 16:42:28 2006 |
| --- lib/readline/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 (); |
| *** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 |
| --- patchlevel.h Mon Oct 16 14:22:54 2006 |
| *************** |
| *** 26,30 **** |
| looks for to find the patch level (for the sccs version string). */ |
| |
| ! #define PATCHLEVEL 18 |
| |
| #endif /* _PATCHLEVEL_H_ */ |
| --- 26,30 ---- |
| looks for to find the patch level (for the sccs version string). */ |
| |
| ! #define PATCHLEVEL 19 |
| |
| #endif /* _PATCHLEVEL_H_ */ |