mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-04-02 20:44:00 +00:00
cifs: clean up various nits in unicode routines (try #2)
Minor revision to the original patch. Don't abuse the __le16 variable on the stack by casting it to wchar_t and handing it off to char2uni. Declare an actual wchar_t on the stack instead. This fixes a valid sparse warning. Fix the spelling of UNI_ASTERISK. Eliminate the unneeded len_remaining variable in cifsConvertToUCS. Also, as David Howells points out. We were better off making cifsConvertToUCS *not* use put_unaligned_le16 since it means that we can't optimize the mapped characters at compile time. Switch them instead to use cpu_to_le16, and simply use put_unaligned to set them in the string. Reported-and-acked-by: David Howells <dhowells@redhat.com> Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
c0c7b905e9
commit
581ade4d1c
2 changed files with 18 additions and 19 deletions
|
@ -90,7 +90,7 @@ cifs_mapchar(char *target, const __u16 src_char, const struct nls_table *cp,
|
||||||
case UNI_COLON:
|
case UNI_COLON:
|
||||||
*target = ':';
|
*target = ':';
|
||||||
break;
|
break;
|
||||||
case UNI_ASTERIK:
|
case UNI_ASTERISK:
|
||||||
*target = '*';
|
*target = '*';
|
||||||
break;
|
break;
|
||||||
case UNI_QUESTION:
|
case UNI_QUESTION:
|
||||||
|
@ -264,40 +264,40 @@ cifs_strndup_from_ucs(const char *src, const int maxlen, const bool is_unicode,
|
||||||
* names are little endian 16 bit Unicode on the wire
|
* names are little endian 16 bit Unicode on the wire
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
cifsConvertToUCS(__le16 *target, const char *source, int maxlen,
|
cifsConvertToUCS(__le16 *target, const char *source, int srclen,
|
||||||
const struct nls_table *cp, int mapChars)
|
const struct nls_table *cp, int mapChars)
|
||||||
{
|
{
|
||||||
int i, j, charlen;
|
int i, j, charlen;
|
||||||
int len_remaining = maxlen;
|
|
||||||
char src_char;
|
char src_char;
|
||||||
__u16 temp;
|
__le16 dst_char;
|
||||||
|
wchar_t tmp;
|
||||||
|
|
||||||
if (!mapChars)
|
if (!mapChars)
|
||||||
return cifs_strtoUCS(target, source, PATH_MAX, cp);
|
return cifs_strtoUCS(target, source, PATH_MAX, cp);
|
||||||
|
|
||||||
for (i = 0, j = 0; i < maxlen; j++) {
|
for (i = 0, j = 0; i < srclen; j++) {
|
||||||
src_char = source[i];
|
src_char = source[i];
|
||||||
switch (src_char) {
|
switch (src_char) {
|
||||||
case 0:
|
case 0:
|
||||||
put_unaligned_le16(0, &target[j]);
|
put_unaligned(0, &target[j]);
|
||||||
goto ctoUCS_out;
|
goto ctoUCS_out;
|
||||||
case ':':
|
case ':':
|
||||||
temp = UNI_COLON;
|
dst_char = cpu_to_le16(UNI_COLON);
|
||||||
break;
|
break;
|
||||||
case '*':
|
case '*':
|
||||||
temp = UNI_ASTERIK;
|
dst_char = cpu_to_le16(UNI_ASTERISK);
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
temp = UNI_QUESTION;
|
dst_char = cpu_to_le16(UNI_QUESTION);
|
||||||
break;
|
break;
|
||||||
case '<':
|
case '<':
|
||||||
temp = UNI_LESSTHAN;
|
dst_char = cpu_to_le16(UNI_LESSTHAN);
|
||||||
break;
|
break;
|
||||||
case '>':
|
case '>':
|
||||||
temp = UNI_GRTRTHAN;
|
dst_char = cpu_to_le16(UNI_GRTRTHAN);
|
||||||
break;
|
break;
|
||||||
case '|':
|
case '|':
|
||||||
temp = UNI_PIPE;
|
dst_char = cpu_to_le16(UNI_PIPE);
|
||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
* FIXME: We can not handle remapping backslash (UNI_SLASH)
|
* FIXME: We can not handle remapping backslash (UNI_SLASH)
|
||||||
|
@ -305,17 +305,17 @@ cifsConvertToUCS(__le16 *target, const char *source, int maxlen,
|
||||||
* as they use backslash as separator.
|
* as they use backslash as separator.
|
||||||
*/
|
*/
|
||||||
default:
|
default:
|
||||||
charlen = cp->char2uni(source+i, len_remaining,
|
charlen = cp->char2uni(source + i, srclen - i, &tmp);
|
||||||
&temp);
|
dst_char = cpu_to_le16(tmp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if no match, use question mark, which at least in
|
* if no match, use question mark, which at least in
|
||||||
* some cases serves as wild card
|
* some cases serves as wild card
|
||||||
*/
|
*/
|
||||||
if (charlen < 1) {
|
if (charlen < 1) {
|
||||||
temp = 0x003f;
|
dst_char = cpu_to_le16(0x003f);
|
||||||
charlen = 1;
|
charlen = 1;
|
||||||
}
|
}
|
||||||
len_remaining -= charlen;
|
|
||||||
/*
|
/*
|
||||||
* character may take more than one byte in the source
|
* character may take more than one byte in the source
|
||||||
* string, but will take exactly two bytes in the
|
* string, but will take exactly two bytes in the
|
||||||
|
@ -324,9 +324,8 @@ cifsConvertToUCS(__le16 *target, const char *source, int maxlen,
|
||||||
i += charlen;
|
i += charlen;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
put_unaligned_le16(temp, &target[j]);
|
put_unaligned(dst_char, &target[j]);
|
||||||
i++; /* move to next char in source string */
|
i++; /* move to next char in source string */
|
||||||
len_remaining--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctoUCS_out:
|
ctoUCS_out:
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
* reserved symbols (along with \ and /), otherwise illegal to store
|
* reserved symbols (along with \ and /), otherwise illegal to store
|
||||||
* in filenames in NTFS
|
* in filenames in NTFS
|
||||||
*/
|
*/
|
||||||
#define UNI_ASTERIK (__u16) ('*' + 0xF000)
|
#define UNI_ASTERISK (__u16) ('*' + 0xF000)
|
||||||
#define UNI_QUESTION (__u16) ('?' + 0xF000)
|
#define UNI_QUESTION (__u16) ('?' + 0xF000)
|
||||||
#define UNI_COLON (__u16) (':' + 0xF000)
|
#define UNI_COLON (__u16) (':' + 0xF000)
|
||||||
#define UNI_GRTRTHAN (__u16) ('>' + 0xF000)
|
#define UNI_GRTRTHAN (__u16) ('>' + 0xF000)
|
||||||
|
|
Loading…
Add table
Reference in a new issue