Dominique Pelle wrote:

> Valgrind memory checker finds the following bug in cscope
> feature of vim. I am using vim-7.1 (patches 1-82) on Linux x86.
> 
> ==8606== Invalid write of size 1
> ==8606==    at 0x80D17C0: cs_fgets (if_cscope.c:267)
> ==8606==    by 0x818F1E6: find_tags (tag.c:1670)
> ==8606==    by 0x818D0F4: do_tag (tag.c:548)
> ==8606==    by 0x80D2E88: cs_find_common (if_cscope.c:1163)
> ==8606==    by 0x80D28FF: cs_find (if_cscope.c:975)
> ==8606==    by 0x80D14A2: do_cscope_general (if_cscope.c:135)
> ==8606==    by 0x80D14D1: do_cscope (if_cscope.c:150)
> ==8606==    by 0x809A1FB: do_one_cmd (ex_docmd.c:2622)
> ==8606==    by 0x8097B18: do_cmdline (ex_docmd.c:1100)
> ==8606==    by 0x8114018: nv_colon (normal.c:5168)
> ==8606==    by 0x810E16F: normal_cmd (normal.c:1141)
> ==8606==    by 0x80D59F5: main_loop (main.c:1180)
> ==8606==    by 0x80D5609: main (main.c:939)
> ==8606==  Address 0x7D81D50 is 0 bytes after a block of size 512 alloc'd
> ==8606==    at 0x4021620: malloc (vg_replace_malloc.c:149)
> ==8606==    by 0x8100354: lalloc (misc2.c:857)
> ==8606==    by 0x810027E: alloc (misc2.c:756)
> ==8606==    by 0x818E9B5: find_tags (tag.c:1393)
> ==8606==    by 0x818D0F4: do_tag (tag.c:548)
> ==8606==    by 0x80D2E88: cs_find_common (if_cscope.c:1163)
> ==8606==    by 0x80D28FF: cs_find (if_cscope.c:975)
> ==8606==    by 0x80D14A2: do_cscope_general (if_cscope.c:135)
> ==8606==    by 0x80D14D1: do_cscope (if_cscope.c:150)
> ==8606==    by 0x809A1FB: do_one_cmd (ex_docmd.c:2622)
> ==8606==    by 0x8097B18: do_cmdline (ex_docmd.c:1100)
> ==8606==    by 0x8114018: nv_colon (normal.c:5168)
> ==8606==    by 0x810E16F: normal_cmd (normal.c:1141)
> ==8606==    by 0x80D59F5: main_loop (main.c:1180)
> ==8606==    by 0x80D5609: main (main.c:939)
> 
> 
> I can reproduce the bug by creating a cscope database
> of vim source tree, then by performing the following search
> in vim: ":cs find e e".
> 
> The code in if_cscope.c is:
> 
>  254     int
>  255 cs_fgets(buf, size)
>  256     char_u      *buf;
>  257     int         size;
>  258 {
>  259     char *p;
>  260
>  261     if ((p = cs_manage_matches(NULL, NULL, -1, Get)) == NULL)
>  262         return TRUE;
>  263
>  264     if ((int)strlen(p) > size)
>  265     {
>  266         strncpy((char *)buf, p, size - 1);
>  267         buf[size] = '\0';
>  268     }
>  269     else
>  270         (void)strcpy((char *)buf, p);
>  271
>  272     return FALSE;
>  273 } /* cs_fgets */
> 
> 
> cs_fgets() is called from tag.c:1670 with size parameter
> equal to LSIZE (512).  Line 267 thus writes '\0' in buf[512].
> But buf buffer was allocated with 512 bytes (LSIZE) so
> line 267 writes 1 byte beyond allocated size.
> 
> Following patch fixes it and also simplifies code:

Thanks for the patch.  Good to see you found vim_strncpy(), it was made
for this.

-- 
hundred-and-one symptoms of being an internet addict:
208. Your goals for the future are obtaining an T1 connection and
     a 130 gig hard drive.

 /// 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