diff options
Diffstat (limited to 'fs/udf/unicode.c')
| -rw-r--r-- | fs/udf/unicode.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/fs/udf/unicode.c b/fs/udf/unicode.c index afd470e588ff..b84fee372734 100644 --- a/fs/udf/unicode.c +++ b/fs/udf/unicode.c | |||
| @@ -28,7 +28,8 @@ | |||
| 28 | 28 | ||
| 29 | #include "udf_sb.h" | 29 | #include "udf_sb.h" |
| 30 | 30 | ||
| 31 | static int udf_translate_to_linux(uint8_t *, uint8_t *, int, uint8_t *, int); | 31 | static int udf_translate_to_linux(uint8_t *, int, uint8_t *, int, uint8_t *, |
| 32 | int); | ||
| 32 | 33 | ||
| 33 | static int udf_char_to_ustr(struct ustr *dest, const uint8_t *src, int strlen) | 34 | static int udf_char_to_ustr(struct ustr *dest, const uint8_t *src, int strlen) |
| 34 | { | 35 | { |
| @@ -333,8 +334,8 @@ try_again: | |||
| 333 | return u_len + 1; | 334 | return u_len + 1; |
| 334 | } | 335 | } |
| 335 | 336 | ||
| 336 | int udf_get_filename(struct super_block *sb, uint8_t *sname, uint8_t *dname, | 337 | int udf_get_filename(struct super_block *sb, uint8_t *sname, int slen, |
| 337 | int flen) | 338 | uint8_t *dname, int dlen) |
| 338 | { | 339 | { |
| 339 | struct ustr *filename, *unifilename; | 340 | struct ustr *filename, *unifilename; |
| 340 | int len = 0; | 341 | int len = 0; |
| @@ -347,7 +348,7 @@ int udf_get_filename(struct super_block *sb, uint8_t *sname, uint8_t *dname, | |||
| 347 | if (!unifilename) | 348 | if (!unifilename) |
| 348 | goto out1; | 349 | goto out1; |
| 349 | 350 | ||
| 350 | if (udf_build_ustr_exact(unifilename, sname, flen)) | 351 | if (udf_build_ustr_exact(unifilename, sname, slen)) |
| 351 | goto out2; | 352 | goto out2; |
| 352 | 353 | ||
| 353 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { | 354 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { |
| @@ -366,7 +367,8 @@ int udf_get_filename(struct super_block *sb, uint8_t *sname, uint8_t *dname, | |||
| 366 | } else | 367 | } else |
| 367 | goto out2; | 368 | goto out2; |
| 368 | 369 | ||
| 369 | len = udf_translate_to_linux(dname, filename->u_name, filename->u_len, | 370 | len = udf_translate_to_linux(dname, dlen, |
| 371 | filename->u_name, filename->u_len, | ||
| 370 | unifilename->u_name, unifilename->u_len); | 372 | unifilename->u_name, unifilename->u_len); |
| 371 | out2: | 373 | out2: |
| 372 | kfree(unifilename); | 374 | kfree(unifilename); |
| @@ -403,10 +405,12 @@ int udf_put_filename(struct super_block *sb, const uint8_t *sname, | |||
| 403 | #define EXT_MARK '.' | 405 | #define EXT_MARK '.' |
| 404 | #define CRC_MARK '#' | 406 | #define CRC_MARK '#' |
| 405 | #define EXT_SIZE 5 | 407 | #define EXT_SIZE 5 |
| 408 | /* Number of chars we need to store generated CRC to make filename unique */ | ||
| 409 | #define CRC_LEN 5 | ||
| 406 | 410 | ||
| 407 | static int udf_translate_to_linux(uint8_t *newName, uint8_t *udfName, | 411 | static int udf_translate_to_linux(uint8_t *newName, int newLen, |
| 408 | int udfLen, uint8_t *fidName, | 412 | uint8_t *udfName, int udfLen, |
| 409 | int fidNameLen) | 413 | uint8_t *fidName, int fidNameLen) |
| 410 | { | 414 | { |
| 411 | int index, newIndex = 0, needsCRC = 0; | 415 | int index, newIndex = 0, needsCRC = 0; |
| 412 | int extIndex = 0, newExtIndex = 0, hasExt = 0; | 416 | int extIndex = 0, newExtIndex = 0, hasExt = 0; |
| @@ -439,7 +443,7 @@ static int udf_translate_to_linux(uint8_t *newName, uint8_t *udfName, | |||
| 439 | newExtIndex = newIndex; | 443 | newExtIndex = newIndex; |
| 440 | } | 444 | } |
| 441 | } | 445 | } |
| 442 | if (newIndex < 256) | 446 | if (newIndex < newLen) |
| 443 | newName[newIndex++] = curr; | 447 | newName[newIndex++] = curr; |
| 444 | else | 448 | else |
| 445 | needsCRC = 1; | 449 | needsCRC = 1; |
| @@ -467,13 +471,13 @@ static int udf_translate_to_linux(uint8_t *newName, uint8_t *udfName, | |||
| 467 | } | 471 | } |
| 468 | ext[localExtIndex++] = curr; | 472 | ext[localExtIndex++] = curr; |
| 469 | } | 473 | } |
| 470 | maxFilenameLen = 250 - localExtIndex; | 474 | maxFilenameLen = newLen - CRC_LEN - localExtIndex; |
| 471 | if (newIndex > maxFilenameLen) | 475 | if (newIndex > maxFilenameLen) |
| 472 | newIndex = maxFilenameLen; | 476 | newIndex = maxFilenameLen; |
| 473 | else | 477 | else |
| 474 | newIndex = newExtIndex; | 478 | newIndex = newExtIndex; |
| 475 | } else if (newIndex > 250) | 479 | } else if (newIndex > newLen - CRC_LEN) |
| 476 | newIndex = 250; | 480 | newIndex = newLen - CRC_LEN; |
| 477 | newName[newIndex++] = CRC_MARK; | 481 | newName[newIndex++] = CRC_MARK; |
| 478 | valueCRC = crc_itu_t(0, fidName, fidNameLen); | 482 | valueCRC = crc_itu_t(0, fidName, fidNameLen); |
| 479 | newName[newIndex++] = hex_asc_upper_hi(valueCRC >> 8); | 483 | newName[newIndex++] = hex_asc_upper_hi(valueCRC >> 8); |
