|
1 To: [email protected] |
|
2 Subject: Patch 7.2.440 |
|
3 Fcc: outbox |
|
4 From: Bram Moolenaar <[email protected]> |
|
5 Mime-Version: 1.0 |
|
6 Content-Type: text/plain; charset=UTF-8 |
|
7 Content-Transfer-Encoding: 8bit |
|
8 ------------ |
|
9 |
|
10 Patch 7.2.440 |
|
11 Problem: Calling a function through a funcref, where the function deletes |
|
12 the funcref, leads to an invalid memory access. |
|
13 Solution: Make a copy of the function name. (Lech Lorens) |
|
14 Files: src/eval.c, src/testdir/test34.in, src/testdir/test34.ok |
|
15 |
|
16 |
|
17 *** ../vim-7.2.439/src/eval.c 2010-05-16 13:26:19.000000000 +0200 |
|
18 --- src/eval.c 2010-05-28 22:01:07.000000000 +0200 |
|
19 *************** |
|
20 *** 464,470 **** |
|
21 static int find_internal_func __ARGS((char_u *name)); |
|
22 static char_u *deref_func_name __ARGS((char_u *name, int *lenp)); |
|
23 static int get_func_tv __ARGS((char_u *name, int len, typval_T *rettv, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict)); |
|
24 ! static int call_func __ARGS((char_u *name, int len, typval_T *rettv, int argcount, typval_T *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict)); |
|
25 static void emsg_funcname __ARGS((char *ermsg, char_u *name)); |
|
26 static int non_zero_arg __ARGS((typval_T *argvars)); |
|
27 |
|
28 --- 464,470 ---- |
|
29 static int find_internal_func __ARGS((char_u *name)); |
|
30 static char_u *deref_func_name __ARGS((char_u *name, int *lenp)); |
|
31 static int get_func_tv __ARGS((char_u *name, int len, typval_T *rettv, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict)); |
|
32 ! static int call_func __ARGS((char_u *func_name, int len, typval_T *rettv, int argcount, typval_T *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict)); |
|
33 static void emsg_funcname __ARGS((char *ermsg, char_u *name)); |
|
34 static int non_zero_arg __ARGS((typval_T *argvars)); |
|
35 |
|
36 *************** |
|
37 *** 7997,8005 **** |
|
38 * Also returns OK when an error was encountered while executing the function. |
|
39 */ |
|
40 static int |
|
41 ! call_func(name, len, rettv, argcount, argvars, firstline, lastline, |
|
42 doesrange, evaluate, selfdict) |
|
43 ! char_u *name; /* name of the function */ |
|
44 int len; /* length of "name" */ |
|
45 typval_T *rettv; /* return value goes here */ |
|
46 int argcount; /* number of "argvars" */ |
|
47 --- 7997,8005 ---- |
|
48 * Also returns OK when an error was encountered while executing the function. |
|
49 */ |
|
50 static int |
|
51 ! call_func(func_name, len, rettv, argcount, argvars, firstline, lastline, |
|
52 doesrange, evaluate, selfdict) |
|
53 ! char_u *func_name; /* name of the function */ |
|
54 int len; /* length of "name" */ |
|
55 typval_T *rettv; /* return value goes here */ |
|
56 int argcount; /* number of "argvars" */ |
|
57 *************** |
|
58 *** 8023,8040 **** |
|
59 int i; |
|
60 int llen; |
|
61 ufunc_T *fp; |
|
62 - int cc; |
|
63 #define FLEN_FIXED 40 |
|
64 char_u fname_buf[FLEN_FIXED + 1]; |
|
65 char_u *fname; |
|
66 |
|
67 /* |
|
68 * In a script change <SID>name() and s:name() to K_SNR 123_name(). |
|
69 * Change <SNR>123_name() to K_SNR 123_name(). |
|
70 * Use fname_buf[] when it fits, otherwise allocate memory (slow). |
|
71 */ |
|
72 - cc = name[len]; |
|
73 - name[len] = NUL; |
|
74 llen = eval_fname_script(name); |
|
75 if (llen > 0) |
|
76 { |
|
77 --- 8023,8044 ---- |
|
78 int i; |
|
79 int llen; |
|
80 ufunc_T *fp; |
|
81 #define FLEN_FIXED 40 |
|
82 char_u fname_buf[FLEN_FIXED + 1]; |
|
83 char_u *fname; |
|
84 + char_u *name; |
|
85 + |
|
86 + /* Make a copy of the name, if it comes from a funcref variable it could |
|
87 + * be changed or deleted in the called function. */ |
|
88 + name = vim_strnsave(func_name, len); |
|
89 + if (name == NULL) |
|
90 + return ret; |
|
91 |
|
92 /* |
|
93 * In a script change <SID>name() and s:name() to K_SNR 123_name(). |
|
94 * Change <SNR>123_name() to K_SNR 123_name(). |
|
95 * Use fname_buf[] when it fits, otherwise allocate memory (slow). |
|
96 */ |
|
97 llen = eval_fname_script(name); |
|
98 if (llen > 0) |
|
99 { |
|
100 *************** |
|
101 *** 8205,8213 **** |
|
102 } |
|
103 } |
|
104 |
|
105 - name[len] = cc; |
|
106 if (fname != name && fname != fname_buf) |
|
107 vim_free(fname); |
|
108 |
|
109 return ret; |
|
110 } |
|
111 --- 8209,8217 ---- |
|
112 } |
|
113 } |
|
114 |
|
115 if (fname != name && fname != fname_buf) |
|
116 vim_free(fname); |
|
117 + vim_free(name); |
|
118 |
|
119 return ret; |
|
120 } |
|
121 *** ../vim-7.2.439/src/testdir/test34.in 2007-09-25 17:59:15.000000000 +0200 |
|
122 --- src/testdir/test34.in 2010-05-28 21:54:36.000000000 +0200 |
|
123 *************** |
|
124 *** 35,40 **** |
|
125 --- 35,45 ---- |
|
126 : let g:counter = 0 |
|
127 : return '' |
|
128 :endfunc |
|
129 + :func FuncWithRef(a) |
|
130 + : unlet g:FuncRef |
|
131 + : return a:a |
|
132 + :endfunc |
|
133 + :let g:FuncRef=function("FuncWithRef") |
|
134 :let counter = 0 |
|
135 :inoremap <expr> ( ListItem() |
|
136 :inoremap <expr> [ ListReset() |
|
137 *************** |
|
138 *** 47,52 **** |
|
139 --- 52,58 ---- |
|
140 =retval |
|
141 =Compute(45, 5, "retval") |
|
142 =retval |
|
143 + =g:FuncRef(333) |
|
144 |
|
145 XX+-XX |
|
146 ---*--- |
|
147 *** ../vim-7.2.439/src/testdir/test34.ok 2006-04-30 20:49:40.000000000 +0200 |
|
148 --- src/testdir/test34.ok 2010-05-28 21:56:03.000000000 +0200 |
|
149 *************** |
|
150 *** 1,4 **** |
|
151 ! xxx4asdf fail nop ok 9 |
|
152 XX111XX |
|
153 ---222--- |
|
154 1. one |
|
155 --- 1,4 ---- |
|
156 ! xxx4asdf fail nop ok 9 333 |
|
157 XX111XX |
|
158 ---222--- |
|
159 1. one |
|
160 *** ../vim-7.2.439/src/version.c 2010-05-28 21:31:51.000000000 +0200 |
|
161 --- src/version.c 2010-05-28 22:03:30.000000000 +0200 |
|
162 *************** |
|
163 *** 683,684 **** |
|
164 --- 683,686 ---- |
|
165 { /* Add new patch number below this line */ |
|
166 + /**/ |
|
167 + 440, |
|
168 /**/ |
|
169 |
|
170 -- |
|
171 Nobody will ever need more than 640 kB RAM. |
|
172 -- Bill Gates, 1983 |
|
173 Windows 98 requires 16 MB RAM. |
|
174 -- Bill Gates, 1999 |
|
175 Logical conclusion: Nobody will ever need Windows 98. |
|
176 |
|
177 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\ |
|
178 /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
|
179 \\\ download, build and distribute -- http://www.A-A-P.org /// |
|
180 \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |