diff options
| author | Steve French <smfrench@gmail.com> | 2016-06-22 22:07:32 -0400 |
|---|---|---|
| committer | Steve French <smfrench@gmail.com> | 2016-06-24 13:05:52 -0400 |
| commit | 45e8a2583d97ca758a55c608f78c4cef562644d1 (patch) | |
| tree | 3766108644c9e0fa15136d042ed2143a37796e1a | |
| parent | 4fcd1813e6404dd4420c7d12fb483f9320f0bf93 (diff) | |
File names with trailing period or space need special case conversion
POSIX allows files with trailing spaces or a trailing period but
SMB3 does not, so convert these using the normal Services For Mac
mapping as we do for other reserved characters such as
: < > | ? *
This is similar to what Macs do for the same problem over SMB3.
CC: Stable <stable@vger.kernel.org>
Signed-off-by: Steve French <steve.french@primarydata.com>
Acked-by: Pavel Shilovsky <pshilovsky@samba.org>
| -rw-r--r-- | fs/cifs/cifs_unicode.c | 33 | ||||
| -rw-r--r-- | fs/cifs/cifs_unicode.h | 2 |
2 files changed, 31 insertions, 4 deletions
diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c index 5a53ac6b1e02..02b071bf3732 100644 --- a/fs/cifs/cifs_unicode.c +++ b/fs/cifs/cifs_unicode.c | |||
| @@ -101,6 +101,12 @@ convert_sfm_char(const __u16 src_char, char *target) | |||
| 101 | case SFM_SLASH: | 101 | case SFM_SLASH: |
| 102 | *target = '\\'; | 102 | *target = '\\'; |
| 103 | break; | 103 | break; |
| 104 | case SFM_SPACE: | ||
| 105 | *target = ' '; | ||
| 106 | break; | ||
| 107 | case SFM_PERIOD: | ||
| 108 | *target = '.'; | ||
| 109 | break; | ||
| 104 | default: | 110 | default: |
| 105 | return false; | 111 | return false; |
| 106 | } | 112 | } |
| @@ -404,7 +410,7 @@ static __le16 convert_to_sfu_char(char src_char) | |||
| 404 | return dest_char; | 410 | return dest_char; |
| 405 | } | 411 | } |
| 406 | 412 | ||
| 407 | static __le16 convert_to_sfm_char(char src_char) | 413 | static __le16 convert_to_sfm_char(char src_char, bool end_of_string) |
| 408 | { | 414 | { |
| 409 | __le16 dest_char; | 415 | __le16 dest_char; |
| 410 | 416 | ||
| @@ -427,6 +433,18 @@ static __le16 convert_to_sfm_char(char src_char) | |||
| 427 | case '|': | 433 | case '|': |
| 428 | dest_char = cpu_to_le16(SFM_PIPE); | 434 | dest_char = cpu_to_le16(SFM_PIPE); |
| 429 | break; | 435 | break; |
| 436 | case '.': | ||
| 437 | if (end_of_string) | ||
| 438 | dest_char = cpu_to_le16(SFM_PERIOD); | ||
| 439 | else | ||
| 440 | dest_char = 0; | ||
| 441 | break; | ||
| 442 | case ' ': | ||
| 443 | if (end_of_string) | ||
| 444 | dest_char = cpu_to_le16(SFM_SPACE); | ||
| 445 | else | ||
| 446 | dest_char = 0; | ||
| 447 | break; | ||
| 430 | default: | 448 | default: |
| 431 | dest_char = 0; | 449 | dest_char = 0; |
| 432 | } | 450 | } |
| @@ -469,9 +487,16 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen, | |||
| 469 | /* see if we must remap this char */ | 487 | /* see if we must remap this char */ |
| 470 | if (map_chars == SFU_MAP_UNI_RSVD) | 488 | if (map_chars == SFU_MAP_UNI_RSVD) |
| 471 | dst_char = convert_to_sfu_char(src_char); | 489 | dst_char = convert_to_sfu_char(src_char); |
| 472 | else if (map_chars == SFM_MAP_UNI_RSVD) | 490 | else if (map_chars == SFM_MAP_UNI_RSVD) { |
| 473 | dst_char = convert_to_sfm_char(src_char); | 491 | bool end_of_string; |
| 474 | else | 492 | |
| 493 | if (i == srclen - 1) | ||
| 494 | end_of_string = true; | ||
| 495 | else | ||
| 496 | end_of_string = false; | ||
| 497 | |||
| 498 | dst_char = convert_to_sfm_char(src_char, end_of_string); | ||
| 499 | } else | ||
| 475 | dst_char = 0; | 500 | dst_char = 0; |
| 476 | /* | 501 | /* |
| 477 | * FIXME: We can not handle remapping backslash (UNI_SLASH) | 502 | * FIXME: We can not handle remapping backslash (UNI_SLASH) |
diff --git a/fs/cifs/cifs_unicode.h b/fs/cifs/cifs_unicode.h index bdc52cb9a676..479bc0a941f3 100644 --- a/fs/cifs/cifs_unicode.h +++ b/fs/cifs/cifs_unicode.h | |||
| @@ -64,6 +64,8 @@ | |||
| 64 | #define SFM_LESSTHAN ((__u16) 0xF023) | 64 | #define SFM_LESSTHAN ((__u16) 0xF023) |
| 65 | #define SFM_PIPE ((__u16) 0xF027) | 65 | #define SFM_PIPE ((__u16) 0xF027) |
| 66 | #define SFM_SLASH ((__u16) 0xF026) | 66 | #define SFM_SLASH ((__u16) 0xF026) |
| 67 | #define SFM_PERIOD ((__u16) 0xF028) | ||
| 68 | #define SFM_SPACE ((__u16) 0xF029) | ||
| 67 | 69 | ||
| 68 | /* | 70 | /* |
| 69 | * Mapping mechanism to use when one of the seven reserved characters is | 71 | * Mapping mechanism to use when one of the seven reserved characters is |
