Author: matthew
Date: 2008-12-06 04:02:49 -0700 (Sat, 06 Dec 2008)
New Revision: 2015
Added:
trunk/readline/readline-5.2-fixes-6.patch
Log:
Add latest upstream Readline patches
Added: trunk/readline/readline-5.2-fixes-6.patch
===================================================================
--- trunk/readline/readline-5.2-fixes-6.patch (rev 0)
+++ trunk/readline/readline-5.2-fixes-6.patch 2008-12-06 11:02:49 UTC (rev
2015)
@@ -0,0 +1,681 @@
+Submitted By: Matt Burgess <matthew_at_linuxfromscratch_dot_org>
+Date: 2008-12-06
+Initial Package Version: 5.2
+Upstream Status: Already in upstream patch repo
+Origin: Upstream
+Description: This patch is upstream patch numbers 1 thru 13.
+
+diff -Naur readline-5.2.orig/complete.c readline-5.2/complete.c
+--- readline-5.2.orig/complete.c 2006-07-28 16:35:49.000000000 +0100
++++ readline-5.2/complete.c 2008-12-06 11:01:20.000000000 +0000
+@@ -428,7 +428,7 @@
+ return (1);
+ if (c == 'n' || c == 'N' || c == RUBOUT)
+ return (0);
+- if (c == ABORT_CHAR)
++ if (c == ABORT_CHAR || c < 0)
+ _rl_abort_internal ();
+ if (for_pager && (c == NEWLINE || c == RETURN))
+ return (2);
+diff -Naur readline-5.2.orig/display.c readline-5.2/display.c
+--- readline-5.2.orig/display.c 2006-09-14 19:20:12.000000000 +0100
++++ readline-5.2/display.c 2008-12-06 11:01:20.000000000 +0000
+@@ -391,14 +391,14 @@
+ t = ++p;
+ local_prompt = expand_prompt (p, &prompt_visible_length,
+ &prompt_last_invisible,
+- (int *)NULL,
++ &prompt_invis_chars_first_line,
+ &prompt_physical_chars);
+ c = *t; *t = '\0';
+ /* The portion of the prompt string up to and including the
+ final newline is now null-terminated. */
+ local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
+ (int *)NULL,
+-
&prompt_invis_chars_first_line,
++ (int *)NULL,
+ (int *)NULL);
+ *t = c;
+ local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
+@@ -561,6 +561,17 @@
+ wrap_offset = prompt_invis_chars_first_line = 0;
+ }
+
++#if defined (HANDLE_MULTIBYTE)
++#define CHECK_INV_LBREAKS() \
++ do { \
++ if (newlines >= (inv_lbsize - 2)) \
++ { \
++ inv_lbsize *= 2; \
++ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof
(int)); \
++ _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize *
sizeof (int)); \
++ } \
++ } while (0)
++#else
+ #define CHECK_INV_LBREAKS() \
+ do { \
+ if (newlines >= (inv_lbsize - 2)) \
+@@ -569,6 +580,7 @@
+ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof
(int)); \
+ } \
+ } while (0)
++#endif /* HANDLE_MULTIBYTE */
+
+ #if defined (HANDLE_MULTIBYTE)
+ #define CHECK_LPOS() \
+@@ -898,6 +910,10 @@
+ second and subsequent lines start at inv_lbreaks[N], offset by
+ OFFSET (which has already been calculated above). */
+
++#define INVIS_FIRST() (prompt_physical_chars > _rl_screenwidth ?
prompt_invis_chars_first_line : wrap_offset)
++#define WRAP_OFFSET(line, offset) ((line == 0) \
++ ? (offset ? INVIS_FIRST() : 0) \
++ : ((line == prompt_last_screen_line) ?
wrap_offset-prompt_invis_chars_first_line : 0))
+ #define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
+ #define VIS_LLEN(l) ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] -
vis_lbreaks[l]))
+ #define INV_LLEN(l) (inv_lbreaks[l+1] - inv_lbreaks[l])
+@@ -932,7 +948,13 @@
+ _rl_last_c_pos != o_cpos &&
+ _rl_last_c_pos > wrap_offset &&
+ o_cpos < prompt_last_invisible)
+- _rl_last_c_pos -= wrap_offset;
++ _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX
- was wrap_offset */
++ else if (linenum == prompt_last_screen_line &&
prompt_physical_chars > _rl_screenwidth &&
++ (MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
++ cpos_adjusted == 0 &&
++ _rl_last_c_pos != o_cpos &&
++ _rl_last_c_pos > (prompt_last_invisible -
_rl_screenwidth - prompt_invis_chars_first_line))
++ _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line);
+
+ /* If this is the line with the prompt, we might need to
+ compensate for invisible characters in the new line. Do
+@@ -1036,7 +1058,7 @@
+ tx = _rl_col_width (&visible_line[pos], 0, nleft) -
visible_wrap_offset;
+ else
+ tx = nleft;
+- if (_rl_last_c_pos > tx)
++ if (tx >= 0 && _rl_last_c_pos > tx)
+ {
+ _rl_backspace (_rl_last_c_pos - tx); /* XXX */
+ _rl_last_c_pos = tx;
+@@ -1192,7 +1214,7 @@
+ int current_line, omax, nmax, inv_botlin;
+ {
+ register char *ofd, *ols, *oe, *nfd, *nls, *ne;
+- int temp, lendiff, wsatend, od, nd;
++ int temp, lendiff, wsatend, od, nd, twidth, o_cpos;
+ int current_invis_chars;
+ int col_lendiff, col_temp;
+ #if defined (HANDLE_MULTIBYTE)
+@@ -1208,7 +1230,7 @@
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ temp = _rl_last_c_pos;
+ else
+- temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
++ temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset);
+ if (temp == _rl_screenwidth && _rl_term_autowrap &&
!_rl_horizontal_scroll_mode
+ && _rl_last_v_pos == current_line - 1)
+ {
+@@ -1453,6 +1475,8 @@
+ _rl_last_c_pos = lendiff;
+ }
+
++ o_cpos = _rl_last_c_pos;
++
+ /* When this function returns, _rl_last_c_pos is correct, and an absolute
+ cursor postion in multibyte mode, but a buffer index when not in a
+ multibyte locale. */
+@@ -1462,7 +1486,9 @@
+ /* We need to indicate that the cursor position is correct in the presence
of
+ invisible characters in the prompt string. Let's see if setting this
when
+ we make sure we're at the end of the drawn prompt string works. */
+- if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 &&
_rl_last_c_pos == prompt_physical_chars)
++ if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 &&
++ (_rl_last_c_pos > 0 || o_cpos > 0) &&
++ _rl_last_c_pos == prompt_physical_chars)
+ cpos_adjusted = 1;
+ #endif
+ #endif
+@@ -1506,11 +1532,31 @@
+ {
+ /* Non-zero if we're increasing the number of lines. */
+ int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin;
++ /* If col_lendiff is > 0, implying that the new string takes up more
++ screen real estate than the old, but lendiff is < 0, meaning that it
++ takes fewer bytes, we need to just output the characters starting
++ from the first difference. These will overwrite what is on the
++ display, so there's no reason to do a smart update. This can really
++ only happen in a multibyte environment. */
++ if (lendiff < 0)
++ {
++ _rl_output_some_chars (nfd, temp);
++ _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
++ /* If nfd begins before any invisible characters in the prompt,
++ adjust _rl_last_c_pos to account for wrap_offset and set
++ cpos_adjusted to let the caller know. */
++ if (current_line == 0 && wrap_offset && ((nfd - new) <=
prompt_last_invisible))
++ {
++ _rl_last_c_pos -= wrap_offset;
++ cpos_adjusted = 1;
++ }
++ return;
++ }
+ /* Sometimes it is cheaper to print the characters rather than
+ use the terminal's capabilities. If we're growing the number
+ of lines, make sure we actually cause the new line to wrap
+ around on auto-wrapping terminals. */
+- if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff ||
_rl_term_IC) && (!_rl_term_autowrap || !gl))
++ else if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff ||
_rl_term_IC) && (!_rl_term_autowrap || !gl))
+ {
+ /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and
+ _rl_horizontal_scroll_mode == 1, inserting the characters with
+@@ -1533,11 +1579,16 @@
+ }
+ else
+ {
+- /* We have horizontal scrolling and we are not inserting at
+- the end. We have invisible characters in this line. This
+- is a dumb update. */
+ _rl_output_some_chars (nfd, temp);
+ _rl_last_c_pos += col_temp;
++ /* If nfd begins before any invisible characters in the prompt,
++ adjust _rl_last_c_pos to account for wrap_offset and set
++ cpos_adjusted to let the caller know. */
++ if (current_line == 0 && wrap_offset && ((nfd - new) <=
prompt_last_invisible))
++ {
++ _rl_last_c_pos -= wrap_offset;
++ cpos_adjusted = 1;
++ }
+ return;
+ }
+ /* Copy (new) chars to screen from first diff to last match. */
+@@ -1545,15 +1596,15 @@
+ if ((temp - lendiff) > 0)
+ {
+ _rl_output_some_chars (nfd + lendiff, temp - lendiff);
+-#if 1
+ /* XXX -- this bears closer inspection. Fixes a redisplay bug
+ reported against bash-3.0-alpha by Andreas Schwab involving
+ multibyte characters and prompt strings with invisible
+ characters, but was previously disabled. */
+- _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0,
temp-col_lendiff);
+-#else
+- _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-lendiff);
+-#endif
++ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
++ twidth = _rl_col_width (nfd+lendiff, 0, temp-col_lendiff);
++ else
++ twidth = temp - lendiff;
++ _rl_last_c_pos += twidth;
+ }
+ }
+ else
+@@ -1586,8 +1637,22 @@
+ temp = nls - nfd;
+ if (temp > 0)
+ {
++ /* If nfd begins at the prompt, or before the invisible
++ characters in the prompt, we need to adjust _rl_last_c_pos
++ in a multibyte locale to account for the wrap offset and
++ set cpos_adjusted accordingly. */
+ _rl_output_some_chars (nfd, temp);
+- _rl_last_c_pos += _rl_col_width (nfd, 0, temp);;
++ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
++ {
++ _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
++ if (current_line == 0 && wrap_offset && ((nfd - new) <=
prompt_last_invisible))
++ {
++ _rl_last_c_pos -= wrap_offset;
++ cpos_adjusted = 1;
++ }
++ }
++ else
++ _rl_last_c_pos += temp;
+ }
+ }
+ /* Otherwise, print over the existing material. */
+@@ -1595,8 +1660,20 @@
+ {
+ if (temp > 0)
+ {
++ /* If nfd begins at the prompt, or before the invisible
++ characters in the prompt, we need to adjust _rl_last_c_pos
++ in a multibyte locale to account for the wrap offset and
++ set cpos_adjusted accordingly. */
+ _rl_output_some_chars (nfd, temp);
+ _rl_last_c_pos += col_temp; /* XXX */
++ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
++ {
++ if (current_line == 0 && wrap_offset && ((nfd - new) <=
prompt_last_invisible))
++ {
++ _rl_last_c_pos -= wrap_offset;
++ cpos_adjusted = 1;
++ }
++ }
+ }
+ lendiff = (oe - old) - (ne - new);
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+@@ -1721,7 +1798,7 @@
+ int woff; /* number of invisible chars on current line */
+ int cpos, dpos; /* current and desired cursor positions */
+
+- woff = W_OFFSET (_rl_last_v_pos, wrap_offset);
++ woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
+ cpos = _rl_last_c_pos;
+ #if defined (HANDLE_MULTIBYTE)
+ /* If we have multibyte characters, NEW is indexed by the buffer point in
+@@ -1732,7 +1809,14 @@
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ dpos = _rl_col_width (data, 0, new);
+- if (dpos > prompt_last_invisible) /* XXX - don't use woff
here */
++ /* Use NEW when comparing against the last invisible character in the
++ prompt string, since they're both buffer indices and DPOS is a
++ desired display position. */
++ if ((new > prompt_last_invisible) || /* XXX - don't use woff
here */
++ (prompt_physical_chars > _rl_screenwidth &&
++ _rl_last_v_pos == prompt_last_screen_line &&
++ wrap_offset != woff &&
++ new > (prompt_last_invisible-_rl_screenwidth-wrap_offset)))
+ {
+ dpos -= woff;
+ /* Since this will be assigned to _rl_last_c_pos at the end (more
+@@ -2380,6 +2464,8 @@
+
+ if (end <= start)
+ return 0;
++ if (MB_CUR_MAX == 1 || rl_byte_oriented)
++ return (end - start);
+
+ memset (&ps, 0, sizeof (mbstate_t));
+
+diff -Naur readline-5.2.orig/input.c readline-5.2/input.c
+--- readline-5.2.orig/input.c 2006-08-16 20:15:16.000000000 +0100
++++ readline-5.2/input.c 2008-12-06 11:01:20.000000000 +0000
+@@ -133,8 +133,11 @@
+ return (0);
+
+ *key = ibuffer[pop_index++];
+-
++#if 0
+ if (pop_index >= ibuffer_len)
++#else
++ if (pop_index > ibuffer_len)
++#endif
+ pop_index = 0;
+
+ return (1);
+@@ -151,7 +154,7 @@
+ {
+ pop_index--;
+ if (pop_index < 0)
+- pop_index = ibuffer_len - 1;
++ pop_index = ibuffer_len;
+ ibuffer[pop_index] = key;
+ return (1);
+ }
+@@ -250,7 +253,8 @@
+ while (chars_avail--)
+ {
+ k = (*rl_getc_function) (rl_instream);
+- rl_stuff_char (k);
++ if (rl_stuff_char (k) == 0)
++ break; /* some problem; no more room */
+ if (k == NEWLINE || k == RETURN)
+ break;
+ }
+@@ -373,7 +377,11 @@
+ RL_SETSTATE (RL_STATE_INPUTPENDING);
+ }
+ ibuffer[push_index++] = key;
++#if 0
+ if (push_index >= ibuffer_len)
++#else
++ if (push_index > ibuffer_len)
++#endif
+ push_index = 0;
+
+ return 1;
+@@ -513,20 +521,26 @@
+ char *mbchar;
+ int size;
+ {
+- int mb_len = 0;
++ int mb_len, c;
+ size_t mbchar_bytes_length;
+ wchar_t wc;
+ mbstate_t ps, ps_back;
+
+ 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);
+- mbchar[mb_len++] = rl_read_key ();
++ 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))
+ break; /* invalid byte sequence for the current locale */
+@@ -564,7 +578,7 @@
+
+ c = first;
+ memset (mb, 0, mlen);
+- for (i = 0; i < mlen; i++)
++ for (i = 0; c >= 0 && i < mlen; i++)
+ {
+ mb[i] = (char)c;
+ memset (&ps, 0, sizeof (mbstate_t));
+diff -Naur readline-5.2.orig/isearch.c readline-5.2/isearch.c
+--- readline-5.2.orig/isearch.c 2005-12-26 22:18:53.000000000 +0000
++++ readline-5.2/isearch.c 2008-12-06 11:01:20.000000000 +0000
+@@ -327,8 +327,15 @@
+ rl_command_func_t *f;
+
+ f = (rl_command_func_t *)NULL;
+-
+- /* Translate the keys we do something with to opcodes. */
++
++ 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)
+ {
+ f = _rl_keymap[c].function;
+diff -Naur readline-5.2.orig/misc.c readline-5.2/misc.c
+--- readline-5.2.orig/misc.c 2005-12-26 22:20:46.000000000 +0000
++++ readline-5.2/misc.c 2008-12-06 11:01:20.000000000 +0000
+@@ -146,6 +146,8 @@
+ rl_restore_prompt ();
+ rl_clear_message ();
+ RL_UNSETSTATE(RL_STATE_NUMERICARG);
++ if (key < 0)
++ return -1;
+ return (_rl_dispatch (key, _rl_keymap));
+ }
+ }
+diff -Naur readline-5.2.orig/readline.c readline-5.2/readline.c
+--- readline-5.2.orig/readline.c 2006-08-16 20:00:36.000000000 +0100
++++ readline-5.2/readline.c 2008-12-06 11:01:20.000000000 +0000
+@@ -645,6 +645,11 @@
+ if ((cxt->flags & KSEQ_DISPATCHED) == 0)
+ {
+ 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;
+ }
+diff -Naur readline-5.2.orig/support/shobj-conf readline-5.2/support/shobj-conf
+--- readline-5.2.orig/support/shobj-conf 2006-04-11 14:15:43.000000000
+0100
++++ readline-5.2/support/shobj-conf 2008-12-06 11:01:20.000000000 +0000
+@@ -10,7 +10,7 @@
+ # Chet Ramey
+ # [EMAIL PROTECTED]
+
+-# Copyright (C) 1996-2002 Free Software Foundation, Inc.
++# Copyright (C) 1996-2007 Free Software Foundation, Inc.
+ #
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+@@ -114,7 +114,7 @@
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+ ;;
+
+-freebsd2* | netbsd*)
++freebsd2*)
+ SHOBJ_CFLAGS=-fpic
+ SHOBJ_LD=ld
+ SHOBJ_LDFLAGS='-x -Bshareable'
+@@ -125,7 +125,7 @@
+
+ # FreeBSD-3.x ELF
+ freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*|dragonfly*)
+- SHOBJ_CFLAGS=-fpic
++ SHOBJ_CFLAGS=-fPIC
+ SHOBJ_LD='${CC}'
+
+ if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then
+@@ -142,7 +142,7 @@
+ ;;
+
+ # Darwin/MacOS X
+-darwin8*)
++darwin[89]*)
+ SHOBJ_STATUS=supported
+ SHLIB_STATUS=supported
+
+@@ -153,7 +153,7 @@
+ SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)'
+ SHLIB_LIBSUFF='dylib'
+
+- SHOBJ_LDFLAGS='-undefined dynamic_lookup'
++ SHOBJ_LDFLAGS='-dynamiclib -dynamic -undefined dynamic_lookup
-arch_only `/usr/bin/arch`'
+ SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name
$(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR)
-compatibility_version $(SHLIB_MAJOR) -v'
+
+ SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1
+@@ -171,7 +171,7 @@
+ SHLIB_LIBSUFF='dylib'
+
+ case "${host_os}" in
+- darwin[78]*) SHOBJ_LDFLAGS=''
++ darwin[789]*) SHOBJ_LDFLAGS=''
+ SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch`
-install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR)
-compatibility_version $(SHLIB_MAJOR) -v'
+ ;;
+ *) SHOBJ_LDFLAGS='-dynamic'
+@@ -182,7 +182,7 @@
+ SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1
+ ;;
+
+-openbsd*)
++openbsd*|netbsd*)
+ SHOBJ_CFLAGS=-fPIC
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared'
+@@ -247,7 +247,7 @@
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+-aix4.[2-9]*-*gcc*) # lightly tested by [EMAIL PROTECTED]
++aix4.[2-9]*-*gcc*|aix[5-9].*-*gcc*) # lightly tested by [EMAIL
PROTECTED]
+ SHOBJ_CFLAGS=-fpic
+ SHOBJ_LD='ld'
+ SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall'
+@@ -258,7 +258,7 @@
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+-aix4.[2-9]*)
++aix4.[2-9]*|aix[5-9].*)
+ SHOBJ_CFLAGS=-K
+ SHOBJ_LD='ld'
+ SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall'
+@@ -329,7 +329,7 @@
+ SHOBJ_LD='${CC}'
+ # if you have problems linking here, moving the `-Wl,+h,$@' from
+ # SHLIB_XLDFLAGS to SHOBJ_LDFLAGS has been reported to work
+- SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s'
++ SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s'
+
+ SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)'
+ SHLIB_LIBSUFF='sl'
+diff -Naur readline-5.2.orig/text.c readline-5.2/text.c
+--- readline-5.2.orig/text.c 2006-07-28 16:55:27.000000000 +0100
++++ readline-5.2/text.c 2008-12-06 11:01:20.000000000 +0000
+@@ -857,6 +857,9 @@
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
++ if (c < 0)
++ return -1;
++
+ #if defined (HANDLE_SIGNALS)
+ if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
+ _rl_restore_tty_signals ();
+@@ -1520,6 +1523,9 @@
+
+ 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));
+ else
+@@ -1536,6 +1542,9 @@
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
++ if (c < 0)
++ return -1;
++
+ if (count < 0)
+ return (_rl_char_search_internal (-count, bdir, c));
+ else
+diff -Naur readline-5.2.orig/vi_mode.c readline-5.2/vi_mode.c
+--- readline-5.2.orig/vi_mode.c 2006-07-29 21:42:28.000000000 +0100
++++ readline-5.2/vi_mode.c 2008-12-06 11:01:20.000000000 +0000
+@@ -886,6 +886,13 @@
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
++
++ if (c < 0)
++ {
++ *nextkey = 0;
++ return -1;
++ }
++
+ *nextkey = c;
+
+ if (!member (c, vi_motion))
+@@ -902,6 +909,11 @@
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ c = rl_read_key (); /* real command */
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
++ if (c < 0)
++ {
++ *nextkey = 0;
++ return -1;
++ }
+ *nextkey = c;
+ }
+ else if (key == c && (key == 'd' || key == 'y' || key == 'c'))
+@@ -1224,14 +1236,22 @@
+ _rl_vi_callback_char_search (data)
+ _rl_callback_generic_arg *data;
+ {
++ int c;
+ #if defined (HANDLE_MULTIBYTE)
+- _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar,
MB_LEN_MAX);
++ c = _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 ();
++ 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;
+
+@@ -1247,6 +1267,7 @@
+ rl_vi_char_search (count, key)
+ int count, key;
+ {
++ int c;
+ #if defined (HANDLE_MULTIBYTE)
+ static char *target;
+ static int tlen;
+@@ -1293,11 +1314,17 @@
+ else
+ {
+ #if defined (HANDLE_MULTIBYTE)
+- _rl_vi_last_search_mblen = _rl_read_mbchar
(_rl_vi_last_search_mbchar, MB_LEN_MAX);
++ 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);
+- _rl_vi_last_search_char = rl_read_key ();
++ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
++ if (c < 0)
++ return -1;
++ _rl_vi_last_search_char = c;
+ #endif
+ }
+ }
+@@ -1467,6 +1494,9 @@
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
++ if (c < 0)
++ return -1;
++
+ #if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ c = _rl_read_mbstring (c, mb, mlen);
+@@ -1485,6 +1515,9 @@
+
+ _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;
+
+@@ -1516,6 +1549,9 @@
+ else
+ _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));
+ }
+
+@@ -1650,7 +1686,7 @@
+ ch = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+- if (ch < 'a' || ch > 'z')
++ if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */
+ {
+ rl_ding ();
+ return -1;
+@@ -1702,7 +1738,7 @@
+ rl_point = rl_mark;
+ return 0;
+ }
+- else if (ch < 'a' || ch > 'z')
++ else if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit
*/
+ {
+ rl_ding ();
+ return -1;
--
http://linuxfromscratch.org/mailman/listinfo/patches
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page