cifs: add new function to get unicode string length in bytes
Working in units of words means we do a lot of unnecessary conversion back and forth. Standardize on bytes instead since that's more useful for allocating buffers and such. Also, remove hostlen_fromUCS since the new function has a similar purpose. Signed-off-by: Jeff Layton <jlayton@redhat.com> Acked-by: Suresh Jayaraman <sjayaraman@suse.de> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
committed by
Steve French
parent
7fabf0c947
commit
69f801fcaa
@@ -25,6 +25,37 @@
|
|||||||
#include "cifsglob.h"
|
#include "cifsglob.h"
|
||||||
#include "cifs_debug.h"
|
#include "cifs_debug.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* cifs_ucs2_bytes - how long will a string be after conversion?
|
||||||
|
* @ucs - pointer to input string
|
||||||
|
* @maxbytes - don't go past this many bytes of input string
|
||||||
|
* @codepage - destination codepage
|
||||||
|
*
|
||||||
|
* Walk a ucs2le string and return the number of bytes that the string will
|
||||||
|
* be after being converted to the given charset, not including any null
|
||||||
|
* termination required. Don't walk past maxbytes in the source buffer.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
cifs_ucs2_bytes(const __le16 *from, int maxbytes,
|
||||||
|
const struct nls_table *codepage)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int charlen, outlen = 0;
|
||||||
|
int maxwords = maxbytes / 2;
|
||||||
|
char tmp[NLS_MAX_CHARSET_SIZE];
|
||||||
|
|
||||||
|
for (i = 0; from[i] && i < maxwords; i++) {
|
||||||
|
charlen = codepage->uni2char(le16_to_cpu(from[i]), tmp,
|
||||||
|
NLS_MAX_CHARSET_SIZE);
|
||||||
|
if (charlen > 0)
|
||||||
|
outlen += charlen;
|
||||||
|
else
|
||||||
|
outlen++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return outlen;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cifs_mapchar - convert a little-endian char to proper char in codepage
|
* cifs_mapchar - convert a little-endian char to proper char in codepage
|
||||||
* @target - where converted character should be copied
|
* @target - where converted character should be copied
|
||||||
|
@@ -74,6 +74,8 @@ extern struct UniCaseRange UniLowerRange[];
|
|||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
int cifs_from_ucs2(char *to, const __le16 *from, int tolen, int fromlen,
|
int cifs_from_ucs2(char *to, const __le16 *from, int tolen, int fromlen,
|
||||||
const struct nls_table *codepage, bool mapchar);
|
const struct nls_table *codepage, bool mapchar);
|
||||||
|
int cifs_ucs2_bytes(const __le16 *from, int maxbytes,
|
||||||
|
const struct nls_table *codepage);
|
||||||
int cifs_strfromUCS_le(char *, const __le16 *, int, const struct nls_table *);
|
int cifs_strfromUCS_le(char *, const __le16 *, int, const struct nls_table *);
|
||||||
int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *);
|
int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -3928,27 +3928,6 @@ GetInodeNumOut:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* computes length of UCS string converted to host codepage
|
|
||||||
* @src: UCS string
|
|
||||||
* @maxlen: length of the input string in UCS characters
|
|
||||||
* (not in bytes)
|
|
||||||
*
|
|
||||||
* return: size of input string in host codepage
|
|
||||||
*/
|
|
||||||
static int hostlen_fromUCS(const __le16 *src, const int maxlen,
|
|
||||||
const struct nls_table *nls_codepage) {
|
|
||||||
int i;
|
|
||||||
int hostlen = 0;
|
|
||||||
char to[4];
|
|
||||||
int charlen;
|
|
||||||
for (i = 0; (i < maxlen) && src[i]; ++i) {
|
|
||||||
charlen = nls_codepage->uni2char(le16_to_cpu(src[i]),
|
|
||||||
to, NLS_MAX_CHARSET_SIZE);
|
|
||||||
hostlen += charlen > 0 ? charlen : 1;
|
|
||||||
}
|
|
||||||
return hostlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parses DFS refferal V3 structure
|
/* parses DFS refferal V3 structure
|
||||||
* caller is responsible for freeing target_nodes
|
* caller is responsible for freeing target_nodes
|
||||||
* returns:
|
* returns:
|
||||||
@@ -4016,8 +3995,8 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr,
|
|||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
cifsConvertToUCS((__le16 *) tmp, searchName,
|
cifsConvertToUCS((__le16 *) tmp, searchName,
|
||||||
PATH_MAX, nls_codepage, remap);
|
PATH_MAX, nls_codepage, remap);
|
||||||
node->path_consumed = hostlen_fromUCS(tmp,
|
node->path_consumed = cifs_ucs2_bytes(tmp,
|
||||||
le16_to_cpu(pSMBr->PathConsumed)/2,
|
le16_to_cpu(pSMBr->PathConsumed),
|
||||||
nls_codepage);
|
nls_codepage);
|
||||||
kfree(tmp);
|
kfree(tmp);
|
||||||
} else
|
} else
|
||||||
|
Reference in New Issue
Block a user