Dominique Pelle wrote:
> Hi, Valgrind memory checker finds the following bug in
> Vim-7.2.b.4 BETA. It's not a new issue, since it
> also happens at least in Vim-7.1.214 for example:
>
> ==17908== Conditional jump or move depends on uninitialised value(s)
> ==17908== at 0x578E51: get_tags (tag.c:3823)
> ==17908== by 0x4467DB: f_taglist (eval.c:16953)
> ==17908== by 0x43A0C7: call_func (eval.c:8023)
> ==17908== by 0x439BE8: get_func_tv (eval.c:7841)
> ==17908== by 0x435C81: eval7 (eval.c:4979)
> ==17908== by 0x43555D: eval6 (eval.c:4646)
> ==17908== by 0x435153: eval5 (eval.c:4462)
> ==17908== by 0x4346D7: eval4 (eval.c:4157)
> ==17908== by 0x43453C: eval3 (eval.c:4069)
> ==17908== by 0x4343C4: eval2 (eval.c:3998)
> ==17908== by 0x434205: eval1 (eval.c:3923)
> ==17908== by 0x434172: eval0 (eval.c:3880)
> ==17908== by 0x43049E: ex_let (eval.c:1794)
> ==17908== by 0x46525D: do_one_cmd (ex_docmd.c:2621)
> ==17908== by 0x462A3D: do_cmdline (ex_docmd.c:1095)
>
>
> I observe the bug when typing 'this->' with C++ code
> with the "omnicppcomplete.txt" plugin (which triggers
> tag search and displays the pum). I does not happen
> with all C++ source codes, and I don't know what
> triggers it yet, but I have a 100% reproducible case.
>
> Looking at the code, the bug is quite clear:
>
> tag.c:
>
> 3822 for (p = tp.command_end + 3;
> ! 3823 *p != NUL && *p != '\n' && *p != '\r'; ++p)
> 3824 {
> 3825 if (...)
> ....
> .... snip
> ....
> 3832 else if (!vim_iswhite(*p))
> 3833 {
> 3834 char_u *s, *n;
> 3835 int len;
> 3836
> 3837 /* Add extra field as a dict entry. Fields are
> 3838 * separated by Tabs. */
> 3839 n = p;
> ! 3840 while (*p != NUL && *p >= ' ' && *p < 127 && *p != ':')
> 3841 ++p;
> 3842 len = (int)(p - n);
> 3843 if (*p == ':' && len > 0)
> 3844 {
> 3845 s = ++p;
> ! 3846 while (*p != NUL && *p >= ' ')
> 3847 ++p;
> 3848 n[len] = NUL;
> 3849 if (add_tag_field(dict, (char *)n, s, p) == FAIL)
> 3850 ret = FAIL;
> 3851 n[len] = ':';
> 3852 }
> 3853 else
> 3854 /* Skip field without colon. */
> ! 3855 while (*p != NUL && *p >= ' ')
> 3856 ++p;
> 3857 }
> 3858 }
>
> The bug happens if 'while' loop at lines 3840 (or at line 3846 or
> line 3855) ends when reaching end of string (*p == NUL). In that case,
> 'for' loop at line 3823 will:
> - first do '++p' which will go one character beyond end of string, since
> p was already at end of string)
> - and then it will check condition '*p != NUL', hence accessing beyond
> end of string, where memory not initialized.
> After that, loop may continue to access several other characters
> beyond end of string (depending on bytes values beyond EOS).
>
> The attach patch fixes it.
Thanks, I'll include it.
--
hundred-and-one symptoms of being an internet addict:
261. You find diskettes in your pockets when doing laundry.
/// 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
-~----------~----~----~----~------~----~------~--~---