summaryrefslogtreecommitdiff
path: root/devel/readline/patches/patch-af
diff options
context:
space:
mode:
Diffstat (limited to 'devel/readline/patches/patch-af')
-rw-r--r--devel/readline/patches/patch-af124
1 files changed, 124 insertions, 0 deletions
diff --git a/devel/readline/patches/patch-af b/devel/readline/patches/patch-af
new file mode 100644
index 00000000000..cc33a10b9d2
--- /dev/null
+++ b/devel/readline/patches/patch-af
@@ -0,0 +1,124 @@
+$NetBSD: patch-af,v 1.4 2008/08/13 11:11:38 he Exp $
+
+3 patches from Debian rolled into one:
+
+http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00017.html
+
+Bug-Description:
+
+In some cases, code that is intended to be used in the presence of multibyte
+characters is called when no such characters are present, leading to incorrect
+display position calculations and incorrect redisplay.
+
+http://lists.gnu.org/archive/html/bug-readline/2007-01/msg00002.html
+
+Bug-Description:
+
+Readline neglects to reallocate the array it uses to keep track of wrapped
+screen lines when increasing its size. This will eventually result in
+segmentation faults when given sufficiently long input.
+
+http://lists.gnu.org/archive/html/bug-bash/2007-02/msg00054.html
+
+Bug-Description:
+
+When moving the cursor, bash sometimes misplaces the cursor when the prompt
+contains two or more multibyte characters. The particular circumstance that
+uncovered the problem was having the (multibyte) current directory name in
+the prompt string.
+
+
+--- display.c.orig 2006-09-14 20:20:12.000000000 +0200
++++ display.c
+@@ -561,14 +561,25 @@ rl_redisplay ()
+ 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
++ do { \
++ if (newlines >= (inv_lbsize - 2)) \
++ { \
++ inv_lbsize *= 2; \
++ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
+ } \
+ } while (0)
++#endif /* HANDLE_MULTIBYTE */
+
+ #if defined (HANDLE_MULTIBYTE)
+ #define CHECK_LPOS() \
+@@ -1586,8 +1597,22 @@ update_line (old, new, current_line, oma
+ 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 +1620,20 @@ update_line (old, new, current_line, oma
+ {
+ 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)
+@@ -1732,7 +1769,10 @@ _rl_move_cursor_relative (new, data)
+ 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 */
+ {
+ dpos -= woff;
+ /* Since this will be assigned to _rl_last_c_pos at the end (more
+@@ -2380,6 +2420,8 @@ _rl_col_width (str, start, end)
+
+ if (end <= start)
+ return 0;
++ if (MB_CUR_MAX == 1)
++ return end - start;
+
+ memset (&ps, 0, sizeof (mbstate_t));
+