]> git.pld-linux.org Git - packages/vim.git/blame - 7.2.312
- updated to 7.2.330
[packages/vim.git] / 7.2.312
CommitLineData
e40e3b19
AG
1To: vim-dev@vim.org
2Subject: Patch 7.2.312
3Fcc: outbox
4From: Bram Moolenaar <Bram@moolenaar.net>
5Mime-Version: 1.0
6Content-Type: text/plain; charset=UTF-8
7Content-Transfer-Encoding: 8bit
8------------
9
10Patch 7.2.312
11Problem: iconv() returns an invalid character sequence when conversion
12 fails. It should return an empty string. (Yongwei Wu)
13Solution: Be more strict about invalid characters in the input.
14Files: src/mbyte.c
15
16
17*** ../vim-7.2.311/src/mbyte.c 2009-06-16 15:23:07.000000000 +0200
18--- src/mbyte.c 2009-11-25 16:10:44.000000000 +0100
19***************
20*** 133,154 ****
21 static int dbcs_ptr2cells_len __ARGS((char_u *p, int size));
22 static int dbcs_ptr2char __ARGS((char_u *p));
23
24! /* Lookup table to quickly get the length in bytes of a UTF-8 character from
25! * the first byte of a UTF-8 string. Bytes which are illegal when used as the
26! * first byte have a one, because these will be used separately. */
27 static char utf8len_tab[256] =
28 {
29 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
30 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
31 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
32 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
33! 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /*bogus*/
34! 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /*bogus*/
35 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
36 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1,
37 };
38
39 /*
40 * XIM often causes trouble. Define XIM_DEBUG to get a log of XIM callbacks
41 * in the "xim.log" file.
42 */
43--- 133,172 ----
44 static int dbcs_ptr2cells_len __ARGS((char_u *p, int size));
45 static int dbcs_ptr2char __ARGS((char_u *p));
46
47! /*
48! * Lookup table to quickly get the length in bytes of a UTF-8 character from
49! * the first byte of a UTF-8 string.
50! * Bytes which are illegal when used as the first byte have a 1.
51! * The NUL byte has length 1.
52! */
53 static char utf8len_tab[256] =
54 {
55 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
56 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
57 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
58 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
59! 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
60! 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
61 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
62 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1,
63 };
64
65 /*
66+ * Like utf8len_tab above, but using a zero for illegal lead bytes.
67+ */
68+ static char utf8len_tab_zero[256] =
69+ {
70+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
71+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
72+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
73+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
74+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
75+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
76+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
77+ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0,
78+ };
79+
80+ /*
81 * XIM often causes trouble. Define XIM_DEBUG to get a log of XIM callbacks
82 * in the "xim.log" file.
83 */
84***************
85*** 1352,1358 ****
86 if (size > 0 && *p >= 0x80)
87 {
88 if (utf_ptr2len_len(p, size) < utf8len_tab[*p])
89! return 1;
90 c = utf_ptr2char(p);
91 /* An illegal byte is displayed as <xx>. */
92 if (utf_ptr2len(p) == 1 || c == NUL)
93--- 1370,1376 ----
94 if (size > 0 && *p >= 0x80)
95 {
96 if (utf_ptr2len_len(p, size) < utf8len_tab[*p])
97! return 1; /* truncated */
98 c = utf_ptr2char(p);
99 /* An illegal byte is displayed as <xx>. */
100 if (utf_ptr2len(p) == 1 || c == NUL)
101***************
102*** 1473,1479 ****
103 if (p[0] < 0x80) /* be quick for ASCII */
104 return p[0];
105
106! len = utf8len_tab[p[0]];
107 if (len > 1 && (p[1] & 0xc0) == 0x80)
108 {
109 if (len == 2)
110--- 1491,1497 ----
111 if (p[0] < 0x80) /* be quick for ASCII */
112 return p[0];
113
114! len = utf8len_tab_zero[p[0]];
115 if (len > 1 && (p[1] & 0xc0) == 0x80)
116 {
117 if (len == 2)
118***************
119*** 1723,1728 ****
120--- 1741,1747 ----
121 /*
122 * Return length of UTF-8 character, obtained from the first byte.
123 * "b" must be between 0 and 255!
124+ * Returns 1 for an invalid first byte value.
125 */
126 int
127 utf_byte2len(b)
128***************
129*** 1737,1742 ****
130--- 1756,1762 ----
131 * Returns 1 for "".
132 * Returns 1 for an illegal byte sequence (also in incomplete byte seq.).
133 * Returns number > "size" for an incomplete byte sequence.
134+ * Never returns zero.
135 */
136 int
137 utf_ptr2len_len(p, size)
138***************
139*** 1747,1757 ****
140 int i;
141 int m;
142
143! if (*p == NUL)
144! return 1;
145! m = len = utf8len_tab[*p];
146 if (len > size)
147 m = size; /* incomplete byte sequence. */
148 for (i = 1; i < m; ++i)
149 if ((p[i] & 0xc0) != 0x80)
150 return 1;
151--- 1767,1779 ----
152 int i;
153 int m;
154
155! len = utf8len_tab[*p];
156! if (len == 1)
157! return 1; /* NUL, ascii or illegal lead byte */
158 if (len > size)
159 m = size; /* incomplete byte sequence. */
160+ else
161+ m = len;
162 for (i = 1; i < m; ++i)
163 if ((p[i] & 0xc0) != 0x80)
164 return 1;
165***************
166*** 2505,2510 ****
167--- 2527,2533 ----
168 /*
169 * mb_head_off() function pointer.
170 * Return offset from "p" to the first byte of the character it points into.
171+ * If "p" points to the NUL at the end of the string return 0.
172 * Returns 0 when already at the first byte of a character.
173 */
174 int
175***************
176*** 2524,2530 ****
177
178 /* It can't be a trailing byte when not using DBCS, at the start of the
179 * string or the previous byte can't start a double-byte. */
180! if (p <= base || MB_BYTE2LEN(p[-1]) == 1)
181 return 0;
182
183 /* This is slow: need to start at the base and go forward until the
184--- 2547,2553 ----
185
186 /* It can't be a trailing byte when not using DBCS, at the start of the
187 * string or the previous byte can't start a double-byte. */
188! if (p <= base || MB_BYTE2LEN(p[-1]) == 1 || *p == NUL)
189 return 0;
190
191 /* This is slow: need to start at the base and go forward until the
192***************
193*** 2552,2558 ****
194 * lead byte in the current cell. */
195 if (p <= base
196 || (enc_dbcs == DBCS_JPNU && p[-1] == 0x8e)
197! || MB_BYTE2LEN(p[-1]) == 1)
198 return 0;
199
200 /* This is slow: need to start at the base and go forward until the
201--- 2575,2582 ----
202 * lead byte in the current cell. */
203 if (p <= base
204 || (enc_dbcs == DBCS_JPNU && p[-1] == 0x8e)
205! || MB_BYTE2LEN(p[-1]) == 1
206! || *p == NUL)
207 return 0;
208
209 /* This is slow: need to start at the base and go forward until the
210***************
211*** 2578,2583 ****
212--- 2602,2608 ----
213 char_u *q;
214 char_u *s;
215 int c;
216+ int len;
217 #ifdef FEAT_ARABIC
218 char_u *j;
219 #endif
220***************
221*** 2597,2604 ****
222 --q;
223 /* Check for illegal sequence. Do allow an illegal byte after where we
224 * started. */
225! if (utf8len_tab[*q] != (int)(s - q + 1)
226! && utf8len_tab[*q] != (int)(p - q + 1))
227 return 0;
228
229 if (q <= base)
230--- 2622,2629 ----
231 --q;
232 /* Check for illegal sequence. Do allow an illegal byte after where we
233 * started. */
234! len = utf8len_tab[*q];
235! if (len != (int)(s - q + 1) && len != (int)(p - q + 1))
236 return 0;
237
238 if (q <= base)
239***************
240*** 2810,2818 ****
241
242 while (end == NULL ? *p != NUL : p < end)
243 {
244! if ((*p & 0xc0) == 0x80)
245 return FALSE; /* invalid lead byte */
246- l = utf8len_tab[*p];
247 if (end != NULL && p + l > end)
248 return FALSE; /* incomplete byte sequence */
249 ++p;
250--- 2835,2843 ----
251
252 while (end == NULL ? *p != NUL : p < end)
253 {
254! l = utf8len_tab_zero[*p];
255! if (l == 0)
256 return FALSE; /* invalid lead byte */
257 if (end != NULL && p + l > end)
258 return FALSE; /* incomplete byte sequence */
259 ++p;
260***************
261*** 6117,6128 ****
262 d = retval;
263 for (i = 0; i < len; ++i)
264 {
265! l = utf_ptr2len(ptr + i);
266 if (l == 0)
267 *d++ = NUL;
268 else if (l == 1)
269 {
270! if (unconvlenp != NULL && utf8len_tab[ptr[i]] > len - i)
271 {
272 /* Incomplete sequence at the end. */
273 *unconvlenp = len - i;
274--- 6142,6161 ----
275 d = retval;
276 for (i = 0; i < len; ++i)
277 {
278! l = utf_ptr2len_len(ptr + i, len - i);
279 if (l == 0)
280 *d++ = NUL;
281 else if (l == 1)
282 {
283! int l_w = utf8len_tab_zero[ptr[i]];
284!
285! if (l_w == 0)
286! {
287! /* Illegal utf-8 byte cannot be converted */
288! vim_free(retval);
289! return NULL;
290! }
291! if (unconvlenp != NULL && l_w > len - i)
292 {
293 /* Incomplete sequence at the end. */
294 *unconvlenp = len - i;
295*** ../vim-7.2.311/src/version.c 2009-12-02 13:32:10.000000000 +0100
296--- src/version.c 2009-12-02 15:00:23.000000000 +0100
297***************
298*** 683,684 ****
299--- 683,686 ----
300 { /* Add new patch number below this line */
301+ /**/
302+ 312,
303 /**/
304
305--
306hundred-and-one symptoms of being an internet addict:
3076. You refuse to go to a vacation spot with no electricity and no phone lines.
308
309 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
310/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
311\\\ download, build and distribute -- http://www.A-A-P.org ///
312 \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
This page took 0.056406 seconds and 4 git commands to generate.