Hi
I can reproduce a crash (double free) using latest Vim-7.2.209
when built with -DEXITFREE:
*** glibc detected *** ./vim: corrupted double-linked list: 0x096dd8b8 ***
======= Backtrace: =========
...snip...
Vim: Caught deadly signal ABRT0 08:04 2181505 /usr
Vim: Finished.
Vim: Double signal, exiting
Segmentation fault (core dumped)
Steps to reproduce the bug:
1/ build Vim with -DEXITFREE
i.e. uncomment PROFILE_CFLAGS = -DEXITFREE in src/Makefile
2/ start Vim with:
$ vim -u NONE -C
3/ execute the following Ex commands:
:set hidden
:e foo.txt
:e bar.txt
:syntax on
:q
5/ when exiting, notice the double free error:
$ ./vim -u .vimrc-test
*** glibc detected *** ./vim: corrupted double-linked list: 0x0947bf60 ***
...
Reproducing it with Valgrind memory checker, I see the following
error when exiting:
==16444== Invalid read of size 4
==16444== at 0x8162363: redraw_win_later (screen.c:197)
==16444== by 0x816235A: redraw_later (screen.c:189)
==16444== by 0x81C4CF7: clear_matches (window.c:6520)
==16444== by 0x81C1C98: win_free (window.c:4371)
==16444== by 0x81BF4F3: win_free_mem (window.c:2368)
==16444== by 0x81BF57F: win_free_all (window.c:2395)
==16444== by 0x811437B: free_all_mem (misc2.c:1093)
==16444== by 0x814B579: mch_exit (os_unix.c:3066)
==16444== by 0x80E6E44: getout (main.c:1347)
==16444== by 0x80ACA7F: ex_quit_all (ex_docmd.c:6338)
==16444== by 0x80A6B1B: do_one_cmd (ex_docmd.c:2620)
==16444== by 0x80A439B: do_cmdline (ex_docmd.c:1096)
==16444== by 0x812A67A: nv_colon (normal.c:5224)
==16444== by 0x8123D00: normal_cmd (normal.c:1188)
==16444== by 0x80E6B81: main_loop (main.c:1186)
==16444== by 0x80E66CE: main (main.c:942)
==16444== Address 0x4c690bc is 212 bytes inside a block of size 3,676 free'd
==16444== at 0x4024E5A: free (vg_replace_malloc.c:323)
==16444== by 0x8114D38: vim_free (misc2.c:1639)
==16444== by 0x81C1CF4: win_free (window.c:4391)
==16444== by 0x81BF4F3: win_free_mem (window.c:2368)
==16444== by 0x81BF550: win_free_all (window.c:2390)
==16444== by 0x811437B: free_all_mem (misc2.c:1093)
==16444== by 0x814B579: mch_exit (os_unix.c:3066)
==16444== by 0x80E6E44: getout (main.c:1347)
==16444== by 0x80ACA7F: ex_quit_all (ex_docmd.c:6338)
==16444== by 0x80A6B1B: do_one_cmd (ex_docmd.c:2620)
==16444== by 0x80A439B: do_cmdline (ex_docmd.c:1096)
==16444== by 0x812A67A: nv_colon (normal.c:5224)
==16444== by 0x8123D00: normal_cmd (normal.c:1188)
==16444== by 0x80E6B81: main_loop (main.c:1186)
==16444== by 0x80E66CE: main (main.c:942)
(and more errors follow)
window.c:
2389 while (firstwin != NULL)
!!2390 (void)win_free_mem(firstwin, &dummy, NULL);
2391
2392 # ifdef FEAT_AUTOCMD
2393 if (aucmd_win != NULL)
2394 {
!!2395 (void)win_free_mem(aucmd_win, &dummy, NULL);
2396 aucmd_win = NULL;
2397 }
Memory freed at line 2390 is used and freed again at line 2395.
If I print curwin, firstwin, aucmd_win before line 2389, I see:
*** curwin=0x8e3c358 firstwin=0x8e3c358 aucmd_win=0x8e5c2d0
Line window.c:2395 was introduced in patch 7.2.203:
============================================================================
Patch 7.2.203
Problem: When reloading a buffer or doing anything else with a buffer that
is not displayed in a visible window, autocommands may be applied
to the current window, folds messed up, etc.
Solution: Instead of using the current window for the hidden buffer use a
special window, splitting the current one temporarily.
Files: src/fileio.c, src/globals.h, src/gui.c, src/if_perl.xs,
src/proto/gui.pro, src/proto/window.pro, src/screen.c,
src/structs.h, src/window.c
============================================================================
I tried previous versions of Vim:
- Vim-7.2.202 ............. OK, no bug
- Vim-7.2.203 ............. could not test, tag v7-2-203 is missing in CVS?!?
- Vim-7.2.204 ............. double free crash
- Vim-7.2.209 (latest) .... double free crash
So bug was introduced in Vim-7.2.203.
Attached patch fixes it but deserves further testing and review.
Regards
-- Dominique
--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---
Index: window.c
===================================================================
RCS file: /cvsroot/vim/vim7/src/window.c,v
retrieving revision 1.78
diff -c -r1.78 window.c
*** window.c 16 Jun 2009 14:00:54 -0000 1.78
--- window.c 20 Jun 2009 06:00:08 -0000
***************
*** 2386,2394 ****
tabpage_close(TRUE);
# endif
- while (firstwin != NULL)
- (void)win_free_mem(firstwin, &dummy, NULL);
-
# ifdef FEAT_AUTOCMD
if (aucmd_win != NULL)
{
--- 2386,2391 ----
***************
*** 2396,2401 ****
--- 2393,2401 ----
aucmd_win = NULL;
}
# endif
+
+ while (firstwin != NULL)
+ (void)win_free_mem(firstwin, &dummy, NULL);
}
#endif