2004-01-27 Elena Zannoni <ezannoni@redhat.com>
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>
Tue, 27 Jan 2004 22:25:15 +0000 (22:25 +0000)
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>
Tue, 27 Jan 2004 22:25:15 +0000 (22:25 +0000)
        Merge in official patches to readline-4.3 from
ftp://ftp.cwru.edu/pub/bash/readline-4.3-patches:
NOTE: Patch-ID readline-43-004 was already applied (see below).

* bind.c (rl_generic_bind): Pressing certain key sequences
causes an infinite loop in _rl_dispatch_subseq with the `key' argument
set to 256.  This eventually causes bash to exceed the stack size
limit and crash with a segmentation violation.
Patch-ID: readline43-001.

* readline.c (_rl_dispatch_subseq): Repeating an edit in
vi-mode with `.' does not work.
Patch-ID: readline43-002.

* mbutil.c (_rl_get_char_len, _rl_compare_chars,
_rl_adjust_point): When in a locale with multibyte characters, the
readline display updater will occasionally cause a
segmentation fault when attempting to compute the length of the first
multibyte character on the line.
Patch-ID: readline43-003.

* vi_mode.c (_rl_vi_change_mbchar_case): Using the vi editing
mode's case-changing commands in a locale with multibyte characters
will cause garbage characters to be inserted into the editing buffer.
Patch-ID: readline43-005.

readline/ChangeLog.gdb
readline/bind.c
readline/mbutil.c
readline/readline.c
readline/vi_mode.c

index 830822aeeee8906908b629a730466305d6527b4f..5e90d29496c63a48056739cf2d1abbfc01e08a7e 100644 (file)
@@ -1,3 +1,31 @@
+2004-01-27  Elena Zannoni  <ezannoni@redhat.com>
+
+        Merge in official patches to readline-4.3 from
+       ftp://ftp.cwru.edu/pub/bash/readline-4.3-patches:
+       NOTE: Patch-ID readline-43-004 was already applied (see below).
+
+       * bind.c (rl_generic_bind): Pressing certain key sequences
+       causes an infinite loop in _rl_dispatch_subseq with the `key' argument
+       set to 256.  This eventually causes bash to exceed the stack size
+       limit and crash with a segmentation violation.
+       Patch-ID: readline43-001.
+
+       * readline.c (_rl_dispatch_subseq): Repeating an edit in
+       vi-mode with `.' does not work.
+       Patch-ID: readline43-002.
+
+       * mbutil.c (_rl_get_char_len, _rl_compare_chars,
+       _rl_adjust_point): When in a locale with multibyte characters, the
+       readline display updater will occasionally cause a
+       segmentation fault when attempting to compute the length of the first
+       multibyte character on the line.  
+       Patch-ID: readline43-003.
+
+       * vi_mode.c (_rl_vi_change_mbchar_case): Using the vi editing
+       mode's case-changing commands in a locale with multibyte characters
+       will cause garbage characters to be inserted into the editing buffer.
+       Patch-ID: readline43-005.
+
 2003-12-28  Eli Zaretskii  <eliz@elta.co.il>
 
        * readline.c (rl_save_state, rl_restore_state): Support systems
 2003-01-09  Michael Chastain  <mec@shout.net>
 
        From Chet Ramey, <chet@po.cwru.edu>, the readline maintainer:
+       ftp://ftp.cwru.edu/pub/bash/readline-4.3-patches/readline43-004
+
        * display.c: Fix perverse screen refresh with UTF-8.
+       When running in a locale with multibyte characters, the
+       readline display updater will use carriage returns when
+       drawing the line, overwriting any partial output already on
+       the screen and not terminated by a newline.
+       Patch-ID: readline43-004
 
 2003-01-08  Chris Demetriou  <cgd@broadcom.com>
 
index 65ef401e207b34eb2405c52b097e11c9a6f2cc3c..7103888148264b18f9c5ba14fae28512e0f7a74e 100644 (file)
@@ -311,7 +311,7 @@ rl_generic_bind (type, keyseq, data, map)
             mapped to something, `abc' to be mapped to something else,
             and the function bound  to `a' to be executed when the user
             types `abx', leaving `bx' in the input queue. */
-         if (k.function /* && k.type == ISFUNC */)
+         if (k.function && ((k.type == ISFUNC && k.function != rl_do_lowercase_version) || k.type == ISMACR))
            {
              map[ANYOTHERKEY] = k;
              k.function = 0;
index 50302f01badb11c060663c7aa9de80a8501c3955..8794d02ddcaaf22673c7aa6930656b4a856674ed 100644 (file)
@@ -205,14 +205,16 @@ _rl_get_char_len (src, ps)
   if (tmp == (size_t)(-2))
     {
       /* shorted to compose multibyte char */
-      memset (ps, 0, sizeof(mbstate_t));
+      if (ps)
+       memset (ps, 0, sizeof(mbstate_t));
       return -2;
     }
   else if (tmp == (size_t)(-1))
     {
       /* invalid to compose multibyte char */
       /* initialize the conversion state */
-      memset (ps, 0, sizeof(mbstate_t));
+      if (ps)
+       memset (ps, 0, sizeof(mbstate_t));
       return -1;
     }
   else if (tmp == (size_t)0)
@@ -225,9 +227,12 @@ _rl_get_char_len (src, ps)
    return 1. Otherwise return 0. */
 int
 _rl_compare_chars (buf1, pos1, ps1, buf2, pos2, ps2)
-     char *buf1, *buf2;
-     mbstate_t *ps1, *ps2;
-     int pos1, pos2;
+     char *buf1;
+     int pos1;
+     mbstate_t *ps1;
+     char *buf2;
+     int pos2;
+     mbstate_t *ps2;
 {
   int i, w1, w2;
 
@@ -276,8 +281,11 @@ _rl_adjust_point(string, point, ps)
          pos++;
          /* clear the state of the byte sequence, because
             in this case effect of mbstate is undefined  */
-         memset (ps, 0, sizeof (mbstate_t));
+         if (ps)
+           memset (ps, 0, sizeof (mbstate_t));
        }
+      else if (tmp == 0)
+       pos++;
       else
        pos += tmp;
     }
index efa0bf84c27952eba69c34b80ae3a731b5fe5e32..aed0235bf3f1dc745bc533793e497a6c03250c06 100644 (file)
@@ -684,6 +684,7 @@ _rl_dispatch_subseq (key, map, got_subseq)
     }
 #if defined (VI_MODE)
   if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
+      key != ANYOTHERKEY &&
       _rl_vi_textmod_command (key))
     _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
 #endif
index 5d146b3f705604d4668f85c722a2387d31a0b7ac..89303644c59244eb69cff6f271f140fb74757f92 100644 (file)
@@ -680,7 +680,8 @@ _rl_vi_change_mbchar_case (count)
      int count;
 {
   wchar_t wc;
-  char mb[MB_LEN_MAX];
+  char mb[MB_LEN_MAX+1];
+  int mblen;
   mbstate_t ps;
 
   memset (&ps, 0, sizeof (mbstate_t));
@@ -703,7 +704,9 @@ _rl_vi_change_mbchar_case (count)
       /* Vi is kind of strange here. */
       if (wc)
        {
-         wctomb (mb, wc);
+         mblen = wctomb (mb, wc);
+         if (mblen >= 0)
+           mb[mblen] = '\0';
          rl_begin_undo_group ();
          rl_delete (1, 0);
          rl_insert_text (mb);