Commit 1a67a573 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.samba.org/sfrench/cifs-2.6

* git://git.samba.org/sfrench/cifs-2.6:
  cifs: Assume passwords are encoded according to iocharset (try #2)
  CIFS: Fix the VFS brlock cache usage in posix locking case
  [CIFS] Update cifs version to 1.76
  CIFS: Remove extra mutex_unlock in cifs_lock_add_if
parents 6dbbd925 9ef5992e
...@@ -204,7 +204,7 @@ int cifs_verify_signature(struct kvec *iov, unsigned int nr_iov, ...@@ -204,7 +204,7 @@ int cifs_verify_signature(struct kvec *iov, unsigned int nr_iov,
} }
/* first calculate 24 bytes ntlm response and then 16 byte session key */ /* first calculate 24 bytes ntlm response and then 16 byte session key */
int setup_ntlm_response(struct cifs_ses *ses) int setup_ntlm_response(struct cifs_ses *ses, const struct nls_table *nls_cp)
{ {
int rc = 0; int rc = 0;
unsigned int temp_len = CIFS_SESS_KEY_SIZE + CIFS_AUTH_RESP_SIZE; unsigned int temp_len = CIFS_SESS_KEY_SIZE + CIFS_AUTH_RESP_SIZE;
...@@ -221,14 +221,14 @@ int setup_ntlm_response(struct cifs_ses *ses) ...@@ -221,14 +221,14 @@ int setup_ntlm_response(struct cifs_ses *ses)
ses->auth_key.len = temp_len; ses->auth_key.len = temp_len;
rc = SMBNTencrypt(ses->password, ses->server->cryptkey, rc = SMBNTencrypt(ses->password, ses->server->cryptkey,
ses->auth_key.response + CIFS_SESS_KEY_SIZE); ses->auth_key.response + CIFS_SESS_KEY_SIZE, nls_cp);
if (rc) { if (rc) {
cFYI(1, "%s Can't generate NTLM response, error: %d", cFYI(1, "%s Can't generate NTLM response, error: %d",
__func__, rc); __func__, rc);
return rc; return rc;
} }
rc = E_md4hash(ses->password, temp_key); rc = E_md4hash(ses->password, temp_key, nls_cp);
if (rc) { if (rc) {
cFYI(1, "%s Can't generate NT hash, error: %d", __func__, rc); cFYI(1, "%s Can't generate NT hash, error: %d", __func__, rc);
return rc; return rc;
...@@ -404,7 +404,7 @@ static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash, ...@@ -404,7 +404,7 @@ static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash,
} }
/* calculate md4 hash of password */ /* calculate md4 hash of password */
E_md4hash(ses->password, nt_hash); E_md4hash(ses->password, nt_hash, nls_cp);
rc = crypto_shash_setkey(ses->server->secmech.hmacmd5, nt_hash, rc = crypto_shash_setkey(ses->server->secmech.hmacmd5, nt_hash,
CIFS_NTHASH_SIZE); CIFS_NTHASH_SIZE);
......
...@@ -125,5 +125,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg); ...@@ -125,5 +125,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
extern const struct export_operations cifs_export_ops; extern const struct export_operations cifs_export_ops;
#endif /* CONFIG_CIFS_NFSD_EXPORT */ #endif /* CONFIG_CIFS_NFSD_EXPORT */
#define CIFS_VERSION "1.75" #define CIFS_VERSION "1.76"
#endif /* _CIFSFS_H */ #endif /* _CIFSFS_H */
...@@ -395,8 +395,9 @@ extern int cifs_sign_smb2(struct kvec *iov, int n_vec, struct TCP_Server_Info *, ...@@ -395,8 +395,9 @@ extern int cifs_sign_smb2(struct kvec *iov, int n_vec, struct TCP_Server_Info *,
extern int cifs_verify_signature(struct kvec *iov, unsigned int nr_iov, extern int cifs_verify_signature(struct kvec *iov, unsigned int nr_iov,
struct TCP_Server_Info *server, struct TCP_Server_Info *server,
__u32 expected_sequence_number); __u32 expected_sequence_number);
extern int SMBNTencrypt(unsigned char *, unsigned char *, unsigned char *); extern int SMBNTencrypt(unsigned char *, unsigned char *, unsigned char *,
extern int setup_ntlm_response(struct cifs_ses *); const struct nls_table *);
extern int setup_ntlm_response(struct cifs_ses *, const struct nls_table *);
extern int setup_ntlmv2_rsp(struct cifs_ses *, const struct nls_table *); extern int setup_ntlmv2_rsp(struct cifs_ses *, const struct nls_table *);
extern int cifs_crypto_shash_allocate(struct TCP_Server_Info *); extern int cifs_crypto_shash_allocate(struct TCP_Server_Info *);
extern void cifs_crypto_shash_release(struct TCP_Server_Info *); extern void cifs_crypto_shash_release(struct TCP_Server_Info *);
...@@ -448,7 +449,8 @@ extern int CIFSCheckMFSymlink(struct cifs_fattr *fattr, ...@@ -448,7 +449,8 @@ extern int CIFSCheckMFSymlink(struct cifs_fattr *fattr,
const unsigned char *path, const unsigned char *path,
struct cifs_sb_info *cifs_sb, int xid); struct cifs_sb_info *cifs_sb, int xid);
extern int mdfour(unsigned char *, unsigned char *, int); extern int mdfour(unsigned char *, unsigned char *, int);
extern int E_md4hash(const unsigned char *passwd, unsigned char *p16); extern int E_md4hash(const unsigned char *passwd, unsigned char *p16,
const struct nls_table *codepage);
extern int SMBencrypt(unsigned char *passwd, const unsigned char *c8, extern int SMBencrypt(unsigned char *passwd, const unsigned char *c8,
unsigned char *p24); unsigned char *p24);
......
...@@ -3452,7 +3452,7 @@ CIFSTCon(unsigned int xid, struct cifs_ses *ses, ...@@ -3452,7 +3452,7 @@ CIFSTCon(unsigned int xid, struct cifs_ses *ses,
else else
#endif /* CIFS_WEAK_PW_HASH */ #endif /* CIFS_WEAK_PW_HASH */
rc = SMBNTencrypt(tcon->password, ses->server->cryptkey, rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
bcc_ptr); bcc_ptr, nls_codepage);
bcc_ptr += CIFS_AUTH_RESP_SIZE; bcc_ptr += CIFS_AUTH_RESP_SIZE;
if (ses->capabilities & CAP_UNICODE) { if (ses->capabilities & CAP_UNICODE) {
......
...@@ -778,7 +778,6 @@ cifs_lock_add_if(struct cifsInodeInfo *cinode, __u64 offset, __u64 length, ...@@ -778,7 +778,6 @@ cifs_lock_add_if(struct cifsInodeInfo *cinode, __u64 offset, __u64 length,
else { else {
mutex_lock(&cinode->lock_mutex); mutex_lock(&cinode->lock_mutex);
list_del_init(&lock->blist); list_del_init(&lock->blist);
mutex_unlock(&cinode->lock_mutex);
} }
} }
...@@ -794,6 +793,9 @@ cifs_posix_lock_test(struct file *file, struct file_lock *flock) ...@@ -794,6 +793,9 @@ cifs_posix_lock_test(struct file *file, struct file_lock *flock)
struct cifsInodeInfo *cinode = CIFS_I(file->f_path.dentry->d_inode); struct cifsInodeInfo *cinode = CIFS_I(file->f_path.dentry->d_inode);
unsigned char saved_type = flock->fl_type; unsigned char saved_type = flock->fl_type;
if ((flock->fl_flags & FL_POSIX) == 0)
return 1;
mutex_lock(&cinode->lock_mutex); mutex_lock(&cinode->lock_mutex);
posix_test_lock(file, flock); posix_test_lock(file, flock);
...@@ -810,12 +812,15 @@ static int ...@@ -810,12 +812,15 @@ static int
cifs_posix_lock_set(struct file *file, struct file_lock *flock) cifs_posix_lock_set(struct file *file, struct file_lock *flock)
{ {
struct cifsInodeInfo *cinode = CIFS_I(file->f_path.dentry->d_inode); struct cifsInodeInfo *cinode = CIFS_I(file->f_path.dentry->d_inode);
int rc; int rc = 1;
if ((flock->fl_flags & FL_POSIX) == 0)
return rc;
mutex_lock(&cinode->lock_mutex); mutex_lock(&cinode->lock_mutex);
if (!cinode->can_cache_brlcks) { if (!cinode->can_cache_brlcks) {
mutex_unlock(&cinode->lock_mutex); mutex_unlock(&cinode->lock_mutex);
return 1; return rc;
} }
rc = posix_lock_file_wait(file, flock); rc = posix_lock_file_wait(file, flock);
mutex_unlock(&cinode->lock_mutex); mutex_unlock(&cinode->lock_mutex);
......
...@@ -683,7 +683,7 @@ CIFS_SessSetup(unsigned int xid, struct cifs_ses *ses, ...@@ -683,7 +683,7 @@ CIFS_SessSetup(unsigned int xid, struct cifs_ses *ses,
cpu_to_le16(CIFS_AUTH_RESP_SIZE); cpu_to_le16(CIFS_AUTH_RESP_SIZE);
/* calculate ntlm response and session key */ /* calculate ntlm response and session key */
rc = setup_ntlm_response(ses); rc = setup_ntlm_response(ses, nls_cp);
if (rc) { if (rc) {
cERROR(1, "Error %d during NTLM authentication", rc); cERROR(1, "Error %d during NTLM authentication", rc);
goto ssetup_exit; goto ssetup_exit;
......
...@@ -199,75 +199,36 @@ SMBencrypt(unsigned char *passwd, const unsigned char *c8, unsigned char *p24) ...@@ -199,75 +199,36 @@ SMBencrypt(unsigned char *passwd, const unsigned char *c8, unsigned char *p24)
return rc; return rc;
} }
/* Routines for Windows NT MD4 Hash functions. */
static int
_my_wcslen(__u16 *str)
{
int len = 0;
while (*str++ != 0)
len++;
return len;
}
/*
* Convert a string into an NT UNICODE string.
* Note that regardless of processor type
* this must be in intel (little-endian)
* format.
*/
static int
_my_mbstowcs(__u16 *dst, const unsigned char *src, int len)
{ /* BB not a very good conversion routine - change/fix */
int i;
__u16 val;
for (i = 0; i < len; i++) {
val = *src;
SSVAL(dst, 0, val);
dst++;
src++;
if (val == 0)
break;
}
return i;
}
/* /*
* Creates the MD4 Hash of the users password in NT UNICODE. * Creates the MD4 Hash of the users password in NT UNICODE.
*/ */
int int
E_md4hash(const unsigned char *passwd, unsigned char *p16) E_md4hash(const unsigned char *passwd, unsigned char *p16,
const struct nls_table *codepage)
{ {
int rc; int rc;
int len; int len;
__u16 wpwd[129]; __u16 wpwd[129];
/* Password cannot be longer than 128 characters */ /* Password cannot be longer than 128 characters */
if (passwd) { if (passwd) /* Password must be converted to NT unicode */
len = strlen((char *) passwd); len = cifs_strtoUCS(wpwd, passwd, 128, codepage);
if (len > 128) else {
len = 128;
/* Password must be converted to NT unicode */
_my_mbstowcs(wpwd, passwd, len);
} else
len = 0; len = 0;
*wpwd = 0; /* Ensure string is null terminated */
}
wpwd[len] = 0; /* Ensure string is null terminated */ rc = mdfour(p16, (unsigned char *) wpwd, len * sizeof(__u16));
/* Calculate length in bytes */ memset(wpwd, 0, 129 * sizeof(__u16));
len = _my_wcslen(wpwd) * sizeof(__u16);
rc = mdfour(p16, (unsigned char *) wpwd, len);
memset(wpwd, 0, 129 * 2);
return rc; return rc;
} }
/* Does the NT MD4 hash then des encryption. */ /* Does the NT MD4 hash then des encryption. */
int int
SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24) SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24,
const struct nls_table *codepage)
{ {
int rc; int rc;
unsigned char p16[16], p21[21]; unsigned char p16[16], p21[21];
...@@ -275,7 +236,7 @@ SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24) ...@@ -275,7 +236,7 @@ SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24)
memset(p16, '\0', 16); memset(p16, '\0', 16);
memset(p21, '\0', 21); memset(p21, '\0', 21);
rc = E_md4hash(passwd, p16); rc = E_md4hash(passwd, p16, codepage);
if (rc) { if (rc) {
cFYI(1, "%s Can't generate NT hash, error: %d", __func__, rc); cFYI(1, "%s Can't generate NT hash, error: %d", __func__, rc);
return rc; return rc;
......
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