Alexey Froloff wrote:

> /* My free translation of
>  * https://bugzilla.altlinux.org/show_bug.cgi?id=3D10911 */
> 
> i586-alt-linux-gcc (GCC) 4.1.1 20070105 (ALT Linux, build
> 4.1.1-alt11)
> glibc 2.5 (glibc-2_5-branch snapshot 20070112)
> 
> Vim built with CFLAGS containing -fstack-protector (turned on by
> default in gcc).
> 
> All Vim flavors dies when trying to execute example from ":help
> self":
> 
>         :function Mylen() dict
>         :   return len(self.data)
>         :endfunction
>         :let mydict =3D {'data': [0, 1, 2, 3], 'len': function("Mylen")}
>         :echo mydict.len()
> 
> #0  0x00002aaaacd333a5 in raise () from /lib64/libc.so.6
> #1  0x00002aaaacd34730 in abort () from /lib64/libc.so.6
> #2  0x00002aaaacd68ebb in __fsetlocking () from /lib64/libc.so.6
> #3  0x00002aaaacdd04ff in __chk_fail () from /lib64/libc.so.6
> #4  0x0000000000457a64 in call_func (name=3D0x857e90 "Mylen", len=3DVariabl=
> e "len" is not available.) at eval.c:19832
> #5  0x000000000045a8dc in get_func_tv (name=3D0x857e90 "Mylen", len=3D5, re=
> ttv=3D0x7fff452d7cd0, arg=3D0x7fff452d7ce8, firstline=3D494,=20
>     lastline=3D494, doesrange=3D0x7fff452d77fc, evaluate=3D1, selfdict=3D0x=
> 921410) at eval.c:7411
[...]
> 
> There's a compiler warning while building vim:
> 
> eval.c: In function 'call_func':
> eval.c:19832: warning: call to __builtin___strcpy_chk will always overflow
> destination buffer
> 
> Situation id: dictitem_T declared as:
> 
> /*
>  * Structure to hold an item of a Dictionary.
>  * Also used for a variable.
>  * The key is copied into "di_key" to avoid an extra alloc/free for it.
>  */
> struct dictitem_S
> {
>     typval_T  di_tv;          /* type and value of the variable */
>     char_u    di_flags;       /* flags (only used for variable) */
>     char_u    di_key[1];      /* key (actually longer!) */
> };
> 
> typedef struct dictitem_S dictitem_T;
> 
> eval.c:call_user_func() have code:
> 
>     funccall_T        fc;
>     dictitem_T        *v;
>     char_u    *name;
> ...
>       /* Set l:self to "selfdict".  Use "name" to avoid a warning from
>        * some compiler that checks the destination size. */
>       v = &fc.fixvar[fixvar_idx++].var;
>       name = v->di_key;
>       STRCPY(name, "self");
> 
> Using "name" can't help to hide copying to di_key, which is one
> element char array.  funccall_S is declared as:
> 
> struct funccall_S
> {
> ...
>     struct                    /* fixed variables for arguments */
>     {
>       dictitem_T      var;            /* variable (without room for name) */
>       char_u  room[VAR_SHORT_LEN];    /* room for the name */
>     } fixvar[FIXVAR_CNT];
> ...
> };
> 
> So var.di_name will be always overflowed, filling "room".

Which is OK.  The compiler is whining.

> OpenSUSE, which also have -fstack-protector turned on by default,
> is using attached patch...
> 
> -- 
> Regards,
> Sir Raorn.
> 
> --wzJLGUyc3ArbnUjN
> Content-Type: text/plain; charset=us-ascii
> Content-Disposition: attachment; filename="vim-7.0-flex-array.diff"
> Content-Transfer-Encoding: quoted-printable
> 
> --- src/structs.h.sav 2007-02-02 11:31:05.000000000 +0100
> +++ src/structs.h     2007-02-02 11:31:14.000000000 +0100
> @@ -1082,7 +1082,7 @@
>  {
>      typval_T di_tv;          /* type and value of the variable */
>      char_u   di_flags;       /* flags (only used for variable) */
> -    char_u   di_key[1];      /* key (actually longer!) */
> +    char_u   di_key[];       /* key (actually longer!) */
>  };

This won't work for standard C compilers, they will complain about
unkown size for di_key.

The problem is in the compiler, so fix the compiler.  Or perhaps there
is a way to silence the compiler?

-- 
If Apple would build a car...
... it would be powered by the sun, be reliable, five times
as fast and twice as easy to drive; but would only run on
five percent of the roads.

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

Reply via email to