Dominique Pellé wrote:
> Bram Moolenaar wrote:
>
>> Dominique Pelle wrote:
....
>>> (2) In vim/src/undo.c I see at line 92:
>>>
>>> 91 /* See below: use malloc()/free() for memory management. */
>>> 92 #define U_USE_MALLOC 1
>>>
>>> Whether U_USE_MALLOC is defined or not selects different
>>> implementations of U_FREE_LINE and U_ALLOC_LINE.
>>>
>>> Is the implementation when U_USE_MALLOC is undefined
>>> still meant to be used? Or can it be removed?
>>>
>>> I'm asking because if I comment out the line #define U_USE_MALLOC 1
>>> at line undo.c:92, then Vim quickly crashes when using persistent-undo.
>>> In other words, persistent undo only works when U_USE_MALLOC is defined.
>>
>> Can you see why it crashes? Perhaps it allocates a block that is too
>> big?
>
> If I just recompile Vim with "#define U_USE_MALLOC 1" commented out
> (without any patch) as follows:
>
> /* See below: use malloc()/free() for memory management. */
> /*#define U_USE_MALLOC 1*/
>
> Then the following command is enough to make Vim crash:
>
> $ vim -u NONE --noplugin -c 'wundo! foo' -c 'rundo foo'
> Vim: Caught deadly signal SEGV
> Vim: Finished.
> Segmentation fault
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x081bf48c in u_free_line (ptr=0x8264f90 "", keep=0) at undo.c:2846
> 2846 if ((nextb = curbuf->b_mb_current->mb_next) != NULL
> (gdb) bt
> #0 0x081bf48c in u_free_line (ptr=0x8264f90 "", keep=0) at undo.c:2846
> #1 0x081bc5f0 in u_read_undo (name=0x8264e06 "foo",
> hash=0xbfffed9c
> "\343\260\304B\230\374\034\024\232\373\364\310\231o\271$'\256A\344d\233\223L\244\225\231\033xR\270U")
> at undo.c:1094
> #2 0x080afc34 in ex_rundo (eap=0xbfffedfc) at ex_docmd.c:8481
> #3 0x080a70dd in do_one_cmd (cmdlinep=0xbfffefb0, sourcing=1,
> cstack=0xbfffefb8, fgetline=0,
> cookie=0x0) at ex_docmd.c:2639
> #4 0x080a49b6 in do_cmdline (cmdline=0xbffff6a3 "rundo foo",
> getline=0, cookie=0x0, flags=11)
> at ex_docmd.c:1108
> #5 0x080a4070 in do_cmdline_cmd (cmd=0xbffff6a3 "rundo foo") at
> ex_docmd.c:714
> #6 0x080e935d in exe_commands (parmp=0xbffff364) at main.c:2750
> #7 0x080e6b3a in main (argc=8, argv=0xbffff4e4) at main.c:880
> (gdb) list
> 2841 if (curbuf->b_mb_current == NULL || mp < (minfo_T
> *)curbuf->b_mb_current)
> 2842 {
> 2843 curbuf->b_mb_current = curbuf->b_block_head.mb_next;
> 2844 curbuf->b_m_search = NULL;
> 2845 }
> 2846 if ((nextb = curbuf->b_mb_current->mb_next) != NULL
> 2847 && (minfo_T
> *)nextb < mp)
> 2848 {
> 2849 curbuf->b_mb_current = nextb;
> 2850 curbuf->b_m_search = NULL;
>
> (gdb) p curbuf
> $1 = (buf_T *) 0x8234dd0
> (gdb) p curbuf->b_mb_current
> $2 = (mblock_T *) 0x0
>
> So accessing curbuf->b_mb_current->mb_next dereferences NULL.
>
> I have not had time to look at how u_alloc_line() and u_free_line()
> work. Using vim_malloc() and vim_free() is certainly simpler. malloc()
> and free() are also quite optimized. So I don't see the need
> for a special implementation.
I now understand why vim-7.3a crashes when undefining line
#define U_USE_MALLOC 1 in "undo.c".
u_alloc_line() and u_free_line(), which are used when
U_USE_MALLOC is undefined, use buffers inside 'curbuf'.
All allocations make during in u_read_undo() gets freed
when calling "u_blockfree(curbuf);".
Attached patch makes it work I think (I did not test in details)
by calling u_blockfree(curbuf) earlier (before any call to U_ALLOC_LINE())
in u_read_undo().
However, I DON'T THINK IT'S A GOOD IDEA TO APPLY THIS PATCH
anyway since if an error happens while loading the persistent undo file,
the current undo information would be lost!
It's best and a lot simpler to just remove all code in
#define U_USE_MALLOC which is not currently used anyway
and no longer valid.
Regards
-- Dominique
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php