summaryrefslogtreecommitdiffstats
path: root/fs/udf/unicode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/udf/unicode.c')
-rw-r--r--fs/udf/unicode.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/udf/unicode.c b/fs/udf/unicode.c
index 95a224b26048..e788a05aab83 100644
--- a/fs/udf/unicode.c
+++ b/fs/udf/unicode.c
@@ -177,17 +177,22 @@ int udf_CS0toUTF8(struct ustr *utf_o, const struct ustr *ocu_i)
177static int udf_UTF8toCS0(dstring *ocu, struct ustr *utf, int length) 177static int udf_UTF8toCS0(dstring *ocu, struct ustr *utf, int length)
178{ 178{
179 unsigned c, i, max_val, utf_char; 179 unsigned c, i, max_val, utf_char;
180 int utf_cnt, u_len; 180 int utf_cnt, u_len, u_ch;
181 181
182 memset(ocu, 0, sizeof(dstring) * length); 182 memset(ocu, 0, sizeof(dstring) * length);
183 ocu[0] = 8; 183 ocu[0] = 8;
184 max_val = 0xffU; 184 max_val = 0xffU;
185 u_ch = 1;
185 186
186try_again: 187try_again:
187 u_len = 0U; 188 u_len = 0U;
188 utf_char = 0U; 189 utf_char = 0U;
189 utf_cnt = 0U; 190 utf_cnt = 0U;
190 for (i = 0U; i < utf->u_len; i++) { 191 for (i = 0U; i < utf->u_len; i++) {
192 /* Name didn't fit? */
193 if (u_len + 1 + u_ch >= length)
194 return 0;
195
191 c = (uint8_t)utf->u_name[i]; 196 c = (uint8_t)utf->u_name[i];
192 197
193 /* Complete a multi-byte UTF-8 character */ 198 /* Complete a multi-byte UTF-8 character */
@@ -229,6 +234,7 @@ try_again:
229 if (max_val == 0xffU) { 234 if (max_val == 0xffU) {
230 max_val = 0xffffU; 235 max_val = 0xffffU;
231 ocu[0] = (uint8_t)0x10U; 236 ocu[0] = (uint8_t)0x10U;
237 u_ch = 2;
232 goto try_again; 238 goto try_again;
233 } 239 }
234 goto error_out; 240 goto error_out;
@@ -299,15 +305,19 @@ static int udf_NLStoCS0(struct nls_table *nls, dstring *ocu, struct ustr *uni,
299 int len; 305 int len;
300 unsigned i, max_val; 306 unsigned i, max_val;
301 uint16_t uni_char; 307 uint16_t uni_char;
302 int u_len; 308 int u_len, u_ch;
303 309
304 memset(ocu, 0, sizeof(dstring) * length); 310 memset(ocu, 0, sizeof(dstring) * length);
305 ocu[0] = 8; 311 ocu[0] = 8;
306 max_val = 0xffU; 312 max_val = 0xffU;
313 u_ch = 1;
307 314
308try_again: 315try_again:
309 u_len = 0U; 316 u_len = 0U;
310 for (i = 0U; i < uni->u_len; i++) { 317 for (i = 0U; i < uni->u_len; i++) {
318 /* Name didn't fit? */
319 if (u_len + 1 + u_ch >= length)
320 return 0;
311 len = nls->char2uni(&uni->u_name[i], uni->u_len - i, &uni_char); 321 len = nls->char2uni(&uni->u_name[i], uni->u_len - i, &uni_char);
312 if (!len) 322 if (!len)
313 continue; 323 continue;
@@ -320,6 +330,7 @@ try_again:
320 if (uni_char > max_val) { 330 if (uni_char > max_val) {
321 max_val = 0xffffU; 331 max_val = 0xffffU;
322 ocu[0] = (uint8_t)0x10U; 332 ocu[0] = (uint8_t)0x10U;
333 u_ch = 2;
323 goto try_again; 334 goto try_again;
324 } 335 }
325 336