Handle big endianness in NTLM (ntlmv2) authentication
This is RH bug 970891 Uppercasing of username during calculation of ntlmv2 hash fails because UniStrupr function does not handle big endian wchars. Also fix a comment in the same code to reflect its correct usage. [To make it easier for stable (rather than require 2nd patch) fixed this patch of Shirish's to remove endian warning generated by sparse -- steve f.] Reported-by: steve <sanpatr1@in.ibm.com> Signed-off-by: Shirish Pargaonkar <shirishpargaonkar@gmail.com> Cc: <stable@kernel.org> Reviewed-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:
parent
2a2c41c07c
commit
fdf96a907c
|
@ -327,14 +327,14 @@ UniToupper(register wchar_t uc)
|
||||||
/*
|
/*
|
||||||
* UniStrupr: Upper case a unicode string
|
* UniStrupr: Upper case a unicode string
|
||||||
*/
|
*/
|
||||||
static inline wchar_t *
|
static inline __le16 *
|
||||||
UniStrupr(register wchar_t *upin)
|
UniStrupr(register __le16 *upin)
|
||||||
{
|
{
|
||||||
register wchar_t *up;
|
register __le16 *up;
|
||||||
|
|
||||||
up = upin;
|
up = upin;
|
||||||
while (*up) { /* For all characters */
|
while (*up) { /* For all characters */
|
||||||
*up = UniToupper(*up);
|
*up = cpu_to_le16(UniToupper(le16_to_cpu(*up)));
|
||||||
up++;
|
up++;
|
||||||
}
|
}
|
||||||
return upin; /* Return input pointer */
|
return upin; /* Return input pointer */
|
||||||
|
|
|
@ -413,7 +413,7 @@ static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash,
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
int len;
|
int len;
|
||||||
char nt_hash[CIFS_NTHASH_SIZE];
|
char nt_hash[CIFS_NTHASH_SIZE];
|
||||||
wchar_t *user;
|
__le16 *user;
|
||||||
wchar_t *domain;
|
wchar_t *domain;
|
||||||
wchar_t *server;
|
wchar_t *server;
|
||||||
|
|
||||||
|
@ -438,7 +438,7 @@ static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* convert ses->user_name to unicode and uppercase */
|
/* convert ses->user_name to unicode */
|
||||||
len = ses->user_name ? strlen(ses->user_name) : 0;
|
len = ses->user_name ? strlen(ses->user_name) : 0;
|
||||||
user = kmalloc(2 + (len * 2), GFP_KERNEL);
|
user = kmalloc(2 + (len * 2), GFP_KERNEL);
|
||||||
if (user == NULL) {
|
if (user == NULL) {
|
||||||
|
@ -447,7 +447,7 @@ static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len) {
|
if (len) {
|
||||||
len = cifs_strtoUTF16((__le16 *)user, ses->user_name, len, nls_cp);
|
len = cifs_strtoUTF16(user, ses->user_name, len, nls_cp);
|
||||||
UniStrupr(user);
|
UniStrupr(user);
|
||||||
} else {
|
} else {
|
||||||
memset(user, '\0', 2);
|
memset(user, '\0', 2);
|
||||||
|
|
Loading…
Reference in New Issue