Commit 581ade4d authored by Jeff Layton's avatar Jeff Layton Committed by Steve French

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: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent c0c7b905
...@@ -90,7 +90,7 @@ cifs_mapchar(char *target, const __u16 src_char, const struct nls_table *cp, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 @@ ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment