Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69f801fc authored by Jeff Layton's avatar Jeff Layton Committed by Steve French
Browse files

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: default avatarJeff Layton <jlayton@redhat.com>
Acked-by: default avatarSuresh Jayaraman <sjayaraman@suse.de>
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 7fabf0c9
Loading
Loading
Loading
Loading
+31 −0
Original line number Original line Diff line number Diff line
@@ -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
+2 −0
Original line number Original line Diff line number Diff line
@@ -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
+2 −23
Original line number Original line Diff line number Diff line
@@ -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