| From 45e8a2583d97ca758a55c608f78c4cef562644d1 Mon Sep 17 00:00:00 2001 |
| From: Steve French <smfrench@gmail.com> |
| Date: Wed, 22 Jun 2016 21:07:32 -0500 |
| Subject: File names with trailing period or space need special case conversion |
| |
| From: Steve French <smfrench@gmail.com> |
| |
| commit 45e8a2583d97ca758a55c608f78c4cef562644d1 upstream. |
| |
| 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. |
| |
| Signed-off-by: Steve French <steve.french@primarydata.com> |
| Acked-by: Pavel Shilovsky <pshilovsky@samba.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/cifs/cifs_unicode.c | 33 +++++++++++++++++++++++++++++---- |
| fs/cifs/cifs_unicode.h | 2 ++ |
| 2 files changed, 31 insertions(+), 4 deletions(-) |
| |
| --- a/fs/cifs/cifs_unicode.c |
| +++ b/fs/cifs/cifs_unicode.c |
| @@ -101,6 +101,12 @@ convert_sfm_char(const __u16 src_char, c |
| case SFM_SLASH: |
| *target = '\\'; |
| break; |
| + case SFM_SPACE: |
| + *target = ' '; |
| + break; |
| + case SFM_PERIOD: |
| + *target = '.'; |
| + break; |
| default: |
| return false; |
| } |
| @@ -404,7 +410,7 @@ static __le16 convert_to_sfu_char(char s |
| return dest_char; |
| } |
| |
| -static __le16 convert_to_sfm_char(char src_char) |
| +static __le16 convert_to_sfm_char(char src_char, bool end_of_string) |
| { |
| __le16 dest_char; |
| |
| @@ -427,6 +433,18 @@ static __le16 convert_to_sfm_char(char s |
| case '|': |
| dest_char = cpu_to_le16(SFM_PIPE); |
| break; |
| + case '.': |
| + if (end_of_string) |
| + dest_char = cpu_to_le16(SFM_PERIOD); |
| + else |
| + dest_char = 0; |
| + break; |
| + case ' ': |
| + if (end_of_string) |
| + dest_char = cpu_to_le16(SFM_SPACE); |
| + else |
| + dest_char = 0; |
| + break; |
| default: |
| dest_char = 0; |
| } |
| @@ -469,9 +487,16 @@ cifsConvertToUTF16(__le16 *target, const |
| /* see if we must remap this char */ |
| if (map_chars == SFU_MAP_UNI_RSVD) |
| dst_char = convert_to_sfu_char(src_char); |
| - else if (map_chars == SFM_MAP_UNI_RSVD) |
| - dst_char = convert_to_sfm_char(src_char); |
| - else |
| + else if (map_chars == SFM_MAP_UNI_RSVD) { |
| + bool end_of_string; |
| + |
| + if (i == srclen - 1) |
| + end_of_string = true; |
| + else |
| + end_of_string = false; |
| + |
| + dst_char = convert_to_sfm_char(src_char, end_of_string); |
| + } else |
| dst_char = 0; |
| /* |
| * FIXME: We can not handle remapping backslash (UNI_SLASH) |
| --- a/fs/cifs/cifs_unicode.h |
| +++ b/fs/cifs/cifs_unicode.h |
| @@ -64,6 +64,8 @@ |
| #define SFM_LESSTHAN ((__u16) 0xF023) |
| #define SFM_PIPE ((__u16) 0xF027) |
| #define SFM_SLASH ((__u16) 0xF026) |
| +#define SFM_PERIOD ((__u16) 0xF028) |
| +#define SFM_SPACE ((__u16) 0xF029) |
| |
| /* |
| * Mapping mechanism to use when one of the seven reserved characters is |