in certain conditions, vim was freezing on swap file prompt. One of our 
users tracked that bug down, and a patch is attached.

    look http://bugs.debian.org/292397

for more explanations !

Cheers,

----------  Message transmis  ----------

Subject: Bug#292397: vim freezes on swap file prompt
Date: Jeu 13 Avril 2006 13:55
From: Bas Zoetekouw <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Cc: [EMAIL PROTECTED]

package vim
tag 292397 + upstream
tag 292397 + patch
thansk

Hi!

I've done some more debugging on this problem, and it seems only a few
of the vim variants are affected.  Specifically, I can reprocude the
problem using vim.gnome, vim.python and vim.perl, but vim.basic,
vim.gtk, vim.tiny, vim.lesstif, vim.ruby, vi.tcl and vim.full work
 fine.

Also, I've build a version of vim.perl with -ggdb3, and can reproduce

the problem there.  GDB gives the following backtrace after the freeze:
 | (gdb) bt
 | #0  0xffffe410 in __kernel_vsyscall ()
 | #1  0xb77fed6d in ___newselect_nocancel () from
 | /lib/tls/i686/cmov/libc.so.6 #2  0x0815887b in RealWaitForChar
 | (fd=0, msec=100, check_for_gpm=0xbfcd399c) at os_unix.c:4743 #3 
 | 0x081585c1 in WaitForChar (msec=100) at os_unix.c:4445
 | #4  0x08154b75 in mch_inchar (buf=0xbfcd3a4a "", maxlen=46,
 | wtime=100, tb_change_cnt=0) at os_unix.c:328 #5  0x081b950f in
 | ui_inchar (buf=0xbfcd3a4a "", maxlen=46, wtime=100, tb_change_cnt=0)
 | at ui.c:189 #6  0x081185dd in get_keystroke () at misc1.c:3025
 | #7  0x08111f63 in do_dialog (type=2, title=0x81fb014 "VIM -
 | ATTENTION", message=0x82fa060 "Swap file \"/tmp//%tmp%test.swp\"
 | already exists!", buttons=0x81faf88 "&Open Read-Only\n&Edit
 | anyway\n&Recover\n&Quit\n&Abort", dfltbutton=1, textfield=0x0) at
 | message.c:3298 #8  0x0810971d in findswapname (buf=0x8234428,
 | dirp=0xbfcd404c, old_fname=0x0) at memline.c:4107 #9  0x081039a2 in
 | ml_open_file (buf=0x8234428) at memline.c:552 #10 0x08103ac4 in
 | check_need_swap (newfile=1) at memline.c:604 #11 0x080d27d0 in
 | readfile (fname=0x8235848 "/tmp/test", sfname=0x8235848 "/tmp/test",
 | from=0, lines_to_skip=0, lines_to_read=2147483647, eap=0x0, flags=1)
 | at fileio.c:642 #12 0x0806c4a2 in open_buffer (read_stdin=0,
 | eap=0x0) at buffer.c:130 #13 0x080f770a in create_windows
 | (parmp=0xbfcd43f0) at main.c:2378 #14 0x080f5589 in main (argc=2,
 | argv=0xbfcd4534) at main.c:794

If I set a breakpoint on line 3026 of misc1.c (just after the
ui_inchar() call), I can verify that indeed a special key code is
returned (i.e. the cursor I pressed).  Specifically, the key code
returned is 0x80 0x8a 0x95 ("\eku", which I guess means the uparrow).
However, this key is not handled at all:  in the FEAT_MBYTE ifdef on
line 3084, the "continue" is called, and the loop progresses to the
 next iteration, after which the key is never returned anymore by
get_keystroke().

So, the problem seems to be that the special sequences that are
generated by the cursor keys are mistaken for an incomplete multibyte
sequence; the check for such a special sequence is only done in
do_diaglog(), after get_keystroke() has returned.

The following patch solves this, and works fine here.  Please include
 it in the debian packages and also send it upstream.

--- vim/src/misc1.eerst 2006-04-13 13:45:37.000000000 +0200
+++ vim/src/misc1.c     2006-04-13 13:48:10.000000000 +0200
@@ -3082,7 +3082,9 @@
            }
        }
 #ifdef FEAT_MBYTE
-       if (has_mbyte)
+       /* if n<0, this is a special key (eg cursor) which should
+        * not be mistaken for an incomplete multibyte sequence */
+       if (has_mbyte && n>=0)
        {
            if (MB_BYTE2LEN(n) > len)
                continue;       /* more bytes to get */

Happy Vimming!

Bas.


PS: this was all tested using the 6.4+7.0c05-1 versions from
experimental.

--
Kind regards,
+--------------------------------------------------------------------+

| Bas Zoetekouw              | GPG key: 0644fab7                     |
|----------------------------| Fingerprint: c1f5 f24c d514 3fec 8bf6 |
| [EMAIL PROTECTED], [EMAIL PROTECTED] |              a2b1 2bae e41f 0644 fab7 |

+--------------------------------------------------------------------+

-------------------------------------------------------

-- 
·O·  Pierre Habouzit
··O                                                [EMAIL PROTECTED]
OOO                                                http://www.madism.org

Reply via email to