суббота, 8 сентября 2012 г., 17:00:45 UTC+4 пользователь Bram Moolenaar написал:
> It might be easier to use vim_strncpy().  And vim_strcat() where
> appropriate.  These always add a NUL and check the size of the buffer.

It is not needed: the following fixes garbage without using alloc_clear:

# HG changeset patch
# User ZyX <[email protected]>
# Date 1348347789 -14400
# Node ID 4c1027d39c5857cfc87a1916785f2f73ad012399
# Parent  04592728474a35794ae6397a0b90f2989864fb66
Fix crash with long filenames, without alloc_clear

diff -r 04592728474a -r 4c1027d39c58 src/buffer.c
--- a/src/buffer.c      Fri Sep 21 14:54:05 2012 +0200
+++ b/src/buffer.c      Sun Sep 23 01:02:44 2012 +0400
@@ -3047,6 +3047,7 @@
     buffer = alloc(IOSIZE);
     if (buffer == NULL)
        return;
+    buffer[IOSIZE] = NUL;
 
     if (fullname > 1)      /* 2 CTRL-G: include buffer number */
     {
@@ -3058,7 +3059,7 @@
 
     *p++ = '"';
     if (buf_spname(curbuf) != NULL)
-       STRCPY(p, buf_spname(curbuf));
+       STRNCPY(p, buf_spname(curbuf), IOSIZE - (p-buffer) - 1);
     else
     {
        if (!fullname && curbuf->b_fname != NULL)

-- 
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
*** /tmp/extdiff.yZireA/vim.04592728474a/src/buffer.c	2012-09-23 01:05:27.000000000 +0400
--- vim.4c1027d39c58/src/buffer.c	2012-09-23 01:05:27.000000000 +0400
***************
*** 3047,3052 ****
--- 3047,3053 ----
      buffer = alloc(IOSIZE);
      if (buffer == NULL)
  	return;
+     buffer[IOSIZE] = NUL;
  
      if (fullname > 1)	    /* 2 CTRL-G: include buffer number */
      {
***************
*** 3058,3064 ****
  
      *p++ = '"';
      if (buf_spname(curbuf) != NULL)
! 	STRCPY(p, buf_spname(curbuf));
      else
      {
  	if (!fullname && curbuf->b_fname != NULL)
--- 3059,3065 ----
  
      *p++ = '"';
      if (buf_spname(curbuf) != NULL)
! 	STRNCPY(p, buf_spname(curbuf), IOSIZE - (p-buffer) - 1);
      else
      {
  	if (!fullname && curbuf->b_fname != NULL)

Raspunde prin e-mail lui