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>
This commit is contained in:
Steve French 2016-06-22 21:07:32 -05:00
parent 4fcd1813e6
commit 45e8a2583d
2 changed files with 31 additions and 4 deletions

View File

@ -101,6 +101,12 @@ convert_sfm_char(const __u16 src_char, char *target)
case SFM_SLASH: case SFM_SLASH:
*target = '\\'; *target = '\\';
break; break;
case SFM_SPACE:
*target = ' ';
break;
case SFM_PERIOD:
*target = '.';
break;
default: default:
return false; return false;
} }
@ -404,7 +410,7 @@ static __le16 convert_to_sfu_char(char src_char)
return dest_char; 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; __le16 dest_char;
@ -427,6 +433,18 @@ static __le16 convert_to_sfm_char(char src_char)
case '|': case '|':
dest_char = cpu_to_le16(SFM_PIPE); dest_char = cpu_to_le16(SFM_PIPE);
break; 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: default:
dest_char = 0; dest_char = 0;
} }
@ -469,9 +487,16 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen,
/* see if we must remap this char */ /* see if we must remap this char */
if (map_chars == SFU_MAP_UNI_RSVD) if (map_chars == SFU_MAP_UNI_RSVD)
dst_char = convert_to_sfu_char(src_char); dst_char = convert_to_sfu_char(src_char);
else if (map_chars == SFM_MAP_UNI_RSVD) else if (map_chars == SFM_MAP_UNI_RSVD) {
dst_char = convert_to_sfm_char(src_char); bool end_of_string;
else
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; dst_char = 0;
/* /*
* FIXME: We can not handle remapping backslash (UNI_SLASH) * FIXME: We can not handle remapping backslash (UNI_SLASH)

View File

@ -64,6 +64,8 @@
#define SFM_LESSTHAN ((__u16) 0xF023) #define SFM_LESSTHAN ((__u16) 0xF023)
#define SFM_PIPE ((__u16) 0xF027) #define SFM_PIPE ((__u16) 0xF027)
#define SFM_SLASH ((__u16) 0xF026) #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 * Mapping mechanism to use when one of the seven reserved characters is