Dominique Pelle wrote:

> Valgrind memory checker finds a memory leak in Vim-7.2.15.
> The steps to reproduce are a bit too messy to describe here
> and I have not been able to find a simple way to reproduce it.
> However I can reproduce it 100% of the time:

Perhaps this happens when undo is disabled?

> ==1182== 150 bytes in 2 blocks are definitely lost in loss record 24 of 34
> ==1182==    at 0x4C21FEB: malloc (vg_replace_malloc.c:207)
> ==1182==    by 0x4D6927: lalloc (misc2.c:859)
> ==1182==    by 0x4D689A: alloc_check (misc2.c:792)
> ==1182==    by 0x457EC4: do_sub (ex_cmds.c:4822)
> ==1182==    by 0x465561: do_one_cmd (ex_docmd.c:2621)
> ==1182==    by 0x462D41: do_cmdline (ex_docmd.c:1095)
> ==1182==    by 0x45FE46: ex_listdo (ex_cmds2.c:2374)
> ==1182==    by 0x465561: do_one_cmd (ex_docmd.c:2621)
> ==1182==    by 0x462D41: do_cmdline (ex_docmd.c:1095)
> ==1182==    by 0x4EE779: nv_colon (normal.c:5214)
> ==1182==    by 0x4E775D: normal_cmd (normal.c:1181)
> ==1182==    by 0x4A79EF: main_loop (main.c:1179)
> ==1182==    by 0x4A7535: main (main.c:938)
> 
> 
> I see at least 2 'break' statements that would cause such
> a leak at lines 4994 and line 5007 in ex_cmds.c:
> 
>  4979                     if (new_start != NULL)
>  4980                     {
>  4981                         /*
>  4982                          * Copy the rest of the line, that didn't match.
>  4983                          * "matchcol" has to be adjusted, we use
> the end of
>  4984                          * the line as reference, because the
> substitute m>
>  4985                          * have changed the number of
> characters.  Same for
>  4986                          * "prev_matchcol".
>  4987                          */
>  4988                         STRCAT(new_start, sub_firstline + copycol);
>  4989                         matchcol =
> (colnr_T)STRLEN(sub_firstline) - matchc>
>  4990                         prev_matchcol = (colnr_T)STRLEN(sub_firstline)
>  4991                                                               -
> prev_match>
>  4992
>  4993                         if (u_savesub(lnum) != OK)
> !4994                             break;
>  4995                         ml_replace(lnum, new_start, TRUE);
>  4996
>  4997                         if (nmatch_tl > 0)
>  4998                         {
>  4999                             /*
>  5000                              * Matched lines have now been
> substituted and>
>  5001                              * useless, delete them.  The part
> after the m>
>  5002                              * has been appended to new_start,
> we don't ne>
>  5003                              * it in the buffer.
>  5004                              */
>  5005                             ++lnum;
>  5006                             if (u_savedel(lnum, nmatch_tl) != OK)
> !5007                                 break;
> 
> Attached patch fixes it.

Thanks.  I'll include it.

-- 
The real
trick is
this: to
keep the
lines as
short as
possible
and keep
the size
the same
yet free
from the
need for
hyphena-
Dammit!!  (Matthew Winn)

 /// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui