mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
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:
parent
4fcd1813e6
commit
45e8a2583d
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user