BASH PATCH REPORT ================= Bash-Release: 3.2 Patch-ID: bash32-019 Bug-Reported-by: Thomas Loeber 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_ */