Commit 50c2f753 authored by Steve French's avatar Steve French

[CIFS] whitespace/formatting fixes

This should be the last big batch of whitespace/formatting fixes.
checkpatch warnings for the cifs directory are down about 90% and
many of the remaining ones are harder to remove or make the code
harder to read.
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 7521a3c5
...@@ -459,7 +459,7 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -459,7 +459,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
unsigned int cls, con, tag, oidlen, rc; unsigned int cls, con, tag, oidlen, rc;
int use_ntlmssp = FALSE; int use_ntlmssp = FALSE;
*secType = NTLM; /* BB eventually make Kerberos or NLTMSSP the default */ *secType = NTLM; /* BB eventually make Kerberos or NLTMSSP the default*/
/* cifs_dump_mem(" Received SecBlob ", security_blob, length); */ /* cifs_dump_mem(" Received SecBlob ", security_blob, length); */
...@@ -498,7 +498,8 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -498,7 +498,8 @@ decode_negTokenInit(unsigned char *security_blob, int length,
return 0; return 0;
} else if ((cls != ASN1_CTX) || (con != ASN1_CON) } else if ((cls != ASN1_CTX) || (con != ASN1_CON)
|| (tag != ASN1_EOC)) { || (tag != ASN1_EOC)) {
cFYI(1,("cls = %d con = %d tag = %d end = %p (%d) exit 0", cFYI(1,
("cls = %d con = %d tag = %d end = %p (%d) exit 0",
cls, con, tag, end, *end)); cls, con, tag, end, *end));
return 0; return 0;
} }
...@@ -508,7 +509,8 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -508,7 +509,8 @@ decode_negTokenInit(unsigned char *security_blob, int length,
return 0; return 0;
} else if ((cls != ASN1_UNI) || (con != ASN1_CON) } else if ((cls != ASN1_UNI) || (con != ASN1_CON)
|| (tag != ASN1_SEQ)) { || (tag != ASN1_SEQ)) {
cFYI(1,("cls = %d con = %d tag = %d end = %p (%d) exit 1", cFYI(1,
("cls = %d con = %d tag = %d end = %p (%d) exit 1",
cls, con, tag, end, *end)); cls, con, tag, end, *end));
return 0; return 0;
} }
...@@ -540,32 +542,34 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -540,32 +542,34 @@ decode_negTokenInit(unsigned char *security_blob, int length,
rc = asn1_header_decode(&ctx, &end, &cls, &con, &tag); rc = asn1_header_decode(&ctx, &end, &cls, &con, &tag);
if (!rc) { if (!rc) {
cFYI(1, cFYI(1,
("Error 1 decoding negTokenInit header exit 2")); ("Error decoding negTokenInit hdr exit2"));
return 0; return 0;
} }
if ((tag == ASN1_OJI) && (con == ASN1_PRI)) { if ((tag == ASN1_OJI) && (con == ASN1_PRI)) {
rc = asn1_oid_decode(&ctx, end, &oid, &oidlen); rc = asn1_oid_decode(&ctx, end, &oid, &oidlen);
if(rc) { if (rc) {
cFYI(1, cFYI(1,
("OID len = %d oid = 0x%lx 0x%lx 0x%lx 0x%lx", ("OID len = %d oid = 0x%lx 0x%lx "
oidlen, *oid, *(oid + 1), *(oid + 2), "0x%lx 0x%lx",
*(oid + 3))); oidlen, *oid, *(oid + 1),
rc = compare_oid(oid, oidlen, NTLMSSP_OID, *(oid + 2), *(oid + 3)));
NTLMSSP_OID_LEN); rc = compare_oid(oid, oidlen,
NTLMSSP_OID, NTLMSSP_OID_LEN);
kfree(oid); kfree(oid);
if (rc) if (rc)
use_ntlmssp = TRUE; use_ntlmssp = TRUE;
} }
} else { } else {
cFYI(1,("This should be an oid what is going on? ")); cFYI(1, ("Should be an oid what is going on?"));
} }
} }
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
cFYI(1, cFYI(1,
("Error decoding last part of negTokenInit exit 3")); ("Error decoding last part negTokenInit exit3"));
return 0; return 0;
} else if ((cls != ASN1_CTX) || (con != ASN1_CON)) { /* tag = 3 indicating mechListMIC */ } else if ((cls != ASN1_CTX) || (con != ASN1_CON)) {
/* tag = 3 indicating mechListMIC */
cFYI(1, cFYI(1,
("Exit 4 cls = %d con = %d tag = %d end = %p (%d)", ("Exit 4 cls = %d con = %d tag = %d end = %p (%d)",
cls, con, tag, end, *end)); cls, con, tag, end, *end));
...@@ -573,7 +577,7 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -573,7 +577,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
} }
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
cFYI(1, cFYI(1,
("Error decoding last part of negTokenInit exit 5")); ("Error decoding last part negTokenInit exit5"));
return 0; return 0;
} else if ((cls != ASN1_UNI) || (con != ASN1_CON) } else if ((cls != ASN1_UNI) || (con != ASN1_CON)
|| (tag != ASN1_SEQ)) { || (tag != ASN1_SEQ)) {
...@@ -584,7 +588,7 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -584,7 +588,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
cFYI(1, cFYI(1,
("Error decoding last part of negTokenInit exit 7")); ("Error decoding last part negTokenInit exit 7"));
return 0; return 0;
} else if ((cls != ASN1_CTX) || (con != ASN1_CON)) { } else if ((cls != ASN1_CTX) || (con != ASN1_CON)) {
cFYI(1, cFYI(1,
...@@ -594,16 +598,17 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -594,16 +598,17 @@ decode_negTokenInit(unsigned char *security_blob, int length,
} }
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
cFYI(1, cFYI(1,
("Error decoding last part of negTokenInit exit 9")); ("Error decoding last part negTokenInit exit9"));
return 0; return 0;
} else if ((cls != ASN1_UNI) || (con != ASN1_PRI) } else if ((cls != ASN1_UNI) || (con != ASN1_PRI)
|| (tag != ASN1_GENSTR)) { || (tag != ASN1_GENSTR)) {
cFYI(1, cFYI(1,
("Exit 10 cls = %d con = %d tag = %d end = %p (%d)", ("Exit10 cls = %d con = %d tag = %d end = %p (%d)",
cls, con, tag, end, *end)); cls, con, tag, end, *end));
return 0; return 0;
} }
cFYI(1, ("Need to call asn1_octets_decode() function for this %s", ctx.pointer)); /* is this UTF-8 or ASCII? */ cFYI(1, ("Need to call asn1_octets_decode() function for %s",
ctx.pointer)); /* is this UTF-8 or ASCII? */
} }
/* if (use_kerberos) /* if (use_kerberos)
......
...@@ -145,7 +145,6 @@ cifs_debug_data_read(char *buf, char **beginBuffer, off_t offset, ...@@ -145,7 +145,6 @@ cifs_debug_data_read(char *buf, char **beginBuffer, off_t offset,
(ses->serverNOS == NULL)) { (ses->serverNOS == NULL)) {
buf += sprintf(buf, "\nentry for %s not fully " buf += sprintf(buf, "\nentry for %s not fully "
"displayed\n\t", ses->serverName); "displayed\n\t", ses->serverName);
} else { } else {
length = length =
sprintf(buf, sprintf(buf,
......
...@@ -43,6 +43,6 @@ struct cifs_sb_info { ...@@ -43,6 +43,6 @@ struct cifs_sb_info {
mode_t mnt_dir_mode; mode_t mnt_dir_mode;
int mnt_cifs_flags; int mnt_cifs_flags;
int prepathlen; int prepathlen;
char * prepath; char *prepath;
}; };
#endif /* _CIFS_FS_SB_H */ #endif /* _CIFS_FS_SB_H */
...@@ -66,7 +66,7 @@ cifs_strtoUCS(__le16 * to, const char *from, int len, ...@@ -66,7 +66,7 @@ cifs_strtoUCS(__le16 * to, const char *from, int len,
{ {
int charlen; int charlen;
int i; int i;
wchar_t * wchar_to = (wchar_t *)to; /* needed to quiet sparse */ wchar_t *wchar_to = (wchar_t *)to; /* needed to quiet sparse */
for (i = 0; len && *from; i++, from += charlen, len -= charlen) { for (i = 0; len && *from; i++, from += charlen, len -= charlen) {
......
...@@ -70,7 +70,7 @@ int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *); ...@@ -70,7 +70,7 @@ int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *);
* Address of the first string * Address of the first string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrcat(wchar_t * ucs1, const wchar_t * ucs2) UniStrcat(wchar_t *ucs1, const wchar_t *ucs2)
{ {
wchar_t *anchor = ucs1; /* save a pointer to start of ucs1 */ wchar_t *anchor = ucs1; /* save a pointer to start of ucs1 */
...@@ -88,7 +88,7 @@ UniStrcat(wchar_t * ucs1, const wchar_t * ucs2) ...@@ -88,7 +88,7 @@ UniStrcat(wchar_t * ucs1, const wchar_t * ucs2)
* or NULL if the character is not in the string * or NULL if the character is not in the string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrchr(const wchar_t * ucs, wchar_t uc) UniStrchr(const wchar_t *ucs, wchar_t uc)
{ {
while ((*ucs != uc) && *ucs) while ((*ucs != uc) && *ucs)
ucs++; ucs++;
...@@ -107,7 +107,7 @@ UniStrchr(const wchar_t * ucs, wchar_t uc) ...@@ -107,7 +107,7 @@ UniStrchr(const wchar_t * ucs, wchar_t uc)
* > 0: First string is greater than second * > 0: First string is greater than second
*/ */
static inline int static inline int
UniStrcmp(const wchar_t * ucs1, const wchar_t * ucs2) UniStrcmp(const wchar_t *ucs1, const wchar_t *ucs2)
{ {
while ((*ucs1 == *ucs2) && *ucs1) { while ((*ucs1 == *ucs2) && *ucs1) {
ucs1++; ucs1++;
...@@ -120,7 +120,7 @@ UniStrcmp(const wchar_t * ucs1, const wchar_t * ucs2) ...@@ -120,7 +120,7 @@ UniStrcmp(const wchar_t * ucs1, const wchar_t * ucs2)
* UniStrcpy: Copy a string * UniStrcpy: Copy a string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrcpy(wchar_t * ucs1, const wchar_t * ucs2) UniStrcpy(wchar_t *ucs1, const wchar_t *ucs2)
{ {
wchar_t *anchor = ucs1; /* save the start of result string */ wchar_t *anchor = ucs1; /* save the start of result string */
...@@ -132,7 +132,7 @@ UniStrcpy(wchar_t * ucs1, const wchar_t * ucs2) ...@@ -132,7 +132,7 @@ UniStrcpy(wchar_t * ucs1, const wchar_t * ucs2)
* UniStrlen: Return the length of a string (in 16 bit Unicode chars not bytes) * UniStrlen: Return the length of a string (in 16 bit Unicode chars not bytes)
*/ */
static inline size_t static inline size_t
UniStrlen(const wchar_t * ucs1) UniStrlen(const wchar_t *ucs1)
{ {
int i = 0; int i = 0;
...@@ -146,7 +146,7 @@ UniStrlen(const wchar_t * ucs1) ...@@ -146,7 +146,7 @@ UniStrlen(const wchar_t * ucs1)
* string (length limited) * string (length limited)
*/ */
static inline size_t static inline size_t
UniStrnlen(const wchar_t * ucs1, int maxlen) UniStrnlen(const wchar_t *ucs1, int maxlen)
{ {
int i = 0; int i = 0;
...@@ -162,7 +162,7 @@ UniStrnlen(const wchar_t * ucs1, int maxlen) ...@@ -162,7 +162,7 @@ UniStrnlen(const wchar_t * ucs1, int maxlen)
* UniStrncat: Concatenate length limited string * UniStrncat: Concatenate length limited string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrncat(wchar_t * ucs1, const wchar_t * ucs2, size_t n) UniStrncat(wchar_t *ucs1, const wchar_t *ucs2, size_t n)
{ {
wchar_t *anchor = ucs1; /* save pointer to string 1 */ wchar_t *anchor = ucs1; /* save pointer to string 1 */
...@@ -180,7 +180,7 @@ UniStrncat(wchar_t * ucs1, const wchar_t * ucs2, size_t n) ...@@ -180,7 +180,7 @@ UniStrncat(wchar_t * ucs1, const wchar_t * ucs2, size_t n)
* UniStrncmp: Compare length limited string * UniStrncmp: Compare length limited string
*/ */
static inline int static inline int
UniStrncmp(const wchar_t * ucs1, const wchar_t * ucs2, size_t n) UniStrncmp(const wchar_t *ucs1, const wchar_t *ucs2, size_t n)
{ {
if (!n) if (!n)
return 0; /* Null strings are equal */ return 0; /* Null strings are equal */
...@@ -195,7 +195,7 @@ UniStrncmp(const wchar_t * ucs1, const wchar_t * ucs2, size_t n) ...@@ -195,7 +195,7 @@ UniStrncmp(const wchar_t * ucs1, const wchar_t * ucs2, size_t n)
* UniStrncmp_le: Compare length limited string - native to little-endian * UniStrncmp_le: Compare length limited string - native to little-endian
*/ */
static inline int static inline int
UniStrncmp_le(const wchar_t * ucs1, const wchar_t * ucs2, size_t n) UniStrncmp_le(const wchar_t *ucs1, const wchar_t *ucs2, size_t n)
{ {
if (!n) if (!n)
return 0; /* Null strings are equal */ return 0; /* Null strings are equal */
...@@ -210,7 +210,7 @@ UniStrncmp_le(const wchar_t * ucs1, const wchar_t * ucs2, size_t n) ...@@ -210,7 +210,7 @@ UniStrncmp_le(const wchar_t * ucs1, const wchar_t * ucs2, size_t n)
* UniStrncpy: Copy length limited string with pad * UniStrncpy: Copy length limited string with pad
*/ */
static inline wchar_t * static inline wchar_t *
UniStrncpy(wchar_t * ucs1, const wchar_t * ucs2, size_t n) UniStrncpy(wchar_t *ucs1, const wchar_t *ucs2, size_t n)
{ {
wchar_t *anchor = ucs1; wchar_t *anchor = ucs1;
...@@ -227,7 +227,7 @@ UniStrncpy(wchar_t * ucs1, const wchar_t * ucs2, size_t n) ...@@ -227,7 +227,7 @@ UniStrncpy(wchar_t * ucs1, const wchar_t * ucs2, size_t n)
* UniStrncpy_le: Copy length limited string with pad to little-endian * UniStrncpy_le: Copy length limited string with pad to little-endian
*/ */
static inline wchar_t * static inline wchar_t *
UniStrncpy_le(wchar_t * ucs1, const wchar_t * ucs2, size_t n) UniStrncpy_le(wchar_t *ucs1, const wchar_t *ucs2, size_t n)
{ {
wchar_t *anchor = ucs1; wchar_t *anchor = ucs1;
...@@ -248,7 +248,7 @@ UniStrncpy_le(wchar_t * ucs1, const wchar_t * ucs2, size_t n) ...@@ -248,7 +248,7 @@ UniStrncpy_le(wchar_t * ucs1, const wchar_t * ucs2, size_t n)
* NULL if no matching string is found * NULL if no matching string is found
*/ */
static inline wchar_t * static inline wchar_t *
UniStrstr(const wchar_t * ucs1, const wchar_t * ucs2) UniStrstr(const wchar_t *ucs1, const wchar_t *ucs2)
{ {
const wchar_t *anchor1 = ucs1; const wchar_t *anchor1 = ucs1;
const wchar_t *anchor2 = ucs2; const wchar_t *anchor2 = ucs2;
...@@ -298,7 +298,7 @@ UniToupper(register wchar_t uc) ...@@ -298,7 +298,7 @@ UniToupper(register wchar_t uc)
* UniStrupr: Upper case a unicode string * UniStrupr: Upper case a unicode string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrupr(register wchar_t * upin) UniStrupr(register wchar_t *upin)
{ {
register wchar_t *up; register wchar_t *up;
...@@ -339,7 +339,7 @@ UniTolower(wchar_t uc) ...@@ -339,7 +339,7 @@ UniTolower(wchar_t uc)
* UniStrlwr: Lower case a unicode string * UniStrlwr: Lower case a unicode string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrlwr(register wchar_t * upin) UniStrlwr(register wchar_t *upin)
{ {
register wchar_t *up; register wchar_t *up;
......
...@@ -98,9 +98,9 @@ static int cifs_calc_signature2(const struct kvec *iov, int n_vec, ...@@ -98,9 +98,9 @@ static int cifs_calc_signature2(const struct kvec *iov, int n_vec,
MD5Init(&context); MD5Init(&context);
MD5Update(&context, (char *)&key->data, key->len); MD5Update(&context, (char *)&key->data, key->len);
for (i=0;i<n_vec;i++) { for (i = 0; i < n_vec; i++) {
if (iov[i].iov_base == NULL) { if (iov[i].iov_base == NULL) {
cERROR(1 ,("null iovec entry")); cERROR(1, ("null iovec entry"));
return -EIO; return -EIO;
} else if (iov[i].iov_len == 0) } else if (iov[i].iov_len == 0)
break; /* bail out if we are sent nothing to sign */ break; /* bail out if we are sent nothing to sign */
...@@ -167,36 +167,38 @@ int cifs_verify_signature(struct smb_hdr *cifs_pdu, ...@@ -167,36 +167,38 @@ int cifs_verify_signature(struct smb_hdr *cifs_pdu,
return 0; return 0;
if (cifs_pdu->Command == SMB_COM_LOCKING_ANDX) { if (cifs_pdu->Command == SMB_COM_LOCKING_ANDX) {
struct smb_com_lock_req * pSMB = struct smb_com_lock_req *pSMB =
(struct smb_com_lock_req *)cifs_pdu; (struct smb_com_lock_req *)cifs_pdu;
if (pSMB->LockType & LOCKING_ANDX_OPLOCK_RELEASE) if (pSMB->LockType & LOCKING_ANDX_OPLOCK_RELEASE)
return 0; return 0;
} }
/* BB what if signatures are supposed to be on for session but server does not /* BB what if signatures are supposed to be on for session but
send one? BB */ server does not send one? BB */
/* Do not need to verify session setups with signature "BSRSPYL " */ /* Do not need to verify session setups with signature "BSRSPYL " */
if(memcmp(cifs_pdu->Signature.SecuritySignature,"BSRSPYL ",8)==0) if (memcmp(cifs_pdu->Signature.SecuritySignature, "BSRSPYL ", 8) == 0)
cFYI(1,("dummy signature received for smb command 0x%x",cifs_pdu->Command)); cFYI(1, ("dummy signature received for smb command 0x%x",
cifs_pdu->Command));
/* save off the origiginal signature so we can modify the smb and check /* save off the origiginal signature so we can modify the smb and check
its signature against what the server sent */ its signature against what the server sent */
memcpy(server_response_sig,cifs_pdu->Signature.SecuritySignature,8); memcpy(server_response_sig, cifs_pdu->Signature.SecuritySignature, 8);
cifs_pdu->Signature.Sequence.SequenceNumber = cpu_to_le32(expected_sequence_number); cifs_pdu->Signature.Sequence.SequenceNumber =
cpu_to_le32(expected_sequence_number);
cifs_pdu->Signature.Sequence.Reserved = 0; cifs_pdu->Signature.Sequence.Reserved = 0;
rc = cifs_calculate_signature(cifs_pdu, mac_key, rc = cifs_calculate_signature(cifs_pdu, mac_key,
what_we_think_sig_should_be); what_we_think_sig_should_be);
if(rc) if (rc)
return rc; return rc;
/* cifs_dump_mem("what we think it should be: ",
what_we_think_sig_should_be, 16); */
/* cifs_dump_mem("what we think it should be: ",what_we_think_sig_should_be,16); */ if (memcmp(server_response_sig, what_we_think_sig_should_be, 8))
if(memcmp(server_response_sig, what_we_think_sig_should_be, 8))
return -EACCES; return -EACCES;
else else
return 0; return 0;
...@@ -218,25 +220,25 @@ int cifs_calculate_mac_key(struct mac_key *key, const char *rn, ...@@ -218,25 +220,25 @@ int cifs_calculate_mac_key(struct mac_key *key, const char *rn,
return 0; return 0;
} }
int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses, int CalcNTLMv2_partial_mac_key(struct cifsSesInfo *ses,
const struct nls_table * nls_info) const struct nls_table *nls_info)
{ {
char temp_hash[16]; char temp_hash[16];
struct HMACMD5Context ctx; struct HMACMD5Context ctx;
char * ucase_buf; char *ucase_buf;
__le16 * unicode_buf; __le16 *unicode_buf;
unsigned int i,user_name_len,dom_name_len; unsigned int i, user_name_len, dom_name_len;
if(ses == NULL) if (ses == NULL)
return -EINVAL; return -EINVAL;
E_md4hash(ses->password, temp_hash); E_md4hash(ses->password, temp_hash);
hmac_md5_init_limK_to_64(temp_hash, 16, &ctx); hmac_md5_init_limK_to_64(temp_hash, 16, &ctx);
user_name_len = strlen(ses->userName); user_name_len = strlen(ses->userName);
if(user_name_len > MAX_USERNAME_SIZE) if (user_name_len > MAX_USERNAME_SIZE)
return -EINVAL; return -EINVAL;
if(ses->domainName == NULL) if (ses->domainName == NULL)
return -EINVAL; /* BB should we use CIFS_LINUX_DOM */ return -EINVAL; /* BB should we use CIFS_LINUX_DOM */
dom_name_len = strlen(ses->domainName); dom_name_len = strlen(ses->domainName);
if (dom_name_len > MAX_USERNAME_SIZE) if (dom_name_len > MAX_USERNAME_SIZE)
...@@ -251,17 +253,19 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses, ...@@ -251,17 +253,19 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses,
return -ENOMEM; return -ENOMEM;
} }
for (i = 0;i < user_name_len; i++) for (i = 0; i < user_name_len; i++)
ucase_buf[i] = nls_info->charset2upper[(int)ses->userName[i]]; ucase_buf[i] = nls_info->charset2upper[(int)ses->userName[i]];
ucase_buf[i] = 0; ucase_buf[i] = 0;
user_name_len = cifs_strtoUCS(unicode_buf, ucase_buf, MAX_USERNAME_SIZE*2, nls_info); user_name_len = cifs_strtoUCS(unicode_buf, ucase_buf,
MAX_USERNAME_SIZE*2, nls_info);
unicode_buf[user_name_len] = 0; unicode_buf[user_name_len] = 0;
user_name_len++; user_name_len++;
for (i = 0; i < dom_name_len; i++) for (i = 0; i < dom_name_len; i++)
ucase_buf[i] = nls_info->charset2upper[(int)ses->domainName[i]]; ucase_buf[i] = nls_info->charset2upper[(int)ses->domainName[i]];
ucase_buf[i] = 0; ucase_buf[i] = 0;
dom_name_len = cifs_strtoUCS(unicode_buf+user_name_len, ucase_buf, MAX_USERNAME_SIZE*2, nls_info); dom_name_len = cifs_strtoUCS(unicode_buf+user_name_len, ucase_buf,
MAX_USERNAME_SIZE*2, nls_info);
unicode_buf[user_name_len + dom_name_len] = 0; unicode_buf[user_name_len + dom_name_len] = 0;
hmac_md5_update((const unsigned char *) unicode_buf, hmac_md5_update((const unsigned char *) unicode_buf,
...@@ -274,21 +278,22 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses, ...@@ -274,21 +278,22 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses,
} }
#ifdef CONFIG_CIFS_WEAK_PW_HASH #ifdef CONFIG_CIFS_WEAK_PW_HASH
void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key) void calc_lanman_hash(struct cifsSesInfo *ses, char *lnm_session_key)
{ {
int i; int i;
char password_with_pad[CIFS_ENCPWD_SIZE]; char password_with_pad[CIFS_ENCPWD_SIZE];
if(ses->server == NULL) if (ses->server == NULL)
return; return;
memset(password_with_pad, 0, CIFS_ENCPWD_SIZE); memset(password_with_pad, 0, CIFS_ENCPWD_SIZE);
if(ses->password) if (ses->password)
strncpy(password_with_pad, ses->password, CIFS_ENCPWD_SIZE); strncpy(password_with_pad, ses->password, CIFS_ENCPWD_SIZE);
if((ses->server->secMode & SECMODE_PW_ENCRYPT) == 0) if ((ses->server->secMode & SECMODE_PW_ENCRYPT) == 0)
if(extended_security & CIFSSEC_MAY_PLNTXT) { if (extended_security & CIFSSEC_MAY_PLNTXT) {
memcpy(lnm_session_key, password_with_pad, CIFS_ENCPWD_SIZE); memcpy(lnm_session_key, password_with_pad,
CIFS_ENCPWD_SIZE);
return; return;
} }
...@@ -303,7 +308,7 @@ void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key) ...@@ -303,7 +308,7 @@ void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key)
utf8 and other multibyte codepages each need their own strupper utf8 and other multibyte codepages each need their own strupper
function since a byte at a time will ont work. */ function since a byte at a time will ont work. */
for(i = 0; i < CIFS_ENCPWD_SIZE; i++) { for (i = 0; i < CIFS_ENCPWD_SIZE; i++) {
password_with_pad[i] = toupper(password_with_pad[i]); password_with_pad[i] = toupper(password_with_pad[i]);
} }
...@@ -314,18 +319,18 @@ void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key) ...@@ -314,18 +319,18 @@ void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key)
#endif /* CIFS_WEAK_PW_HASH */ #endif /* CIFS_WEAK_PW_HASH */
static int calc_ntlmv2_hash(struct cifsSesInfo *ses, static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
const struct nls_table * nls_cp) const struct nls_table *nls_cp)
{ {
int rc = 0; int rc = 0;
int len; int len;
char nt_hash[16]; char nt_hash[16];
struct HMACMD5Context * pctxt; struct HMACMD5Context *pctxt;
wchar_t * user; wchar_t *user;
wchar_t * domain; wchar_t *domain;
pctxt = kmalloc(sizeof(struct HMACMD5Context), GFP_KERNEL); pctxt = kmalloc(sizeof(struct HMACMD5Context), GFP_KERNEL);
if(pctxt == NULL) if (pctxt == NULL)
return -ENOMEM; return -ENOMEM;
/* calculate md4 hash of password */ /* calculate md4 hash of password */
...@@ -337,18 +342,18 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses, ...@@ -337,18 +342,18 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
/* convert ses->userName to unicode and uppercase */ /* convert ses->userName to unicode and uppercase */
len = strlen(ses->userName); len = strlen(ses->userName);
user = kmalloc(2 + (len * 2), GFP_KERNEL); user = kmalloc(2 + (len * 2), GFP_KERNEL);
if(user == NULL) if (user == NULL)
goto calc_exit_2; goto calc_exit_2;
len = cifs_strtoUCS(user, ses->userName, len, nls_cp); len = cifs_strtoUCS(user, ses->userName, len, nls_cp);
UniStrupr(user); UniStrupr(user);
hmac_md5_update((char *)user, 2*len, pctxt); hmac_md5_update((char *)user, 2*len, pctxt);
/* convert ses->domainName to unicode and uppercase */ /* convert ses->domainName to unicode and uppercase */
if(ses->domainName) { if (ses->domainName) {
len = strlen(ses->domainName); len = strlen(ses->domainName);
domain = kmalloc(2 + (len * 2), GFP_KERNEL); domain = kmalloc(2 + (len * 2), GFP_KERNEL);
if(domain == NULL) if (domain == NULL)
goto calc_exit_1; goto calc_exit_1;
len = cifs_strtoUCS(domain, ses->domainName, len, nls_cp); len = cifs_strtoUCS(domain, ses->domainName, len, nls_cp);
/* the following line was removed since it didn't work well /* the following line was removed since it didn't work well
...@@ -370,11 +375,11 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses, ...@@ -370,11 +375,11 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
return rc; return rc;
} }
void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf, void setup_ntlmv2_rsp(struct cifsSesInfo *ses, char *resp_buf,
const struct nls_table * nls_cp) const struct nls_table *nls_cp)
{ {
int rc; int rc;
struct ntlmv2_resp * buf = (struct ntlmv2_resp *)resp_buf; struct ntlmv2_resp *buf = (struct ntlmv2_resp *)resp_buf;
struct HMACMD5Context context; struct HMACMD5Context context;
buf->blob_signature = cpu_to_le32(0x00000101); buf->blob_signature = cpu_to_le32(0x00000101);
...@@ -389,8 +394,8 @@ void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf, ...@@ -389,8 +394,8 @@ void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf,
/* calculate buf->ntlmv2_hash */ /* calculate buf->ntlmv2_hash */
rc = calc_ntlmv2_hash(ses, nls_cp); rc = calc_ntlmv2_hash(ses, nls_cp);
if(rc) if (rc)
cERROR(1,("could not get v2 hash rc %d",rc)); cERROR(1, ("could not get v2 hash rc %d", rc));
CalcNTLMv2_response(ses, resp_buf); CalcNTLMv2_response(ses, resp_buf);
/* now calculate the MAC key for NTLMv2 */ /* now calculate the MAC key for NTLMv2 */
...@@ -403,16 +408,17 @@ void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf, ...@@ -403,16 +408,17 @@ void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf,
ses->server->mac_signing_key.len = 16 + sizeof(struct ntlmv2_resp); ses->server->mac_signing_key.len = 16 + sizeof(struct ntlmv2_resp);
} }
void CalcNTLMv2_response(const struct cifsSesInfo * ses, char * v2_session_response) void CalcNTLMv2_response(const struct cifsSesInfo *ses,
char *v2_session_response)
{ {
struct HMACMD5Context context; struct HMACMD5Context context;
/* rest of v2 struct already generated */ /* rest of v2 struct already generated */
memcpy(v2_session_response + 8, ses->server->cryptKey,8); memcpy(v2_session_response + 8, ses->server->cryptKey, 8);
hmac_md5_init_limK_to_64(ses->server->ntlmv2_hash, 16, &context); hmac_md5_init_limK_to_64(ses->server->ntlmv2_hash, 16, &context);
hmac_md5_update(v2_session_response+8, hmac_md5_update(v2_session_response+8,
sizeof(struct ntlmv2_resp) - 8, &context); sizeof(struct ntlmv2_resp) - 8, &context);
hmac_md5_final(v2_session_response,&context); hmac_md5_final(v2_session_response, &context);
/* cifs_dump_mem("v2_sess_rsp: ", v2_session_response, 32); */ /* cifs_dump_mem("v2_sess_rsp: ", v2_session_response, 32); */
} }
...@@ -230,7 +230,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf) ...@@ -230,7 +230,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
longer available? */ longer available? */
} }
static int cifs_permission(struct inode * inode, int mask, struct nameidata *nd) static int cifs_permission(struct inode *inode, int mask, struct nameidata *nd)
{ {
struct cifs_sb_info *cifs_sb; struct cifs_sb_info *cifs_sb;
...@@ -317,15 +317,15 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m) ...@@ -317,15 +317,15 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m)
if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID) || if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID) ||
!(cifs_sb->tcon->ses->capabilities & CAP_UNIX)) !(cifs_sb->tcon->ses->capabilities & CAP_UNIX))
seq_printf(s, ",gid=%d", cifs_sb->mnt_gid); seq_printf(s, ",gid=%d", cifs_sb->mnt_gid);
seq_printf(s, ",rsize=%d",cifs_sb->rsize); seq_printf(s, ",rsize=%d", cifs_sb->rsize);
seq_printf(s, ",wsize=%d",cifs_sb->wsize); seq_printf(s, ",wsize=%d", cifs_sb->wsize);
} }
return 0; return 0;
} }
#ifdef CONFIG_CIFS_QUOTA #ifdef CONFIG_CIFS_QUOTA
int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid, int cifs_xquota_set(struct super_block *sb, int quota_type, qid_t qid,
struct fs_disk_quota * pdquota) struct fs_disk_quota *pdquota)
{ {
int xid; int xid;
int rc = 0; int rc = 0;
...@@ -340,7 +340,7 @@ int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid, ...@@ -340,7 +340,7 @@ int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid,
xid = GetXid(); xid = GetXid();
if (pTcon) { if (pTcon) {
cFYI(1,("set type: 0x%x id: %d",quota_type,qid)); cFYI(1, ("set type: 0x%x id: %d", quota_type, qid));
} else { } else {
return -EIO; return -EIO;
} }
...@@ -349,8 +349,8 @@ int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid, ...@@ -349,8 +349,8 @@ int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid,
return rc; return rc;
} }
int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid, int cifs_xquota_get(struct super_block *sb, int quota_type, qid_t qid,
struct fs_disk_quota * pdquota) struct fs_disk_quota *pdquota)
{ {
int xid; int xid;
int rc = 0; int rc = 0;
...@@ -364,7 +364,7 @@ int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid, ...@@ -364,7 +364,7 @@ int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid,
xid = GetXid(); xid = GetXid();
if (pTcon) { if (pTcon) {
cFYI(1,("set type: 0x%x id: %d",quota_type,qid)); cFYI(1, ("set type: 0x%x id: %d", quota_type, qid));
} else { } else {
rc = -EIO; rc = -EIO;
} }
...@@ -373,7 +373,7 @@ int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid, ...@@ -373,7 +373,7 @@ int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid,
return rc; return rc;
} }
int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation) int cifs_xstate_set(struct super_block *sb, unsigned int flags, int operation)
{ {
int xid; int xid;
int rc = 0; int rc = 0;
...@@ -387,7 +387,7 @@ int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation) ...@@ -387,7 +387,7 @@ int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation)
xid = GetXid(); xid = GetXid();
if (pTcon) { if (pTcon) {
cFYI(1,("flags: 0x%x operation: 0x%x",flags,operation)); cFYI(1, ("flags: 0x%x operation: 0x%x", flags, operation));
} else { } else {
rc = -EIO; rc = -EIO;
} }
...@@ -396,7 +396,7 @@ int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation) ...@@ -396,7 +396,7 @@ int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation)
return rc; return rc;
} }
int cifs_xstate_get(struct super_block * sb, struct fs_quota_stat *qstats) int cifs_xstate_get(struct super_block *sb, struct fs_quota_stat *qstats)
{ {
int xid; int xid;
int rc = 0; int rc = 0;
...@@ -410,7 +410,7 @@ int cifs_xstate_get(struct super_block * sb, struct fs_quota_stat *qstats) ...@@ -410,7 +410,7 @@ int cifs_xstate_get(struct super_block * sb, struct fs_quota_stat *qstats)
} }
xid = GetXid(); xid = GetXid();
if (pTcon) { if (pTcon) {
cFYI(1,("pqstats %p",qstats)); cFYI(1, ("pqstats %p", qstats));
} else { } else {
rc = -EIO; rc = -EIO;
} }
...@@ -427,10 +427,10 @@ static struct quotactl_ops cifs_quotactl_ops = { ...@@ -427,10 +427,10 @@ static struct quotactl_ops cifs_quotactl_ops = {
}; };
#endif #endif
static void cifs_umount_begin(struct vfsmount * vfsmnt, int flags) static void cifs_umount_begin(struct vfsmount *vfsmnt, int flags)
{ {
struct cifs_sb_info *cifs_sb; struct cifs_sb_info *cifs_sb;
struct cifsTconInfo * tcon; struct cifsTconInfo *tcon;
if (!(flags & MNT_FORCE)) if (!(flags & MNT_FORCE))
return; return;
...@@ -448,9 +448,8 @@ static void cifs_umount_begin(struct vfsmount * vfsmnt, int flags) ...@@ -448,9 +448,8 @@ static void cifs_umount_begin(struct vfsmount * vfsmnt, int flags)
/* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */ /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
/* cancel_notify_requests(tcon); */ /* cancel_notify_requests(tcon); */
if (tcon->ses && tcon->ses->server) if (tcon->ses && tcon->ses->server) {
{ cFYI(1, ("wake up tasks now - umount begin not complete"));
cFYI(1,("wake up tasks now - umount begin not complete"));
wake_up_all(&tcon->ses->server->request_q); wake_up_all(&tcon->ses->server->request_q);
wake_up_all(&tcon->ses->server->response_q); wake_up_all(&tcon->ses->server->response_q);
msleep(1); /* yield */ msleep(1); /* yield */
...@@ -484,9 +483,10 @@ static const struct super_operations cifs_super_ops = { ...@@ -484,9 +483,10 @@ static const struct super_operations cifs_super_ops = {
.alloc_inode = cifs_alloc_inode, .alloc_inode = cifs_alloc_inode,
.destroy_inode = cifs_destroy_inode, .destroy_inode = cifs_destroy_inode,
/* .drop_inode = generic_delete_inode, /* .drop_inode = generic_delete_inode,
.delete_inode = cifs_delete_inode, *//* Do not need the above two functions .delete_inode = cifs_delete_inode, */ /* Do not need above two
unless later we add lazy close of inodes or unless the kernel forgets to call functions unless later we add lazy close of inodes or unless the
us with the same number of releases (closes) as opens */ kernel forgets to call us with the same number of releases (closes)
as opens */
.show_options = cifs_show_options, .show_options = cifs_show_options,
.umount_begin = cifs_umount_begin, .umount_begin = cifs_umount_begin,
.remount_fs = cifs_remount, .remount_fs = cifs_remount,
...@@ -700,7 +700,7 @@ const struct file_operations cifs_dir_ops = { ...@@ -700,7 +700,7 @@ const struct file_operations cifs_dir_ops = {
}; };
static void static void
cifs_init_once(void *inode, struct kmem_cache * cachep, unsigned long flags) cifs_init_once(void *inode, struct kmem_cache *cachep, unsigned long flags)
{ {
struct cifsInodeInfo *cifsi = inode; struct cifsInodeInfo *cifsi = inode;
...@@ -752,7 +752,7 @@ cifs_init_request_bufs(void) ...@@ -752,7 +752,7 @@ cifs_init_request_bufs(void)
cifs_min_rcv = 1; cifs_min_rcv = 1;
else if (cifs_min_rcv > 64) { else if (cifs_min_rcv > 64) {
cifs_min_rcv = 64; cifs_min_rcv = 64;
cERROR(1,("cifs_min_rcv set to maximum (64)")); cERROR(1, ("cifs_min_rcv set to maximum (64)"));
} }
cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv, cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
...@@ -844,7 +844,7 @@ cifs_destroy_mids(void) ...@@ -844,7 +844,7 @@ cifs_destroy_mids(void)
kmem_cache_destroy(cifs_oplock_cachep); kmem_cache_destroy(cifs_oplock_cachep);
} }
static int cifs_oplock_thread(void * dummyarg) static int cifs_oplock_thread(void *dummyarg)
{ {
struct oplock_q_entry *oplock_item; struct oplock_q_entry *oplock_item;
struct cifsTconInfo *pTcon; struct cifsTconInfo *pTcon;
...@@ -865,7 +865,7 @@ static int cifs_oplock_thread(void * dummyarg) ...@@ -865,7 +865,7 @@ static int cifs_oplock_thread(void * dummyarg)
oplock_item = list_entry(GlobalOplock_Q.next, oplock_item = list_entry(GlobalOplock_Q.next,
struct oplock_q_entry, qhead); struct oplock_q_entry, qhead);
if (oplock_item) { if (oplock_item) {
cFYI(1,("found oplock item to write out")); cFYI(1, ("found oplock item to write out"));
pTcon = oplock_item->tcon; pTcon = oplock_item->tcon;
inode = oplock_item->pinode; inode = oplock_item->pinode;
netfid = oplock_item->netfid; netfid = oplock_item->netfid;
...@@ -878,7 +878,8 @@ static int cifs_oplock_thread(void * dummyarg) ...@@ -878,7 +878,8 @@ static int cifs_oplock_thread(void * dummyarg)
/* mutex_lock(&inode->i_mutex);*/ /* mutex_lock(&inode->i_mutex);*/
if (S_ISREG(inode->i_mode)) { if (S_ISREG(inode->i_mode)) {
rc = filemap_fdatawrite(inode->i_mapping); rc = filemap_fdatawrite(inode->i_mapping);
if (CIFS_I(inode)->clientCanCacheRead == 0) { if (CIFS_I(inode)->clientCanCacheRead
== 0) {
filemap_fdatawait(inode->i_mapping); filemap_fdatawait(inode->i_mapping);
invalidate_remote_inode(inode); invalidate_remote_inode(inode);
} }
...@@ -913,7 +914,7 @@ static int cifs_oplock_thread(void * dummyarg) ...@@ -913,7 +914,7 @@ static int cifs_oplock_thread(void * dummyarg)
return 0; return 0;
} }
static int cifs_dnotify_thread(void * dummyarg) static int cifs_dnotify_thread(void *dummyarg)
{ {
struct list_head *tmp; struct list_head *tmp;
struct cifsSesInfo *ses; struct cifsSesInfo *ses;
......
...@@ -45,7 +45,7 @@ extern void cifs_read_inode(struct inode *); ...@@ -45,7 +45,7 @@ extern void cifs_read_inode(struct inode *);
extern const struct inode_operations cifs_dir_inode_ops; extern const struct inode_operations cifs_dir_inode_ops;
extern int cifs_create(struct inode *, struct dentry *, int, extern int cifs_create(struct inode *, struct dentry *, int,
struct nameidata *); struct nameidata *);
extern struct dentry * cifs_lookup(struct inode *, struct dentry *, extern struct dentry *cifs_lookup(struct inode *, struct dentry *,
struct nameidata *); struct nameidata *);
extern int cifs_unlink(struct inode *, struct dentry *); extern int cifs_unlink(struct inode *, struct dentry *);
extern int cifs_hardlink(struct dentry *, struct inode *, struct dentry *); extern int cifs_hardlink(struct dentry *, struct inode *, struct dentry *);
...@@ -70,9 +70,9 @@ extern int cifs_open(struct inode *inode, struct file *file); ...@@ -70,9 +70,9 @@ extern int cifs_open(struct inode *inode, struct file *file);
extern int cifs_close(struct inode *inode, struct file *file); extern int cifs_close(struct inode *inode, struct file *file);
extern int cifs_closedir(struct inode *inode, struct file *file); extern int cifs_closedir(struct inode *inode, struct file *file);
extern ssize_t cifs_user_read(struct file *file, char __user *read_data, extern ssize_t cifs_user_read(struct file *file, char __user *read_data,
size_t read_size, loff_t * poffset); size_t read_size, loff_t *poffset);
extern ssize_t cifs_user_write(struct file *file, const char __user *write_data, extern ssize_t cifs_user_write(struct file *file, const char __user *write_data,
size_t write_size, loff_t * poffset); size_t write_size, loff_t *poffset);
extern int cifs_lock(struct file *, int, struct file_lock *); extern int cifs_lock(struct file *, int, struct file_lock *);
extern int cifs_fsync(struct file *, struct dentry *, int); extern int cifs_fsync(struct file *, struct dentry *, int);
extern int cifs_flush(struct file *, fl_owner_t id); extern int cifs_flush(struct file *, fl_owner_t id);
......
...@@ -366,17 +366,19 @@ struct smb_hdr { ...@@ -366,17 +366,19 @@ struct smb_hdr {
#define pByteArea(smb_var) ((unsigned char *)smb_var + sizeof(struct smb_hdr) + (2* smb_var->WordCount) + 2 ) #define pByteArea(smb_var) ((unsigned char *)smb_var + sizeof(struct smb_hdr) + (2* smb_var->WordCount) + 2 )
/* /*
* Computer Name Length * Computer Name Length (since Netbios name was length 16 with last byte 0x20)
* No longer as important, now that TCP names are more commonly used to
* resolve hosts.
*/ */
#define CNLEN 15 #define CNLEN 15
/* /*
* Share Name Length @S8A * Share Name Length (SNLEN)
* Note: This length is limited by the SMB used to get @S8A * Note: This length was limited by the SMB used to get
* the Share info. NetShareEnum only returns 13 @S8A * the Share info. NetShareEnum only returned 13
* chars, including the null termination. @S8A * chars, including the null termination.
* This was removed because it no longer is limiting.
*/ */
#define SNLEN 12 /*@S8A */
/* /*
* Comment Length * Comment Length
...@@ -819,7 +821,8 @@ typedef struct smb_com_writex_req { ...@@ -819,7 +821,8 @@ typedef struct smb_com_writex_req {
__le16 DataLengthLow; __le16 DataLengthLow;
__le16 DataOffset; __le16 DataOffset;
__le16 ByteCount; __le16 ByteCount;
__u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */ __u8 Pad; /* BB check for whether padded to DWORD
boundary and optimum performance here */
char Data[0]; char Data[0];
} __attribute__((packed)) WRITEX_REQ; } __attribute__((packed)) WRITEX_REQ;
...@@ -838,7 +841,8 @@ typedef struct smb_com_write_req { ...@@ -838,7 +841,8 @@ typedef struct smb_com_write_req {
__le16 DataOffset; __le16 DataOffset;
__le32 OffsetHigh; __le32 OffsetHigh;
__le16 ByteCount; __le16 ByteCount;
__u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */ __u8 Pad; /* BB check for whether padded to DWORD
boundary and optimum performance here */
char Data[0]; char Data[0];
} __attribute__((packed)) WRITE_REQ; } __attribute__((packed)) WRITE_REQ;
...@@ -897,7 +901,8 @@ typedef struct smb_com_read_rsp { ...@@ -897,7 +901,8 @@ typedef struct smb_com_read_rsp {
__le16 DataLengthHigh; __le16 DataLengthHigh;
__u64 Reserved2; __u64 Reserved2;
__u16 ByteCount; __u16 ByteCount;
__u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */ __u8 Pad; /* BB check for whether padded to DWORD
boundary and optimum performance here */
char Data[1]; char Data[1];
} __attribute__((packed)) READ_RSP; } __attribute__((packed)) READ_RSP;
...@@ -1744,7 +1749,9 @@ typedef struct smb_com_transaction2_get_dfs_refer_req { ...@@ -1744,7 +1749,9 @@ typedef struct smb_com_transaction2_get_dfs_refer_req {
__u8 Reserved3; __u8 Reserved3;
__le16 SubCommand; /* one setup word */ __le16 SubCommand; /* one setup word */
__le16 ByteCount; __le16 ByteCount;
__u8 Pad[3]; /* Win2K has sent 0x0F01 (max resp length perhaps?) followed by one byte pad - doesn't seem to matter though */ __u8 Pad[3]; /* Win2K has sent 0x0F01 (max response length
perhaps?) followed by one byte pad - doesn't
seem to matter though */
__le16 MaxReferralLevel; __le16 MaxReferralLevel;
char RequestFileName[1]; char RequestFileName[1];
} __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_REQ; } __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_REQ;
...@@ -1753,7 +1760,10 @@ typedef struct dfs_referral_level_3 { ...@@ -1753,7 +1760,10 @@ typedef struct dfs_referral_level_3 {
__le16 VersionNumber; __le16 VersionNumber;
__le16 ReferralSize; __le16 ReferralSize;
__le16 ServerType; /* 0x0001 = CIFS server */ __le16 ServerType; /* 0x0001 = CIFS server */
__le16 ReferralFlags; /* or proximity - not clear which since always set to zero - SNIA spec says 0x01 means strip off PathConsumed chars before submitting RequestFileName to remote node */ __le16 ReferralFlags; /* or proximity - not clear which since it is
always set to zero - SNIA spec says 0x01
means strip off PathConsumed chars before
submitting RequestFileName to remote node */
__le16 TimeToLive; __le16 TimeToLive;
__le16 Proximity; __le16 Proximity;
__le16 DfsPathOffset; __le16 DfsPathOffset;
...@@ -1779,11 +1789,13 @@ typedef struct smb_com_transaction_get_dfs_refer_rsp { ...@@ -1779,11 +1789,13 @@ typedef struct smb_com_transaction_get_dfs_refer_rsp {
#define DFSREF_STORAGE_SERVER 0x0002 #define DFSREF_STORAGE_SERVER 0x0002
/* IOCTL information */ /* IOCTL information */
/* List of ioctl function codes that look to be of interest to remote clients like this. */ /*
/* Need to do some experimentation to make sure they all work remotely. */ * List of ioctl function codes that look to be of interest to remote clients
/* Some of the following such as the encryption/compression ones would be */ * like this one. Need to do some experimentation to make sure they all work
/* invoked from tools via a specialized hook into the VFS rather than via the */ * remotely. Some of the following, such as the encryption/compression ones
/* standard vfs entry points */ * would be invoked from tools via a specialized hook into the VFS rather
* than via the standard vfs entry points
*/
#define FSCTL_REQUEST_OPLOCK_LEVEL_1 0x00090000 #define FSCTL_REQUEST_OPLOCK_LEVEL_1 0x00090000
#define FSCTL_REQUEST_OPLOCK_LEVEL_2 0x00090004 #define FSCTL_REQUEST_OPLOCK_LEVEL_2 0x00090004
#define FSCTL_REQUEST_BATCH_OPLOCK 0x00090008 #define FSCTL_REQUEST_BATCH_OPLOCK 0x00090008
...@@ -1872,7 +1884,7 @@ typedef struct { ...@@ -1872,7 +1884,7 @@ typedef struct {
__le16 MajorVersionNumber; __le16 MajorVersionNumber;
__le16 MinorVersionNumber; __le16 MinorVersionNumber;
__le64 Capability; __le64 Capability;
} __attribute__((packed)) FILE_SYSTEM_UNIX_INFO; /* Unix extensions info, level 0x200 */ } __attribute__((packed)) FILE_SYSTEM_UNIX_INFO; /* Unix extension level 0x200*/
/* Version numbers for CIFS UNIX major and minor. */ /* Version numbers for CIFS UNIX major and minor. */
#define CIFS_UNIX_MAJOR_VERSION 1 #define CIFS_UNIX_MAJOR_VERSION 1
...@@ -2296,7 +2308,7 @@ struct fealist { ...@@ -2296,7 +2308,7 @@ struct fealist {
struct data_blob { struct data_blob {
__u8 *data; __u8 *data;
size_t length; size_t length;
void (*free) (struct data_blob * data_blob); void (*free) (struct data_blob *data_blob);
} __attribute__((packed)); } __attribute__((packed));
...@@ -2362,8 +2374,10 @@ struct data_blob { ...@@ -2362,8 +2374,10 @@ struct data_blob {
T2 SET_PATH_INFO (SMB_SET_FILE_UNIX_LINK) for symlinks T2 SET_PATH_INFO (SMB_SET_FILE_UNIX_LINK) for symlinks
T2 SET_PATH_INFO (SMB_SET_FILE_BASIC_INFO2) T2 SET_PATH_INFO (SMB_SET_FILE_BASIC_INFO2)
T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_LINK) T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_LINK)
T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_BASIC) - BB check for missing inode fields T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_BASIC) BB check for missing
Actually need QUERY_FILE_UNIX_INFO since has inode num inode fields
Actually a need QUERY_FILE_UNIX_INFO
since has inode num
BB what about a) blksize/blkbits/blocks BB what about a) blksize/blkbits/blocks
b) i_version b) i_version
c) i_rdev c) i_rdev
...@@ -2373,8 +2387,6 @@ struct data_blob { ...@@ -2373,8 +2387,6 @@ struct data_blob {
T2 FIND_FIRST/FIND_NEXT FIND_FILE_UNIX T2 FIND_FIRST/FIND_NEXT FIND_FILE_UNIX
TRANS2_GET_DFS_REFERRAL - OPTIONAL but recommended TRANS2_GET_DFS_REFERRAL - OPTIONAL but recommended
T2_QFS_INFO QueryDevice/AttributeInfo - OPTIONAL T2_QFS_INFO QueryDevice/AttributeInfo - OPTIONAL
*/ */
/* xsymlink is a symlink format (used by MacOS) that can be used /* xsymlink is a symlink format (used by MacOS) that can be used
...@@ -2410,7 +2422,8 @@ typedef struct file_xattr_info { ...@@ -2410,7 +2422,8 @@ typedef struct file_xattr_info {
__u32 xattr_value_len; __u32 xattr_value_len;
char xattr_name[0]; char xattr_name[0];
/* followed by xattr_value[xattr_value_len], no pad */ /* followed by xattr_value[xattr_value_len], no pad */
} __attribute__((packed)) FILE_XATTR_INFO; /* extended attribute, info level 0x205 */ } __attribute__((packed)) FILE_XATTR_INFO; /* extended attribute info
level 0x205 */
/* flags for chattr command */ /* flags for chattr command */
...@@ -2436,7 +2449,8 @@ typedef struct file_xattr_info { ...@@ -2436,7 +2449,8 @@ typedef struct file_xattr_info {
typedef struct file_chattr_info { typedef struct file_chattr_info {
__le64 mask; /* list of all possible attribute bits */ __le64 mask; /* list of all possible attribute bits */
__le64 mode; /* list of actual attribute bits on this inode */ __le64 mode; /* list of actual attribute bits on this inode */
} __attribute__((packed)) FILE_CHATTR_INFO; /* ext attributes (chattr, chflags) level 0x206 */ } __attribute__((packed)) FILE_CHATTR_INFO; /* ext attributes
(chattr, chflags) level 0x206 */
#endif #endif
......
...@@ -71,12 +71,12 @@ extern void header_assemble(struct smb_hdr *, char /* command */ , ...@@ -71,12 +71,12 @@ extern void header_assemble(struct smb_hdr *, char /* command */ ,
fixed section (word count) in two byte units */); fixed section (word count) in two byte units */);
extern int small_smb_init_no_tc(const int smb_cmd, const int wct, extern int small_smb_init_no_tc(const int smb_cmd, const int wct,
struct cifsSesInfo *ses, struct cifsSesInfo *ses,
void ** request_buf); void **request_buf);
extern int CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, extern int CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses,
const int stage, const int stage,
const struct nls_table *nls_cp); const struct nls_table *nls_cp);
extern __u16 GetNextMid(struct TCP_Server_Info *server); extern __u16 GetNextMid(struct TCP_Server_Info *server);
extern struct oplock_q_entry * AllocOplockQEntry(struct inode *, u16, extern struct oplock_q_entry *AllocOplockQEntry(struct inode *, u16,
struct cifsTconInfo *); struct cifsTconInfo *);
extern void DeleteOplockQEntry(struct oplock_q_entry *); extern void DeleteOplockQEntry(struct oplock_q_entry *);
extern struct timespec cifs_NTtimeToUnix(u64 /* utc nanoseconds since 1601 */ ); extern struct timespec cifs_NTtimeToUnix(u64 /* utc nanoseconds since 1601 */ );
...@@ -146,7 +146,7 @@ extern int get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -146,7 +146,7 @@ extern int get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
const char *old_path, const char *old_path,
const struct nls_table *nls_codepage, const struct nls_table *nls_codepage,
unsigned int *pnum_referrals, unsigned int *pnum_referrals,
unsigned char ** preferrals, unsigned char **preferrals,
int remap); int remap);
extern void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon, extern void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
struct super_block *sb, struct smb_vol *vol); struct super_block *sb, struct smb_vol *vol);
...@@ -323,7 +323,7 @@ extern ssize_t CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, ...@@ -323,7 +323,7 @@ extern ssize_t CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
size_t bufsize, const struct nls_table *nls_codepage, size_t bufsize, const struct nls_table *nls_codepage,
int remap_special_chars); int remap_special_chars);
extern ssize_t CIFSSMBQueryEA(const int xid, struct cifsTconInfo *tcon, extern ssize_t CIFSSMBQueryEA(const int xid, struct cifsTconInfo *tcon,
const unsigned char * searchName, const unsigned char *ea_name, const unsigned char *searchName, const unsigned char *ea_name,
unsigned char *ea_value, size_t buf_size, unsigned char *ea_value, size_t buf_size,
const struct nls_table *nls_codepage, int remap_special_chars); const struct nls_table *nls_codepage, int remap_special_chars);
extern int CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, extern int CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon,
......
...@@ -127,7 +127,7 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, ...@@ -127,7 +127,7 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
} }
} }
if ((tcon->ses) && (tcon->ses->status != CifsExiting) && if ((tcon->ses) && (tcon->ses->status != CifsExiting) &&
(tcon->ses->server)){ (tcon->ses->server)) {
struct nls_table *nls_codepage; struct nls_table *nls_codepage;
/* Give Demultiplex thread up to 10 seconds to /* Give Demultiplex thread up to 10 seconds to
reconnect, should be greater than cifs socket reconnect, should be greater than cifs socket
...@@ -139,14 +139,14 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, ...@@ -139,14 +139,14 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
/* on "soft" mounts we wait once */ /* on "soft" mounts we wait once */
if ((tcon->retry == FALSE) || if ((tcon->retry == FALSE) ||
(tcon->ses->status == CifsExiting)) { (tcon->ses->status == CifsExiting)) {
cFYI(1,("gave up waiting on reconnect in smb_init")); cFYI(1, ("gave up waiting on "
"reconnect in smb_init"));
return -EHOSTDOWN; return -EHOSTDOWN;
} /* else "hard" mount - keep retrying } /* else "hard" mount - keep retrying
until process is killed or server until process is killed or server
comes back on-line */ comes back on-line */
} else /* TCP session is reestablished now */ } else /* TCP session is reestablished now */
break; break;
} }
nls_codepage = load_nls_default(); nls_codepage = load_nls_default();
...@@ -174,14 +174,14 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, ...@@ -174,14 +174,14 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
atomic_inc(&tconInfoReconnectCount); atomic_inc(&tconInfoReconnectCount);
cFYI(1, ("reconnect tcon rc = %d", rc)); cFYI(1, ("reconnect tcon rc = %d", rc));
/* Removed call to reopen open files here - /* Removed call to reopen open files here.
it is safer (and faster) to reopen files It is safer (and faster) to reopen files
one at a time as needed in read and write */ one at a time as needed in read and write */
/* Check if handle based operation so we /* Check if handle based operation so we
know whether we can continue or not without know whether we can continue or not without
returning to caller to reset file handle */ returning to caller to reset file handle */
switch(smb_command) { switch (smb_command) {
case SMB_COM_READ_ANDX: case SMB_COM_READ_ANDX:
case SMB_COM_WRITE_ANDX: case SMB_COM_WRITE_ANDX:
case SMB_COM_CLOSE: case SMB_COM_CLOSE:
...@@ -222,7 +222,7 @@ small_smb_init_no_tc(const int smb_command, const int wct, ...@@ -222,7 +222,7 @@ small_smb_init_no_tc(const int smb_command, const int wct,
struct cifsSesInfo *ses, void **request_buf) struct cifsSesInfo *ses, void **request_buf)
{ {
int rc; int rc;
struct smb_hdr * buffer; struct smb_hdr *buffer;
rc = small_smb_init(smb_command, wct, NULL, request_buf); rc = small_smb_init(smb_command, wct, NULL, request_buf);
if (rc) if (rc)
...@@ -269,7 +269,7 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, ...@@ -269,7 +269,7 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
} }
if ((tcon->ses) && (tcon->ses->status != CifsExiting) && if ((tcon->ses) && (tcon->ses->status != CifsExiting) &&
(tcon->ses->server)){ (tcon->ses->server)) {
struct nls_table *nls_codepage; struct nls_table *nls_codepage;
/* Give Demultiplex thread up to 10 seconds to /* Give Demultiplex thread up to 10 seconds to
reconnect, should be greater than cifs socket reconnect, should be greater than cifs socket
...@@ -282,16 +282,15 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, ...@@ -282,16 +282,15 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
/* on "soft" mounts we wait once */ /* on "soft" mounts we wait once */
if ((tcon->retry == FALSE) || if ((tcon->retry == FALSE) ||
(tcon->ses->status == CifsExiting)) { (tcon->ses->status == CifsExiting)) {
cFYI(1,("gave up waiting on reconnect in smb_init")); cFYI(1, ("gave up waiting on "
"reconnect in smb_init"));
return -EHOSTDOWN; return -EHOSTDOWN;
} /* else "hard" mount - keep retrying } /* else "hard" mount - keep retrying
until process is killed or server until process is killed or server
comes on-line */ comes on-line */
} else /* TCP session is reestablished now */ } else /* TCP session is reestablished now */
break; break;
} }
nls_codepage = load_nls_default(); nls_codepage = load_nls_default();
/* need to prevent multiple threads trying to /* need to prevent multiple threads trying to
simultaneously reconnect the same SMB session */ simultaneously reconnect the same SMB session */
...@@ -317,14 +316,14 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, ...@@ -317,14 +316,14 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
atomic_inc(&tconInfoReconnectCount); atomic_inc(&tconInfoReconnectCount);
cFYI(1, ("reconnect tcon rc = %d", rc)); cFYI(1, ("reconnect tcon rc = %d", rc));
/* Removed call to reopen open files here - /* Removed call to reopen open files here.
it is safer (and faster) to reopen files It is safer (and faster) to reopen files
one at a time as needed in read and write */ one at a time as needed in read and write */
/* Check if handle based operation so we /* Check if handle based operation so we
know whether we can continue or not without know whether we can continue or not without
returning to caller to reset file handle */ returning to caller to reset file handle */
switch(smb_command) { switch (smb_command) {
case SMB_COM_READ_ANDX: case SMB_COM_READ_ANDX:
case SMB_COM_WRITE_ANDX: case SMB_COM_WRITE_ANDX:
case SMB_COM_CLOSE: case SMB_COM_CLOSE:
...@@ -367,11 +366,11 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, ...@@ -367,11 +366,11 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
return rc; return rc;
} }
static int validate_t2(struct smb_t2_rsp * pSMB) static int validate_t2(struct smb_t2_rsp *pSMB)
{ {
int rc = -EINVAL; int rc = -EINVAL;
int total_size; int total_size;
char * pBCC; char *pBCC;
/* check for plausible wct, bcc and t2 data and parm sizes */ /* check for plausible wct, bcc and t2 data and parm sizes */
/* check for parm and data offset going beyond end of smb */ /* check for parm and data offset going beyond end of smb */
...@@ -392,11 +391,10 @@ static int validate_t2(struct smb_t2_rsp * pSMB) ...@@ -392,11 +391,10 @@ static int validate_t2(struct smb_t2_rsp * pSMB)
CIFSMaxBufSize+MAX_CIFS_HDR_SIZE)) { CIFSMaxBufSize+MAX_CIFS_HDR_SIZE)) {
return 0; return 0;
} }
} }
} }
} }
cifs_dump_mem("Invalid transact2 SMB: ",(char *)pSMB, cifs_dump_mem("Invalid transact2 SMB: ", (char *)pSMB,
sizeof(struct smb_t2_rsp) + 16); sizeof(struct smb_t2_rsp) + 16);
return rc; return rc;
} }
...@@ -408,7 +406,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) ...@@ -408,7 +406,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
int rc = 0; int rc = 0;
int bytes_returned; int bytes_returned;
int i; int i;
struct TCP_Server_Info * server; struct TCP_Server_Info *server;
u16 count; u16 count;
unsigned int secFlags; unsigned int secFlags;
u16 dialect; u16 dialect;
...@@ -438,7 +436,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) ...@@ -438,7 +436,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC;
count = 0; count = 0;
for(i=0;i<CIFS_NUM_PROT;i++) { for (i = 0; i < CIFS_NUM_PROT; i++) {
strncpy(pSMB->DialectsArray+count, protocols[i].name, 16); strncpy(pSMB->DialectsArray+count, protocols[i].name, 16);
count += strlen(protocols[i].name) + 1; count += strlen(protocols[i].name) + 1;
/* null at end of source and target buffers anyway */ /* null at end of source and target buffers anyway */
...@@ -465,7 +463,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) ...@@ -465,7 +463,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
&& ((dialect == LANMAN_PROT) && ((dialect == LANMAN_PROT)
|| (dialect == LANMAN2_PROT))) { || (dialect == LANMAN2_PROT))) {
__s16 tmp; __s16 tmp;
struct lanman_neg_rsp * rsp = (struct lanman_neg_rsp *)pSMBr; struct lanman_neg_rsp *rsp = (struct lanman_neg_rsp *)pSMBr;
if ((secFlags & CIFSSEC_MAY_LANMAN) || if ((secFlags & CIFSSEC_MAY_LANMAN) ||
(secFlags & CIFSSEC_MAY_PLNTXT)) (secFlags & CIFSSEC_MAY_PLNTXT))
...@@ -504,7 +502,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) ...@@ -504,7 +502,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
utc = CURRENT_TIME; utc = CURRENT_TIME;
ts = cnvrtDosUnixTm(le16_to_cpu(rsp->SrvTime.Date), ts = cnvrtDosUnixTm(le16_to_cpu(rsp->SrvTime.Date),
le16_to_cpu(rsp->SrvTime.Time)); le16_to_cpu(rsp->SrvTime.Time));
cFYI(1,("SrvTime: %d sec since 1970 (utc: %d) diff: %d", cFYI(1, ("SrvTime %d sec since 1970 (utc: %d) diff: %d",
(int)ts.tv_sec, (int)utc.tv_sec, (int)ts.tv_sec, (int)utc.tv_sec,
(int)(utc.tv_sec - ts.tv_sec))); (int)(utc.tv_sec - ts.tv_sec)));
val = (int)(utc.tv_sec - ts.tv_sec); val = (int)(utc.tv_sec - ts.tv_sec);
...@@ -541,7 +539,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) ...@@ -541,7 +539,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
goto signing_check; goto signing_check;
#else /* weak security disabled */ #else /* weak security disabled */
} else if (pSMBr->hdr.WordCount == 13) { } else if (pSMBr->hdr.WordCount == 13) {
cERROR(1,("mount failed, cifs module not built " cERROR(1, ("mount failed, cifs module not built "
"with CIFS_WEAK_PW_HASH support")); "with CIFS_WEAK_PW_HASH support"));
rc = -EOPNOTSUPP; rc = -EOPNOTSUPP;
#endif /* WEAK_PW_HASH */ #endif /* WEAK_PW_HASH */
...@@ -560,7 +558,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) ...@@ -560,7 +558,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
#ifdef CONFIG_CIFS_WEAK_PW_HASH #ifdef CONFIG_CIFS_WEAK_PW_HASH
if ((secFlags & CIFSSEC_MAY_PLNTXT) == 0) if ((secFlags & CIFSSEC_MAY_PLNTXT) == 0)
#endif /* CIFS_WEAK_PW_HASH */ #endif /* CIFS_WEAK_PW_HASH */
cERROR(1,("Server requests plain text password" cERROR(1, ("Server requests plain text password"
" but client support disabled")); " but client support disabled"));
if ((secFlags & CIFSSEC_MUST_NTLMV2) == CIFSSEC_MUST_NTLMV2) if ((secFlags & CIFSSEC_MUST_NTLMV2) == CIFSSEC_MUST_NTLMV2)
...@@ -1027,7 +1025,7 @@ CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags, ...@@ -1027,7 +1025,7 @@ CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags,
} else { } else {
if (pSMBr->ByteCount < sizeof(OPEN_PSX_RSP) if (pSMBr->ByteCount < sizeof(OPEN_PSX_RSP)
+ sizeof(FILE_UNIX_BASIC_INFO)) { + sizeof(FILE_UNIX_BASIC_INFO)) {
cERROR(1,("Open response data too small")); cERROR(1, ("Open response data too small"));
pRetData->Type = -1; pRetData->Type = -1;
goto psx_create_err; goto psx_create_err;
} }
...@@ -1036,7 +1034,6 @@ CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags, ...@@ -1036,7 +1034,6 @@ CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags,
sizeof (FILE_UNIX_BASIC_INFO)); sizeof (FILE_UNIX_BASIC_INFO));
} }
psx_create_err: psx_create_err:
cifs_buf_release(pSMB); cifs_buf_release(pSMB);
...@@ -1143,7 +1140,8 @@ SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon, ...@@ -1143,7 +1140,8 @@ SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
being created */ being created */
/* BB FIXME BB */ /* BB FIXME BB */
/* pSMB->CreateOptions = cpu_to_le32(create_options & CREATE_OPTIONS_MASK); */ /* pSMB->CreateOptions = cpu_to_le32(create_options &
CREATE_OPTIONS_MASK); */
/* BB FIXME END BB */ /* BB FIXME END BB */
pSMB->Sattr = cpu_to_le16(ATTR_HIDDEN | ATTR_SYSTEM | ATTR_DIRECTORY); pSMB->Sattr = cpu_to_le16(ATTR_HIDDEN | ATTR_SYSTEM | ATTR_DIRECTORY);
...@@ -1280,7 +1278,7 @@ CIFSSMBOpen(const int xid, struct cifsTconInfo *tcon, ...@@ -1280,7 +1278,7 @@ CIFSSMBOpen(const int xid, struct cifsTconInfo *tcon,
if (cpu_to_le32(FILE_CREATE) == pSMBr->CreateAction) if (cpu_to_le32(FILE_CREATE) == pSMBr->CreateAction)
*pOplock |= CIFS_CREATE_ACTION; *pOplock |= CIFS_CREATE_ACTION;
if (pfile_info) { if (pfile_info) {
memcpy((char *)pfile_info,(char *)&pSMBr->CreationTime, memcpy((char *)pfile_info, (char *)&pSMBr->CreationTime,
36 /* CreationTime to Attributes */); 36 /* CreationTime to Attributes */);
/* the file_info buf is endian converted by caller */ /* the file_info buf is endian converted by caller */
pfile_info->AllocationSize = pSMBr->AllocationSize; pfile_info->AllocationSize = pSMBr->AllocationSize;
...@@ -1296,10 +1294,9 @@ CIFSSMBOpen(const int xid, struct cifsTconInfo *tcon, ...@@ -1296,10 +1294,9 @@ CIFSSMBOpen(const int xid, struct cifsTconInfo *tcon,
} }
int int
CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, const int netfid,
const int netfid, const unsigned int count, const unsigned int count, const __u64 lseek, unsigned int *nbytes,
const __u64 lseek, unsigned int *nbytes, char **buf, char **buf, int *pbuf_type)
int * pbuf_type)
{ {
int rc = -EACCES; int rc = -EACCES;
READ_REQ *pSMB = NULL; READ_REQ *pSMB = NULL;
...@@ -1339,7 +1336,7 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, ...@@ -1339,7 +1336,7 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon,
pSMB->ByteCount = 0; /* no need to do le conversion since 0 */ pSMB->ByteCount = 0; /* no need to do le conversion since 0 */
else { else {
/* old style read */ /* old style read */
struct smb_com_readx_req * pSMBW = struct smb_com_readx_req *pSMBW =
(struct smb_com_readx_req *)pSMB; (struct smb_com_readx_req *)pSMB;
pSMBW->ByteCount = 0; pSMBW->ByteCount = 0;
} }
...@@ -1362,7 +1359,8 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, ...@@ -1362,7 +1359,8 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon,
/*check that DataLength would not go beyond end of SMB */ /*check that DataLength would not go beyond end of SMB */
if ((data_length > CIFSMaxBufSize) if ((data_length > CIFSMaxBufSize)
|| (data_length > count)) { || (data_length > count)) {
cFYI(1,("bad length %d for count %d",data_length,count)); cFYI(1, ("bad length %d for count %d",
data_length, count));
rc = -EIO; rc = -EIO;
*nbytes = 0; *nbytes = 0;
} else { } else {
...@@ -1373,7 +1371,7 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, ...@@ -1373,7 +1371,7 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon,
rc = -EFAULT; rc = -EFAULT;
}*/ /* can not use copy_to_user when using page cache*/ }*/ /* can not use copy_to_user when using page cache*/
if (*buf) if (*buf)
memcpy(*buf,pReadData,data_length); memcpy(*buf, pReadData, data_length);
} }
} }
...@@ -1402,7 +1400,7 @@ int ...@@ -1402,7 +1400,7 @@ int
CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon, CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
const int netfid, const unsigned int count, const int netfid, const unsigned int count,
const __u64 offset, unsigned int *nbytes, const char *buf, const __u64 offset, unsigned int *nbytes, const char *buf,
const char __user * ubuf, const int long_op) const char __user *ubuf, const int long_op)
{ {
int rc = -EACCES; int rc = -EACCES;
WRITE_REQ *pSMB = NULL; WRITE_REQ *pSMB = NULL;
...@@ -1440,7 +1438,7 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon, ...@@ -1440,7 +1438,7 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
pSMB->WriteMode = 0; pSMB->WriteMode = 0;
pSMB->Remaining = 0; pSMB->Remaining = 0;
/* Can increase buffer size if buffer is big enough in some cases - ie we /* Can increase buffer size if buffer is big enough in some cases ie we
can send more if LARGE_WRITE_X capability returned by the server and if can send more if LARGE_WRITE_X capability returned by the server and if
our buffer is big enough or if we convert to iovecs on socket writes our buffer is big enough or if we convert to iovecs on socket writes
and eliminate the copy to the CIFS buffer */ and eliminate the copy to the CIFS buffer */
...@@ -1454,9 +1452,9 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon, ...@@ -1454,9 +1452,9 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
if (bytes_sent > count) if (bytes_sent > count)
bytes_sent = count; bytes_sent = count;
pSMB->DataOffset = pSMB->DataOffset =
cpu_to_le16(offsetof(struct smb_com_write_req,Data) - 4); cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4);
if (buf) if (buf)
memcpy(pSMB->Data,buf,bytes_sent); memcpy(pSMB->Data, buf, bytes_sent);
else if (ubuf) { else if (ubuf) {
if (copy_from_user(pSMB->Data, ubuf, bytes_sent)) { if (copy_from_user(pSMB->Data, ubuf, bytes_sent)) {
cifs_buf_release(pSMB); cifs_buf_release(pSMB);
...@@ -1478,8 +1476,9 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon, ...@@ -1478,8 +1476,9 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
if (wct == 14) if (wct == 14)
pSMB->ByteCount = cpu_to_le16(byte_count); pSMB->ByteCount = cpu_to_le16(byte_count);
else { /* old style write has byte count 4 bytes earlier so 4 bytes pad */ else { /* old style write has byte count 4 bytes earlier
struct smb_com_writex_req * pSMBW = so 4 bytes pad */
struct smb_com_writex_req *pSMBW =
(struct smb_com_writex_req *)pSMB; (struct smb_com_writex_req *)pSMB;
pSMBW->ByteCount = cpu_to_le16(byte_count); pSMBW->ByteCount = cpu_to_le16(byte_count);
} }
...@@ -1541,7 +1540,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon, ...@@ -1541,7 +1540,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
pSMB->Remaining = 0; pSMB->Remaining = 0;
pSMB->DataOffset = pSMB->DataOffset =
cpu_to_le16(offsetof(struct smb_com_write_req,Data) - 4); cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4);
pSMB->DataLengthLow = cpu_to_le16(count & 0xFFFF); pSMB->DataLengthLow = cpu_to_le16(count & 0xFFFF);
pSMB->DataLengthHigh = cpu_to_le16(count >> 16); pSMB->DataLengthHigh = cpu_to_le16(count >> 16);
...@@ -1553,7 +1552,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon, ...@@ -1553,7 +1552,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
if (wct == 14) if (wct == 14)
pSMB->ByteCount = cpu_to_le16(count + 1); pSMB->ByteCount = cpu_to_le16(count + 1);
else /* wct == 12 */ /* bigger pad, smaller smb hdr, keep offset ok */ { else /* wct == 12 */ /* bigger pad, smaller smb hdr, keep offset ok */ {
struct smb_com_writex_req * pSMBW = struct smb_com_writex_req *pSMBW =
(struct smb_com_writex_req *)pSMB; (struct smb_com_writex_req *)pSMB;
pSMBW->ByteCount = cpu_to_le16(count + 5); pSMBW->ByteCount = cpu_to_le16(count + 5);
} }
...@@ -1607,7 +1606,7 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon, ...@@ -1607,7 +1606,7 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
int timeout = 0; int timeout = 0;
__u16 count; __u16 count;
cFYI(1, ("In CIFSSMBLock - timeout %d numLock %d",waitFlag,numLock)); cFYI(1, ("In CIFSSMBLock - timeout %d numLock %d", waitFlag, numLock));
rc = small_smb_init(SMB_COM_LOCKING_ANDX, 8, tcon, (void **) &pSMB); rc = small_smb_init(SMB_COM_LOCKING_ANDX, 8, tcon, (void **) &pSMB);
if (rc) if (rc)
...@@ -1893,13 +1892,13 @@ CIFSSMBRename(const int xid, struct cifsTconInfo *tcon, ...@@ -1893,13 +1892,13 @@ CIFSSMBRename(const int xid, struct cifsTconInfo *tcon,
return rc; return rc;
} }
int CIFSSMBRenameOpenFile(const int xid,struct cifsTconInfo *pTcon, int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon,
int netfid, char * target_name, int netfid, char *target_name,
const struct nls_table * nls_codepage, int remap) const struct nls_table *nls_codepage, int remap)
{ {
struct smb_com_transaction2_sfi_req *pSMB = NULL; struct smb_com_transaction2_sfi_req *pSMB = NULL;
struct smb_com_transaction2_sfi_rsp *pSMBr = NULL; struct smb_com_transaction2_sfi_rsp *pSMBr = NULL;
struct set_file_rename * rename_info; struct set_file_rename *rename_info;
char *data_offset; char *data_offset;
char dummy_string[30]; char dummy_string[30];
int rc = 0; int rc = 0;
...@@ -1939,12 +1938,13 @@ int CIFSSMBRenameOpenFile(const int xid,struct cifsTconInfo *pTcon, ...@@ -1939,12 +1938,13 @@ int CIFSSMBRenameOpenFile(const int xid,struct cifsTconInfo *pTcon,
rename_info->root_fid = 0; rename_info->root_fid = 0;
/* unicode only call */ /* unicode only call */
if (target_name == NULL) { if (target_name == NULL) {
sprintf(dummy_string,"cifs%x",pSMB->hdr.Mid); sprintf(dummy_string, "cifs%x", pSMB->hdr.Mid);
len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name, len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name,
dummy_string, 24, nls_codepage, remap); dummy_string, 24, nls_codepage, remap);
} else { } else {
len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name, len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name,
target_name, PATH_MAX, nls_codepage, remap); target_name, PATH_MAX, nls_codepage,
remap);
} }
rename_info->target_name_len = cpu_to_le32(2 * len_of_str); rename_info->target_name_len = cpu_to_le32(2 * len_of_str);
count = 12 /* sizeof(struct set_file_rename) */ + (2 * len_of_str) + 2; count = 12 /* sizeof(struct set_file_rename) */ + (2 * len_of_str) + 2;
...@@ -1973,7 +1973,7 @@ int CIFSSMBRenameOpenFile(const int xid,struct cifsTconInfo *pTcon, ...@@ -1973,7 +1973,7 @@ int CIFSSMBRenameOpenFile(const int xid,struct cifsTconInfo *pTcon,
} }
int int
CIFSSMBCopy(const int xid, struct cifsTconInfo *tcon, const char * fromName, CIFSSMBCopy(const int xid, struct cifsTconInfo *tcon, const char *fromName,
const __u16 target_tid, const char *toName, const int flags, const __u16 target_tid, const char *toName, const int flags,
const struct nls_table *nls_codepage, int remap) const struct nls_table *nls_codepage, int remap)
{ {
...@@ -2005,7 +2005,8 @@ CIFSSMBCopy(const int xid, struct cifsTconInfo *tcon, const char * fromName, ...@@ -2005,7 +2005,8 @@ CIFSSMBCopy(const int xid, struct cifsTconInfo *tcon, const char * fromName,
pSMB->OldFileName[name_len] = 0x04; /* pad */ pSMB->OldFileName[name_len] = 0x04; /* pad */
/* protocol requires ASCII signature byte on Unicode string */ /* protocol requires ASCII signature byte on Unicode string */
pSMB->OldFileName[name_len + 1] = 0x00; pSMB->OldFileName[name_len + 1] = 0x00;
name_len2 = cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2], name_len2 =
cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2],
toName, PATH_MAX, nls_codepage, remap); toName, PATH_MAX, nls_codepage, remap);
name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ; name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ;
name_len2 *= 2; /* convert to bytes */ name_len2 *= 2; /* convert to bytes */
...@@ -2313,9 +2314,8 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon, ...@@ -2313,9 +2314,8 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
name_len = name_len =
cifs_strtoUCS((__le16 *) pSMB->FileName, searchName, PATH_MAX cifs_strtoUCS((__le16 *) pSMB->FileName, searchName,
/* find define for this maxpathcomponent */ PATH_MAX, nls_codepage);
, nls_codepage);
name_len++; /* trailing null */ name_len++; /* trailing null */
name_len *= 2; name_len *= 2;
} else { /* BB improve the check for buffer overruns BB */ } else { /* BB improve the check for buffer overruns BB */
...@@ -2335,7 +2335,7 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon, ...@@ -2335,7 +2335,7 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
pSMB->Timeout = 0; pSMB->Timeout = 0;
pSMB->Reserved2 = 0; pSMB->Reserved2 = 0;
pSMB->ParameterOffset = cpu_to_le16(offsetof( pSMB->ParameterOffset = cpu_to_le16(offsetof(
struct smb_com_transaction2_qpi_req ,InformationLevel) - 4); struct smb_com_transaction2_qpi_req, InformationLevel) - 4);
pSMB->DataCount = 0; pSMB->DataCount = 0;
pSMB->DataOffset = 0; pSMB->DataOffset = 0;
pSMB->SetupCount = 1; pSMB->SetupCount = 1;
...@@ -2366,12 +2366,12 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon, ...@@ -2366,12 +2366,12 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) { if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
name_len = UniStrnlen((wchar_t *) ((char *) name_len = UniStrnlen((wchar_t *) ((char *)
&pSMBr->hdr.Protocol +data_offset), &pSMBr->hdr.Protocol + data_offset),
min_t(const int, buflen,count) / 2); min_t(const int, buflen, count) / 2);
/* BB FIXME investigate remapping reserved chars here */ /* BB FIXME investigate remapping reserved chars here */
cifs_strfromUCS_le(symlinkinfo, cifs_strfromUCS_le(symlinkinfo,
(__le16 *) ((char *)&pSMBr->hdr.Protocol + (__le16 *) ((char *)&pSMBr->hdr.Protocol
data_offset), + data_offset),
name_len, nls_codepage); name_len, nls_codepage);
} else { } else {
strncpy(symlinkinfo, strncpy(symlinkinfo,
...@@ -2399,11 +2399,11 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon, ...@@ -2399,11 +2399,11 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
static int static int
smb_init_ntransact(const __u16 sub_command, const int setup_count, smb_init_ntransact(const __u16 sub_command, const int setup_count,
const int parm_len, struct cifsTconInfo *tcon, const int parm_len, struct cifsTconInfo *tcon,
void ** ret_buf) void **ret_buf)
{ {
int rc; int rc;
__u32 temp_offset; __u32 temp_offset;
struct smb_com_ntransact_req * pSMB; struct smb_com_ntransact_req *pSMB;
rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon, rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon,
(void **)&pSMB); (void **)&pSMB);
...@@ -2427,12 +2427,12 @@ smb_init_ntransact(const __u16 sub_command, const int setup_count, ...@@ -2427,12 +2427,12 @@ smb_init_ntransact(const __u16 sub_command, const int setup_count,
} }
static int static int
validate_ntransact(char * buf, char ** ppparm, char ** ppdata, validate_ntransact(char *buf, char **ppparm, char **ppdata,
int * pdatalen, int * pparmlen) int *pdatalen, int *pparmlen)
{ {
char * end_of_smb; char *end_of_smb;
__u32 data_count, data_offset, parm_count, parm_offset; __u32 data_count, data_offset, parm_count, parm_offset;
struct smb_com_ntransact_rsp * pSMBr; struct smb_com_ntransact_rsp *pSMBr;
if (buf == NULL) if (buf == NULL)
return -EINVAL; return -EINVAL;
...@@ -2443,7 +2443,6 @@ validate_ntransact(char * buf, char ** ppparm, char ** ppdata, ...@@ -2443,7 +2443,6 @@ validate_ntransact(char * buf, char ** ppparm, char ** ppdata,
end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount + end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount +
(char *)&pSMBr->ByteCount; (char *)&pSMBr->ByteCount;
data_offset = le32_to_cpu(pSMBr->DataOffset); data_offset = le32_to_cpu(pSMBr->DataOffset);
data_count = le32_to_cpu(pSMBr->DataCount); data_count = le32_to_cpu(pSMBr->DataCount);
parm_offset = le32_to_cpu(pSMBr->ParameterOffset); parm_offset = le32_to_cpu(pSMBr->ParameterOffset);
...@@ -2464,7 +2463,8 @@ validate_ntransact(char * buf, char ** ppparm, char ** ppdata, ...@@ -2464,7 +2463,8 @@ validate_ntransact(char * buf, char ** ppparm, char ** ppdata,
return -EINVAL; return -EINVAL;
} else if (data_count + *ppdata > end_of_smb) { } else if (data_count + *ppdata > end_of_smb) {
cFYI(1,("data %p + count %d (%p) ends after end of smb %p start %p", cFYI(1,("data %p + count %d (%p) ends after end of smb %p start %p",
*ppdata, data_count, (data_count + *ppdata), end_of_smb, pSMBr)); /* BB FIXME */ *ppdata, data_count, (data_count + *ppdata),
end_of_smb, pSMBr));
return -EINVAL; return -EINVAL;
} else if (parm_count + data_count > pSMBr->ByteCount) { } else if (parm_count + data_count > pSMBr->ByteCount) {
cFYI(1, ("parm count and data count larger than SMB")); cFYI(1, ("parm count and data count larger than SMB"));
...@@ -2476,14 +2476,14 @@ validate_ntransact(char * buf, char ** ppparm, char ** ppdata, ...@@ -2476,14 +2476,14 @@ validate_ntransact(char * buf, char ** ppparm, char ** ppdata,
int int
CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
const unsigned char *searchName, const unsigned char *searchName,
char *symlinkinfo, const int buflen,__u16 fid, char *symlinkinfo, const int buflen, __u16 fid,
const struct nls_table *nls_codepage) const struct nls_table *nls_codepage)
{ {
int rc = 0; int rc = 0;
int bytes_returned; int bytes_returned;
int name_len; int name_len;
struct smb_com_transaction_ioctl_req * pSMB; struct smb_com_transaction_ioctl_req *pSMB;
struct smb_com_transaction_ioctl_rsp * pSMBr; struct smb_com_transaction_ioctl_rsp *pSMBr;
cFYI(1, ("In Windows reparse style QueryLink for path %s", searchName)); cFYI(1, ("In Windows reparse style QueryLink for path %s", searchName));
rc = smb_init(SMB_COM_NT_TRANSACT, 23, tcon, (void **) &pSMB, rc = smb_init(SMB_COM_NT_TRANSACT, 23, tcon, (void **) &pSMB,
...@@ -2523,12 +2523,14 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, ...@@ -2523,12 +2523,14 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
rc = -EIO; /* bad smb */ rc = -EIO; /* bad smb */
else { else {
if (data_count && (data_count < 2048)) { if (data_count && (data_count < 2048)) {
char * end_of_smb = 2 /* sizeof byte count */ + char *end_of_smb = 2 /* sizeof byte count */ +
pSMBr->ByteCount + pSMBr->ByteCount +
(char *)&pSMBr->ByteCount; (char *)&pSMBr->ByteCount;
struct reparse_data * reparse_buf = (struct reparse_data *) struct reparse_data *reparse_buf =
((char *)&pSMBr->hdr.Protocol + data_offset); (struct reparse_data *)
((char *)&pSMBr->hdr.Protocol
+ data_offset);
if ((char *)reparse_buf >= end_of_smb) { if ((char *)reparse_buf >= end_of_smb) {
rc = -EIO; rc = -EIO;
goto qreparse_out; goto qreparse_out;
...@@ -2546,15 +2548,18 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, ...@@ -2546,15 +2548,18 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
name_len = UniStrnlen((wchar_t *) name_len = UniStrnlen((wchar_t *)
(reparse_buf->LinkNamesBuf + (reparse_buf->LinkNamesBuf +
reparse_buf->TargetNameOffset), reparse_buf->TargetNameOffset),
min(buflen/2, reparse_buf->TargetNameLen / 2)); min(buflen/2,
reparse_buf->TargetNameLen / 2));
cifs_strfromUCS_le(symlinkinfo, cifs_strfromUCS_le(symlinkinfo,
(__le16 *) (reparse_buf->LinkNamesBuf + (__le16 *) (reparse_buf->LinkNamesBuf +
reparse_buf->TargetNameOffset), reparse_buf->TargetNameOffset),
name_len, nls_codepage); name_len, nls_codepage);
} else { /* ASCII names */ } else { /* ASCII names */
strncpy(symlinkinfo,reparse_buf->LinkNamesBuf + strncpy(symlinkinfo,
reparse_buf->LinkNamesBuf +
reparse_buf->TargetNameOffset, reparse_buf->TargetNameOffset,
min_t(const int, buflen, reparse_buf->TargetNameLen)); min_t(const int, buflen,
reparse_buf->TargetNameLen));
} }
} else { } else {
rc = -EIO; rc = -EIO;
...@@ -2562,7 +2567,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, ...@@ -2562,7 +2567,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
} }
symlinkinfo[buflen] = 0; /* just in case so the caller symlinkinfo[buflen] = 0; /* just in case so the caller
does not go off the end of the buffer */ does not go off the end of the buffer */
cFYI(1,("readlink result - %s",symlinkinfo)); cFYI(1, ("readlink result - %s", symlinkinfo));
} }
} }
qreparse_out: qreparse_out:
...@@ -2577,7 +2582,8 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, ...@@ -2577,7 +2582,8 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
#ifdef CONFIG_CIFS_POSIX #ifdef CONFIG_CIFS_POSIX
/*Convert an Access Control Entry from wire format to local POSIX xattr format*/ /*Convert an Access Control Entry from wire format to local POSIX xattr format*/
static void cifs_convert_ace(posix_acl_xattr_entry * ace, struct cifs_posix_ace * cifs_ace) static void cifs_convert_ace(posix_acl_xattr_entry *ace,
struct cifs_posix_ace *cifs_ace)
{ {
/* u8 cifs fields do not need le conversion */ /* u8 cifs fields do not need le conversion */
ace->e_perm = cpu_to_le16(cifs_ace->cifs_e_perm); ace->e_perm = cpu_to_le16(cifs_ace->cifs_e_perm);
...@@ -2589,15 +2595,15 @@ static void cifs_convert_ace(posix_acl_xattr_entry * ace, struct cifs_posix_ace ...@@ -2589,15 +2595,15 @@ static void cifs_convert_ace(posix_acl_xattr_entry * ace, struct cifs_posix_ace
} }
/* Convert ACL from CIFS POSIX wire format to local Linux POSIX ACL xattr */ /* Convert ACL from CIFS POSIX wire format to local Linux POSIX ACL xattr */
static int cifs_copy_posix_acl(char * trgt,char * src, const int buflen, static int cifs_copy_posix_acl(char *trgt, char *src, const int buflen,
const int acl_type,const int size_of_data_area) const int acl_type, const int size_of_data_area)
{ {
int size = 0; int size = 0;
int i; int i;
__u16 count; __u16 count;
struct cifs_posix_ace * pACE; struct cifs_posix_ace *pACE;
struct cifs_posix_acl * cifs_acl = (struct cifs_posix_acl *)src; struct cifs_posix_acl *cifs_acl = (struct cifs_posix_acl *)src;
posix_acl_xattr_header * local_acl = (posix_acl_xattr_header *)trgt; posix_acl_xattr_header *local_acl = (posix_acl_xattr_header *)trgt;
if (le16_to_cpu(cifs_acl->version) != CIFS_ACL_VERSION) if (le16_to_cpu(cifs_acl->version) != CIFS_ACL_VERSION)
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -2609,7 +2615,8 @@ static int cifs_copy_posix_acl(char * trgt,char * src, const int buflen, ...@@ -2609,7 +2615,8 @@ static int cifs_copy_posix_acl(char * trgt,char * src, const int buflen,
size += sizeof(struct cifs_posix_ace) * count; size += sizeof(struct cifs_posix_ace) * count;
/* check if we would go beyond end of SMB */ /* check if we would go beyond end of SMB */
if (size_of_data_area < size) { if (size_of_data_area < size) {
cFYI(1,("bad CIFS POSIX ACL size %d vs. %d",size_of_data_area,size)); cFYI(1, ("bad CIFS POSIX ACL size %d vs. %d",
size_of_data_area, size));
return -EINVAL; return -EINVAL;
} }
} else if (acl_type & ACL_TYPE_DEFAULT) { } else if (acl_type & ACL_TYPE_DEFAULT) {
...@@ -2635,16 +2642,16 @@ static int cifs_copy_posix_acl(char * trgt,char * src, const int buflen, ...@@ -2635,16 +2642,16 @@ static int cifs_copy_posix_acl(char * trgt,char * src, const int buflen,
return -ERANGE; return -ERANGE;
} else /* buffer big enough */ { } else /* buffer big enough */ {
local_acl->a_version = cpu_to_le32(POSIX_ACL_XATTR_VERSION); local_acl->a_version = cpu_to_le32(POSIX_ACL_XATTR_VERSION);
for(i = 0;i < count ;i++) { for (i = 0; i < count ; i++) {
cifs_convert_ace(&local_acl->a_entries[i],pACE); cifs_convert_ace(&local_acl->a_entries[i], pACE);
pACE ++; pACE++;
} }
} }
return size; return size;
} }
static __u16 convert_ace_to_cifs_ace(struct cifs_posix_ace * cifs_ace, static __u16 convert_ace_to_cifs_ace(struct cifs_posix_ace *cifs_ace,
const posix_acl_xattr_entry * local_ace) const posix_acl_xattr_entry *local_ace)
{ {
__u16 rc = 0; /* 0 = ACL converted ok */ __u16 rc = 0; /* 0 = ACL converted ok */
...@@ -2661,12 +2668,12 @@ static __u16 convert_ace_to_cifs_ace(struct cifs_posix_ace * cifs_ace, ...@@ -2661,12 +2668,12 @@ static __u16 convert_ace_to_cifs_ace(struct cifs_posix_ace * cifs_ace,
} }
/* Convert ACL from local Linux POSIX xattr to CIFS POSIX ACL wire format */ /* Convert ACL from local Linux POSIX xattr to CIFS POSIX ACL wire format */
static __u16 ACL_to_cifs_posix(char * parm_data,const char * pACL,const int buflen, static __u16 ACL_to_cifs_posix(char *parm_data, const char *pACL,
const int acl_type) const int buflen, const int acl_type)
{ {
__u16 rc = 0; __u16 rc = 0;
struct cifs_posix_acl * cifs_acl = (struct cifs_posix_acl *)parm_data; struct cifs_posix_acl *cifs_acl = (struct cifs_posix_acl *)parm_data;
posix_acl_xattr_header * local_acl = (posix_acl_xattr_header *)pACL; posix_acl_xattr_header *local_acl = (posix_acl_xattr_header *)pACL;
int count; int count;
int i; int i;
...@@ -2677,7 +2684,7 @@ static __u16 ACL_to_cifs_posix(char * parm_data,const char * pACL,const int bufl ...@@ -2677,7 +2684,7 @@ static __u16 ACL_to_cifs_posix(char * parm_data,const char * pACL,const int bufl
cFYI(1,("setting acl with %d entries from buf of length %d and version of %d", cFYI(1,("setting acl with %d entries from buf of length %d and version of %d",
count, buflen, le32_to_cpu(local_acl->a_version))); count, buflen, le32_to_cpu(local_acl->a_version)));
if (le32_to_cpu(local_acl->a_version) != 2) { if (le32_to_cpu(local_acl->a_version) != 2) {
cFYI(1,("unknown POSIX ACL version %d", cFYI(1, ("unknown POSIX ACL version %d",
le32_to_cpu(local_acl->a_version))); le32_to_cpu(local_acl->a_version)));
return 0; return 0;
} }
...@@ -2687,10 +2694,10 @@ static __u16 ACL_to_cifs_posix(char * parm_data,const char * pACL,const int bufl ...@@ -2687,10 +2694,10 @@ static __u16 ACL_to_cifs_posix(char * parm_data,const char * pACL,const int bufl
else if (acl_type == ACL_TYPE_DEFAULT) else if (acl_type == ACL_TYPE_DEFAULT)
cifs_acl->default_entry_count = cpu_to_le16(count); cifs_acl->default_entry_count = cpu_to_le16(count);
else { else {
cFYI(1,("unknown ACL type %d",acl_type)); cFYI(1, ("unknown ACL type %d", acl_type));
return 0; return 0;
} }
for(i=0;i<count;i++) { for (i = 0; i < count; i++) {
rc = convert_ace_to_cifs_ace(&cifs_acl->ace_array[i], rc = convert_ace_to_cifs_ace(&cifs_acl->ace_array[i],
&local_acl->a_entries[i]); &local_acl->a_entries[i]);
if (rc != 0) { if (rc != 0) {
...@@ -2753,7 +2760,8 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon, ...@@ -2753,7 +2760,8 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
pSMB->Timeout = 0; pSMB->Timeout = 0;
pSMB->Reserved2 = 0; pSMB->Reserved2 = 0;
pSMB->ParameterOffset = cpu_to_le16( pSMB->ParameterOffset = cpu_to_le16(
offsetof(struct smb_com_transaction2_qpi_req ,InformationLevel) - 4); offsetof(struct smb_com_transaction2_qpi_req,
InformationLevel) - 4);
pSMB->DataCount = 0; pSMB->DataCount = 0;
pSMB->DataOffset = 0; pSMB->DataOffset = 0;
pSMB->SetupCount = 1; pSMB->SetupCount = 1;
...@@ -2784,7 +2792,7 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon, ...@@ -2784,7 +2792,7 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
__u16 count = le16_to_cpu(pSMBr->t2.DataCount); __u16 count = le16_to_cpu(pSMBr->t2.DataCount);
rc = cifs_copy_posix_acl(acl_inf, rc = cifs_copy_posix_acl(acl_inf,
(char *)&pSMBr->hdr.Protocol+data_offset, (char *)&pSMBr->hdr.Protocol+data_offset,
buflen,acl_type,count); buflen, acl_type, count);
} }
} }
cifs_buf_release(pSMB); cifs_buf_release(pSMB);
...@@ -2840,7 +2848,7 @@ CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon, ...@@ -2840,7 +2848,7 @@ CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon,
pSMB->ParameterOffset = cpu_to_le16(param_offset); pSMB->ParameterOffset = cpu_to_le16(param_offset);
/* convert to on the wire format for POSIX ACL */ /* convert to on the wire format for POSIX ACL */
data_count = ACL_to_cifs_posix(parm_data,local_acl,buflen,acl_type); data_count = ACL_to_cifs_posix(parm_data, local_acl, buflen, acl_type);
if (data_count == 0) { if (data_count == 0) {
rc = -EOPNOTSUPP; rc = -EOPNOTSUPP;
...@@ -2965,7 +2973,7 @@ static const struct cifs_sid sid_user = ...@@ -2965,7 +2973,7 @@ static const struct cifs_sid sid_user =
{1, 2 , {0, 0, 0, 0, 0, 5}, {32, 545, 0, 0}}; {1, 2 , {0, 0, 0, 0, 0, 5}, {32, 545, 0, 0}};
/* Convert CIFS ACL to POSIX form */ /* Convert CIFS ACL to POSIX form */
static int parse_sec_desc(struct cifs_sid * psec_desc, int acl_len) static int parse_sec_desc(struct cifs_sid *psec_desc, int acl_len)
{ {
return 0; return 0;
} }
...@@ -3004,23 +3012,23 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, ...@@ -3004,23 +3012,23 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid,
if (rc) { if (rc) {
cFYI(1, ("Send error in QuerySecDesc = %d", rc)); cFYI(1, ("Send error in QuerySecDesc = %d", rc));
} else { /* decode response */ } else { /* decode response */
struct cifs_sid * psec_desc; struct cifs_sid *psec_desc;
__le32 * parm; __le32 * parm;
int parm_len; int parm_len;
int data_len; int data_len;
int acl_len; int acl_len;
struct smb_com_ntransact_rsp * pSMBr; struct smb_com_ntransact_rsp *pSMBr;
/* validate_nttransact */ /* validate_nttransact */
rc = validate_ntransact(iov[0].iov_base, (char **)&parm, rc = validate_ntransact(iov[0].iov_base, (char **)&parm,
(char **)&psec_desc, (char **)&psec_desc,
&parm_len, &data_len); &parm_len, &data_len);
if (rc) if (rc)
goto qsec_out; goto qsec_out;
pSMBr = (struct smb_com_ntransact_rsp *)iov[0].iov_base; pSMBr = (struct smb_com_ntransact_rsp *)iov[0].iov_base;
cERROR(1,("smb %p parm %p data %p",pSMBr,parm,psec_desc)); /* BB removeme BB */ cERROR(1, ("smb %p parm %p data %p",
pSMBr, parm, psec_desc)); /* BB removeme BB */
if (le32_to_cpu(pSMBr->ParameterCount) != 4) { if (le32_to_cpu(pSMBr->ParameterCount) != 4) {
rc = -EIO; /* bad smb */ rc = -EIO; /* bad smb */
...@@ -3047,7 +3055,7 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, ...@@ -3047,7 +3055,7 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid,
as Win9x/WinME */ as Win9x/WinME */
int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon, int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon,
const unsigned char *searchName, const unsigned char *searchName,
FILE_ALL_INFO * pFinfo, FILE_ALL_INFO *pFinfo,
const struct nls_table *nls_codepage, int remap) const struct nls_table *nls_codepage, int remap)
{ {
QUERY_INFORMATION_REQ * pSMB; QUERY_INFORMATION_REQ * pSMB;
...@@ -3147,7 +3155,7 @@ CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon, ...@@ -3147,7 +3155,7 @@ CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon,
strncpy(pSMB->FileName, searchName, name_len); strncpy(pSMB->FileName, searchName, name_len);
} }
params = 2 /* level */ + 4 /* reserved */ + name_len /* includes NUL */ ; params = 2 /* level */ + 4 /* reserved */ + name_len /* includes NUL */;
pSMB->TotalDataCount = 0; pSMB->TotalDataCount = 0;
pSMB->MaxParameterCount = cpu_to_le16(2); pSMB->MaxParameterCount = cpu_to_le16(2);
pSMB->MaxDataCount = cpu_to_le16(4000); /* BB find exact max SMB PDU from sess structure BB */ pSMB->MaxDataCount = cpu_to_le16(4000); /* BB find exact max SMB PDU from sess structure BB */
...@@ -3157,7 +3165,7 @@ CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon, ...@@ -3157,7 +3165,7 @@ CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon,
pSMB->Timeout = 0; pSMB->Timeout = 0;
pSMB->Reserved2 = 0; pSMB->Reserved2 = 0;
pSMB->ParameterOffset = cpu_to_le16(offsetof( pSMB->ParameterOffset = cpu_to_le16(offsetof(
struct smb_com_transaction2_qpi_req ,InformationLevel) - 4); struct smb_com_transaction2_qpi_req, InformationLevel) - 4);
pSMB->DataCount = 0; pSMB->DataCount = 0;
pSMB->DataOffset = 0; pSMB->DataOffset = 0;
pSMB->SetupCount = 1; pSMB->SetupCount = 1;
...@@ -3186,8 +3194,9 @@ CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon, ...@@ -3186,8 +3194,9 @@ CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon,
else if (!legacy && (pSMBr->ByteCount < 40)) else if (!legacy && (pSMBr->ByteCount < 40))
rc = -EIO; /* bad smb */ rc = -EIO; /* bad smb */
else if (legacy && (pSMBr->ByteCount < 24)) else if (legacy && (pSMBr->ByteCount < 24))
rc = -EIO; /* 24 or 26 expected but we do not read last field */ rc = -EIO; /* 24 or 26 expected but we do not read
else if (pFindData){ last field */
else if (pFindData) {
int size; int size;
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
if (legacy) /* we do not read the last field, EAsize, if (legacy) /* we do not read the last field, EAsize,
...@@ -3243,7 +3252,7 @@ CIFSSMBUnixQPathInfo(const int xid, struct cifsTconInfo *tcon, ...@@ -3243,7 +3252,7 @@ CIFSSMBUnixQPathInfo(const int xid, struct cifsTconInfo *tcon,
strncpy(pSMB->FileName, searchName, name_len); strncpy(pSMB->FileName, searchName, name_len);
} }
params = 2 /* level */ + 4 /* reserved */ + name_len /* includes NUL */ ; params = 2 /* level */ + 4 /* reserved */ + name_len /* includes NUL */;
pSMB->TotalDataCount = 0; pSMB->TotalDataCount = 0;
pSMB->MaxParameterCount = cpu_to_le16(2); pSMB->MaxParameterCount = cpu_to_le16(2);
/* BB find exact max SMB PDU from sess structure BB */ /* BB find exact max SMB PDU from sess structure BB */
...@@ -3254,7 +3263,7 @@ CIFSSMBUnixQPathInfo(const int xid, struct cifsTconInfo *tcon, ...@@ -3254,7 +3263,7 @@ CIFSSMBUnixQPathInfo(const int xid, struct cifsTconInfo *tcon,
pSMB->Timeout = 0; pSMB->Timeout = 0;
pSMB->Reserved2 = 0; pSMB->Reserved2 = 0;
pSMB->ParameterOffset = cpu_to_le16(offsetof( pSMB->ParameterOffset = cpu_to_le16(offsetof(
struct smb_com_transaction2_qpi_req ,InformationLevel) - 4); struct smb_com_transaction2_qpi_req, InformationLevel) - 4);
pSMB->DataCount = 0; pSMB->DataCount = 0;
pSMB->DataOffset = 0; pSMB->DataOffset = 0;
pSMB->SetupCount = 1; pSMB->SetupCount = 1;
...@@ -3314,9 +3323,8 @@ int CIFSFindSingle(const int xid, struct cifsTconInfo *tcon, ...@@ -3314,9 +3323,8 @@ int CIFSFindSingle(const int xid, struct cifsTconInfo *tcon,
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
name_len = name_len =
cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, PATH_MAX cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
/* find define for this maxpathcomponent */ PATH_MAX, nls_codepage);
, nls_codepage);
name_len++; /* trailing null */ name_len++; /* trailing null */
name_len *= 2; name_len *= 2;
} else { /* BB improve the check for buffer overruns BB */ } else { /* BB improve the check for buffer overruns BB */
...@@ -3335,7 +3343,7 @@ int CIFSFindSingle(const int xid, struct cifsTconInfo *tcon, ...@@ -3335,7 +3343,7 @@ int CIFSFindSingle(const int xid, struct cifsTconInfo *tcon,
pSMB->Timeout = 0; pSMB->Timeout = 0;
pSMB->Reserved2 = 0; pSMB->Reserved2 = 0;
pSMB->ParameterOffset = cpu_to_le16( pSMB->ParameterOffset = cpu_to_le16(
offsetof(struct smb_com_transaction2_ffirst_req,InformationLevel) - 4); offsetof(struct smb_com_transaction2_ffirst_req, InformationLevel)-4);
pSMB->DataCount = 0; pSMB->DataCount = 0;
pSMB->DataOffset = 0; pSMB->DataOffset = 0;
pSMB->SetupCount = 1; /* one byte, no need to le convert */ pSMB->SetupCount = 1; /* one byte, no need to le convert */
...@@ -3377,8 +3385,8 @@ int ...@@ -3377,8 +3385,8 @@ int
CIFSFindFirst(const int xid, struct cifsTconInfo *tcon, CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
const char *searchName, const char *searchName,
const struct nls_table *nls_codepage, const struct nls_table *nls_codepage,
__u16 * pnetfid, __u16 *pnetfid,
struct cifs_search_info * psrch_inf, int remap, const char dirsep) struct cifs_search_info *psrch_inf, int remap, const char dirsep)
{ {
/* level 257 SMB_ */ /* level 257 SMB_ */
TRANSACTION2_FFIRST_REQ *pSMB = NULL; TRANSACTION2_FFIRST_REQ *pSMB = NULL;
...@@ -3389,7 +3397,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon, ...@@ -3389,7 +3397,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
int name_len; int name_len;
__u16 params, byte_count; __u16 params, byte_count;
cFYI(1, ("In FindFirst for %s",searchName)); cFYI(1, ("In FindFirst for %s", searchName));
findFirstRetry: findFirstRetry:
rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB,
...@@ -3399,7 +3407,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon, ...@@ -3399,7 +3407,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
name_len = name_len =
cifsConvertToUCS((__le16 *) pSMB->FileName,searchName, cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
PATH_MAX, nls_codepage, remap); PATH_MAX, nls_codepage, remap);
/* We can not add the asterik earlier in case /* We can not add the asterik earlier in case
it got remapped to 0xF03A as if it were part of the it got remapped to 0xF03A as if it were part of the
...@@ -3449,7 +3457,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon, ...@@ -3449,7 +3457,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
pSMB->SearchAttributes = pSMB->SearchAttributes =
cpu_to_le16(ATTR_READONLY | ATTR_HIDDEN | ATTR_SYSTEM | cpu_to_le16(ATTR_READONLY | ATTR_HIDDEN | ATTR_SYSTEM |
ATTR_DIRECTORY); ATTR_DIRECTORY);
pSMB->SearchCount= cpu_to_le16(CIFSMaxBufSize/sizeof(FILE_UNIX_INFO)); pSMB->SearchCount = cpu_to_le16(CIFSMaxBufSize/sizeof(FILE_UNIX_INFO));
pSMB->SearchFlags = cpu_to_le16(CIFS_SEARCH_CLOSE_AT_END | pSMB->SearchFlags = cpu_to_le16(CIFS_SEARCH_CLOSE_AT_END |
CIFS_SEARCH_RETURN_RESUME); CIFS_SEARCH_RETURN_RESUME);
pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level);
...@@ -3496,7 +3504,8 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon, ...@@ -3496,7 +3504,8 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
else else
psrch_inf->endOfSearch = FALSE; psrch_inf->endOfSearch = FALSE;
psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); psrch_inf->entries_in_buffer =
le16_to_cpu(parms->SearchCount);
psrch_inf->index_of_last_entry = 2 /* skip . and .. */ + psrch_inf->index_of_last_entry = 2 /* skip . and .. */ +
psrch_inf->entries_in_buffer; psrch_inf->entries_in_buffer;
*pnetfid = parms->SearchHandle; *pnetfid = parms->SearchHandle;
...@@ -3509,7 +3518,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon, ...@@ -3509,7 +3518,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
} }
int CIFSFindNext(const int xid, struct cifsTconInfo *tcon, int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
__u16 searchHandle, struct cifs_search_info * psrch_inf) __u16 searchHandle, struct cifs_search_info *psrch_inf)
{ {
TRANSACTION2_FNEXT_REQ *pSMB = NULL; TRANSACTION2_FNEXT_REQ *pSMB = NULL;
TRANSACTION2_FNEXT_RSP *pSMBr = NULL; TRANSACTION2_FNEXT_RSP *pSMBr = NULL;
...@@ -3529,12 +3538,13 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon, ...@@ -3529,12 +3538,13 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
if (rc) if (rc)
return rc; return rc;
params = 14; /* includes 2 bytes of null string, converted to LE below */ params = 14; /* includes 2 bytes of null string, converted to LE below*/
byte_count = 0; byte_count = 0;
pSMB->TotalDataCount = 0; /* no EAs */ pSMB->TotalDataCount = 0; /* no EAs */
pSMB->MaxParameterCount = cpu_to_le16(8); pSMB->MaxParameterCount = cpu_to_le16(8);
pSMB->MaxDataCount = pSMB->MaxDataCount =
cpu_to_le16((tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE) & 0xFFFFFF00); cpu_to_le16((tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE) &
0xFFFFFF00);
pSMB->MaxSetupCount = 0; pSMB->MaxSetupCount = 0;
pSMB->Reserved = 0; pSMB->Reserved = 0;
pSMB->Flags = 0; pSMB->Flags = 0;
...@@ -3588,7 +3598,7 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon, ...@@ -3588,7 +3598,7 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
if (rc) { if (rc) {
if (rc == -EBADF) { if (rc == -EBADF) {
psrch_inf->endOfSearch = TRUE; psrch_inf->endOfSearch = TRUE;
rc = 0; /* search probably was closed at end of search above */ rc = 0; /* search probably was closed at end of search*/
} else } else
cFYI(1, ("FindNext returned = %d", rc)); cFYI(1, ("FindNext returned = %d", rc));
} else { /* decode response */ } else { /* decode response */
...@@ -3617,11 +3627,12 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon, ...@@ -3617,11 +3627,12 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
psrch_inf->endOfSearch = TRUE; psrch_inf->endOfSearch = TRUE;
else else
psrch_inf->endOfSearch = FALSE; psrch_inf->endOfSearch = FALSE;
psrch_inf->entries_in_buffer =
psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); le16_to_cpu(parms->SearchCount);
psrch_inf->index_of_last_entry += psrch_inf->index_of_last_entry +=
psrch_inf->entries_in_buffer; psrch_inf->entries_in_buffer;
/* cFYI(1,("fnxt2 entries in buf %d index_of_last %d",psrch_inf->entries_in_buffer,psrch_inf->index_of_last_entry)); */ /* cFYI(1,("fnxt2 entries in buf %d index_of_last %d",
psrch_inf->entries_in_buffer, psrch_inf->index_of_last_entry)); */
/* BB fixme add unlock here */ /* BB fixme add unlock here */
} }
...@@ -3636,12 +3647,12 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon, ...@@ -3636,12 +3647,12 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
FNext2_err_exit: FNext2_err_exit:
if (rc != 0) if (rc != 0)
cifs_buf_release(pSMB); cifs_buf_release(pSMB);
return rc; return rc;
} }
int int
CIFSFindClose(const int xid, struct cifsTconInfo *tcon, const __u16 searchHandle) CIFSFindClose(const int xid, struct cifsTconInfo *tcon,
const __u16 searchHandle)
{ {
int rc = 0; int rc = 0;
FINDCLOSE_REQ *pSMB = NULL; FINDCLOSE_REQ *pSMB = NULL;
...@@ -3688,7 +3699,7 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon, ...@@ -3688,7 +3699,7 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
int name_len, bytes_returned; int name_len, bytes_returned;
__u16 params, byte_count; __u16 params, byte_count;
cFYI(1,("In GetSrvInodeNum for %s",searchName)); cFYI(1, ("In GetSrvInodeNum for %s", searchName));
if (tcon == NULL) if (tcon == NULL)
return -ENODEV; return -ENODEV;
...@@ -3698,11 +3709,10 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon, ...@@ -3698,11 +3709,10 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
if (rc) if (rc)
return rc; return rc;
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
name_len = name_len =
cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
PATH_MAX,nls_codepage, remap); PATH_MAX, nls_codepage, remap);
name_len++; /* trailing null */ name_len++; /* trailing null */
name_len *= 2; name_len *= 2;
} else { /* BB improve the check for buffer overruns BB */ } else { /* BB improve the check for buffer overruns BB */
...@@ -3722,7 +3732,7 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon, ...@@ -3722,7 +3732,7 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
pSMB->Timeout = 0; pSMB->Timeout = 0;
pSMB->Reserved2 = 0; pSMB->Reserved2 = 0;
pSMB->ParameterOffset = cpu_to_le16(offsetof( pSMB->ParameterOffset = cpu_to_le16(offsetof(
struct smb_com_transaction2_qpi_req ,InformationLevel) - 4); struct smb_com_transaction2_qpi_req, InformationLevel) - 4);
pSMB->DataCount = 0; pSMB->DataCount = 0;
pSMB->DataOffset = 0; pSMB->DataOffset = 0;
pSMB->SetupCount = 1; pSMB->SetupCount = 1;
...@@ -3751,7 +3761,7 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon, ...@@ -3751,7 +3761,7 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
else { else {
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
__u16 count = le16_to_cpu(pSMBr->t2.DataCount); __u16 count = le16_to_cpu(pSMBr->t2.DataCount);
struct file_internal_info * pfinfo; struct file_internal_info *pfinfo;
/* BB Do we need a cast or hash here ? */ /* BB Do we need a cast or hash here ? */
if (count < 8) { if (count < 8) {
cFYI(1, ("Illegal size ret in QryIntrnlInf")); cFYI(1, ("Illegal size ret in QryIntrnlInf"));
...@@ -3780,12 +3790,12 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, ...@@ -3780,12 +3790,12 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
/* TRANS2_GET_DFS_REFERRAL */ /* TRANS2_GET_DFS_REFERRAL */
TRANSACTION2_GET_DFS_REFER_REQ *pSMB = NULL; TRANSACTION2_GET_DFS_REFER_REQ *pSMB = NULL;
TRANSACTION2_GET_DFS_REFER_RSP *pSMBr = NULL; TRANSACTION2_GET_DFS_REFER_RSP *pSMBr = NULL;
struct dfs_referral_level_3 * referrals = NULL; struct dfs_referral_level_3 *referrals = NULL;
int rc = 0; int rc = 0;
int bytes_returned; int bytes_returned;
int name_len; int name_len;
unsigned int i; unsigned int i;
char * temp; char *temp;
__u16 params, byte_count; __u16 params, byte_count;
*number_of_UNC_in_array = 0; *number_of_UNC_in_array = 0;
*targetUNCs = NULL; *targetUNCs = NULL;
...@@ -3863,14 +3873,15 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, ...@@ -3863,14 +3873,15 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
/* BB Add logic to parse referrals here */ /* BB Add logic to parse referrals here */
rc = validate_t2((struct smb_t2_rsp *)pSMBr); rc = validate_t2((struct smb_t2_rsp *)pSMBr);
if (rc || (pSMBr->ByteCount < 17)) /* BB also check enough total bytes returned */ /* BB Also check if enough total bytes returned? */
if (rc || (pSMBr->ByteCount < 17))
rc = -EIO; /* bad smb */ rc = -EIO; /* bad smb */
else { else {
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
__u16 data_count = le16_to_cpu(pSMBr->t2.DataCount); __u16 data_count = le16_to_cpu(pSMBr->t2.DataCount);
cFYI(1, cFYI(1,
("Decoding GetDFSRefer response. BCC: %d Offset %d", ("Decoding GetDFSRefer response BCC: %d Offset %d",
pSMBr->ByteCount, data_offset)); pSMBr->ByteCount, data_offset));
referrals = referrals =
(struct dfs_referral_level_3 *) (struct dfs_referral_level_3 *)
...@@ -3878,11 +3889,17 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, ...@@ -3878,11 +3889,17 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
data_offset + data_offset +
(char *) &pSMBr->hdr.Protocol); (char *) &pSMBr->hdr.Protocol);
cFYI(1,("num_referrals: %d dfs flags: 0x%x ... \nfor referral one refer size: 0x%x srv type: 0x%x refer flags: 0x%x ttl: 0x%x", cFYI(1,("num_referrals: %d dfs flags: 0x%x ... \nfor referral one refer size: 0x%x srv type: 0x%x refer flags: 0x%x ttl: 0x%x",
le16_to_cpu(pSMBr->NumberOfReferrals),le16_to_cpu(pSMBr->DFSFlags), le16_to_cpu(referrals->ReferralSize),le16_to_cpu(referrals->ServerType),le16_to_cpu(referrals->ReferralFlags),le16_to_cpu(referrals->TimeToLive))); le16_to_cpu(pSMBr->NumberOfReferrals),
le16_to_cpu(pSMBr->DFSFlags),
le16_to_cpu(referrals->ReferralSize),
le16_to_cpu(referrals->ServerType),
le16_to_cpu(referrals->ReferralFlags),
le16_to_cpu(referrals->TimeToLive)));
/* BB This field is actually two bytes in from start of /* BB This field is actually two bytes in from start of
data block so we could do safety check that DataBlock data block so we could do safety check that DataBlock
begins at address of pSMBr->NumberOfReferrals */ begins at address of pSMBr->NumberOfReferrals */
*number_of_UNC_in_array = le16_to_cpu(pSMBr->NumberOfReferrals); *number_of_UNC_in_array =
le16_to_cpu(pSMBr->NumberOfReferrals);
/* BB Fix below so can return more than one referral */ /* BB Fix below so can return more than one referral */
if (*number_of_UNC_in_array > 1) if (*number_of_UNC_in_array > 1)
...@@ -3890,9 +3907,10 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, ...@@ -3890,9 +3907,10 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
/* get the length of the strings describing refs */ /* get the length of the strings describing refs */
name_len = 0; name_len = 0;
for(i=0;i<*number_of_UNC_in_array;i++) { for (i = 0; i < *number_of_UNC_in_array; i++) {
/* make sure that DfsPathOffset not past end */ /* make sure that DfsPathOffset not past end */
__u16 offset = le16_to_cpu(referrals->DfsPathOffset); __u16 offset =
le16_to_cpu(referrals->DfsPathOffset);
if (offset > data_count) { if (offset > data_count) {
/* if invalid referral, stop here and do /* if invalid referral, stop here and do
not try to copy any more */ not try to copy any more */
...@@ -3902,35 +3920,38 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses, ...@@ -3902,35 +3920,38 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
temp = ((char *)referrals) + offset; temp = ((char *)referrals) + offset;
if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) { if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
name_len += UniStrnlen((wchar_t *)temp,data_count); name_len += UniStrnlen((wchar_t *)temp,
data_count);
} else { } else {
name_len += strnlen(temp,data_count); name_len += strnlen(temp, data_count);
} }
referrals++; referrals++;
/* BB add check that referral pointer does not fall off end PDU */ /* BB add check that referral pointer does
not fall off end PDU */
} }
/* BB add check for name_len bigger than bcc */ /* BB add check for name_len bigger than bcc */
*targetUNCs = *targetUNCs =
kmalloc(name_len+1+ (*number_of_UNC_in_array),GFP_KERNEL); kmalloc(name_len+1+(*number_of_UNC_in_array),
GFP_KERNEL);
if (*targetUNCs == NULL) { if (*targetUNCs == NULL) {
rc = -ENOMEM; rc = -ENOMEM;
goto GetDFSRefExit; goto GetDFSRefExit;
} }
/* copy the ref strings */ /* copy the ref strings */
referrals = referrals = (struct dfs_referral_level_3 *)
(struct dfs_referral_level_3 *) (8 /* sizeof data hdr */ + data_offset +
(8 /* sizeof data hdr */ +
data_offset +
(char *) &pSMBr->hdr.Protocol); (char *) &pSMBr->hdr.Protocol);
for(i=0;i<*number_of_UNC_in_array;i++) { for (i = 0; i < *number_of_UNC_in_array; i++) {
temp = ((char *)referrals) + le16_to_cpu(referrals->DfsPathOffset); temp = ((char *)referrals) +
le16_to_cpu(referrals->DfsPathOffset);
if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) { if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
cifs_strfromUCS_le(*targetUNCs, cifs_strfromUCS_le(*targetUNCs,
(__le16 *) temp, name_len, nls_codepage); (__le16 *) temp,
name_len,
nls_codepage);
} else { } else {
strncpy(*targetUNCs,temp,name_len); strncpy(*targetUNCs, temp, name_len);
} }
/* BB update target_uncs pointers */ /* BB update target_uncs pointers */
referrals++; referrals++;
...@@ -4007,11 +4028,10 @@ SMBOldQFSInfo(const int xid, struct cifsTconInfo *tcon, struct kstatfs *FSData) ...@@ -4007,11 +4028,10 @@ SMBOldQFSInfo(const int xid, struct cifsTconInfo *tcon, struct kstatfs *FSData)
rc = -EIO; /* bad smb */ rc = -EIO; /* bad smb */
else { else {
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
cFYI(1,("qfsinf resp BCC: %d Offset %d", cFYI(1, ("qfsinf resp BCC: %d Offset %d",
pSMBr->ByteCount, data_offset)); pSMBr->ByteCount, data_offset));
response_data = response_data = (FILE_SYSTEM_ALLOC_INFO *)
(FILE_SYSTEM_ALLOC_INFO *)
(((char *) &pSMBr->hdr.Protocol) + data_offset); (((char *) &pSMBr->hdr.Protocol) + data_offset);
FSData->f_bsize = FSData->f_bsize =
le16_to_cpu(response_data->BytesPerSector) * le16_to_cpu(response_data->BytesPerSector) *
...@@ -4164,7 +4184,8 @@ CIFSSMBQFSAttributeInfo(const int xid, struct cifsTconInfo *tcon) ...@@ -4164,7 +4184,8 @@ CIFSSMBQFSAttributeInfo(const int xid, struct cifsTconInfo *tcon)
} else { /* decode response */ } else { /* decode response */
rc = validate_t2((struct smb_t2_rsp *)pSMBr); rc = validate_t2((struct smb_t2_rsp *)pSMBr);
if (rc || (pSMBr->ByteCount < 13)) { /* BB also check enough bytes returned */ if (rc || (pSMBr->ByteCount < 13)) {
/* BB also check if enough bytes returned */
rc = -EIO; /* bad smb */ rc = -EIO; /* bad smb */
} else { } else {
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
...@@ -4346,7 +4367,8 @@ CIFSSMBSetFSUnixInfo(const int xid, struct cifsTconInfo *tcon, __u64 cap) ...@@ -4346,7 +4367,8 @@ CIFSSMBSetFSUnixInfo(const int xid, struct cifsTconInfo *tcon, __u64 cap)
pSMB->Flags = 0; pSMB->Flags = 0;
pSMB->Timeout = 0; pSMB->Timeout = 0;
pSMB->Reserved2 = 0; pSMB->Reserved2 = 0;
param_offset = offsetof(struct smb_com_transaction2_setfsi_req, FileNum) - 4; param_offset = offsetof(struct smb_com_transaction2_setfsi_req, FileNum)
- 4;
offset = param_offset + params; offset = param_offset + params;
pSMB->MaxParameterCount = cpu_to_le16(4); pSMB->MaxParameterCount = cpu_to_le16(4);
...@@ -4625,8 +4647,8 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size, ...@@ -4625,8 +4647,8 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
pSMB->TotalParameterCount = pSMB->ParameterCount; pSMB->TotalParameterCount = pSMB->ParameterCount;
pSMB->ParameterOffset = cpu_to_le16(param_offset); pSMB->ParameterOffset = cpu_to_le16(param_offset);
parm_data = parm_data =
(struct file_end_of_file_info *) (((char *) &pSMB->hdr.Protocol) + (struct file_end_of_file_info *) (((char *) &pSMB->hdr.Protocol)
offset); + offset);
pSMB->DataOffset = cpu_to_le16(offset); pSMB->DataOffset = cpu_to_le16(offset);
parm_data->FileSize = cpu_to_le64(size); parm_data->FileSize = cpu_to_le64(size);
pSMB->Fid = fid; pSMB->Fid = fid;
...@@ -4672,8 +4694,8 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size, ...@@ -4672,8 +4694,8 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
time and resort to the original setpathinfo level which takes the ancient time and resort to the original setpathinfo level which takes the ancient
DOS time format with 2 second granularity */ DOS time format with 2 second granularity */
int int
CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_INFO * data, CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon,
__u16 fid) const FILE_BASIC_INFO *data, __u16 fid)
{ {
struct smb_com_transaction2_sfi_req *pSMB = NULL; struct smb_com_transaction2_sfi_req *pSMB = NULL;
struct smb_com_transaction2_sfi_rsp *pSMBr = NULL; struct smb_com_transaction2_sfi_rsp *pSMBr = NULL;
...@@ -4728,11 +4750,11 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_I ...@@ -4728,11 +4750,11 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_I
pSMB->Reserved4 = 0; pSMB->Reserved4 = 0;
pSMB->hdr.smb_buf_length += byte_count; pSMB->hdr.smb_buf_length += byte_count;
pSMB->ByteCount = cpu_to_le16(byte_count); pSMB->ByteCount = cpu_to_le16(byte_count);
memcpy(data_offset,data,sizeof(FILE_BASIC_INFO)); memcpy(data_offset, data, sizeof(FILE_BASIC_INFO));
rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
(struct smb_hdr *) pSMBr, &bytes_returned, 0); (struct smb_hdr *) pSMBr, &bytes_returned, 0);
if (rc) { if (rc) {
cFYI(1,("Send error in Set Time (SetFileInfo) = %d",rc)); cFYI(1, ("Send error in Set Time (SetFileInfo) = %d", rc));
} }
cifs_small_buf_release(pSMB); cifs_small_buf_release(pSMB);
...@@ -4746,7 +4768,7 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_I ...@@ -4746,7 +4768,7 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_I
int int
CIFSSMBSetTimes(const int xid, struct cifsTconInfo *tcon, const char *fileName, CIFSSMBSetTimes(const int xid, struct cifsTconInfo *tcon, const char *fileName,
const FILE_BASIC_INFO * data, const FILE_BASIC_INFO *data,
const struct nls_table *nls_codepage, int remap) const struct nls_table *nls_codepage, int remap)
{ {
TRANSACTION2_SPI_REQ *pSMB = NULL; TRANSACTION2_SPI_REQ *pSMB = NULL;
...@@ -4987,16 +5009,16 @@ CIFSSMBUnixSetPerms(const int xid, struct cifsTconInfo *tcon, ...@@ -4987,16 +5009,16 @@ CIFSSMBUnixSetPerms(const int xid, struct cifsTconInfo *tcon,
int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon, int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
const int notify_subdirs, const __u16 netfid, const int notify_subdirs, const __u16 netfid,
__u32 filter, struct file * pfile, int multishot, __u32 filter, struct file *pfile, int multishot,
const struct nls_table *nls_codepage) const struct nls_table *nls_codepage)
{ {
int rc = 0; int rc = 0;
struct smb_com_transaction_change_notify_req * pSMB = NULL; struct smb_com_transaction_change_notify_req *pSMB = NULL;
struct smb_com_ntransaction_change_notify_rsp * pSMBr = NULL; struct smb_com_ntransaction_change_notify_rsp *pSMBr = NULL;
struct dir_notify_req *dnotify_req; struct dir_notify_req *dnotify_req;
int bytes_returned; int bytes_returned;
cFYI(1, ("In CIFSSMBNotify for file handle %d",(int)netfid)); cFYI(1, ("In CIFSSMBNotify for file handle %d", (int)netfid));
rc = smb_init(SMB_COM_NT_TRANSACT, 23, tcon, (void **) &pSMB, rc = smb_init(SMB_COM_NT_TRANSACT, 23, tcon, (void **) &pSMB,
(void **) &pSMBr); (void **) &pSMBr);
if (rc) if (rc)
...@@ -5060,7 +5082,7 @@ int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon, ...@@ -5060,7 +5082,7 @@ int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
ssize_t ssize_t
CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
const unsigned char *searchName, const unsigned char *searchName,
char * EAData, size_t buf_size, char *EAData, size_t buf_size,
const struct nls_table *nls_codepage, int remap) const struct nls_table *nls_codepage, int remap)
{ {
/* BB assumes one setup word */ /* BB assumes one setup word */
...@@ -5069,8 +5091,8 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, ...@@ -5069,8 +5091,8 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
int rc = 0; int rc = 0;
int bytes_returned; int bytes_returned;
int name_len; int name_len;
struct fea * temp_fea; struct fea *temp_fea;
char * temp_ptr; char *temp_ptr;
__u16 params, byte_count; __u16 params, byte_count;
cFYI(1, ("In Query All EAs path %s", searchName)); cFYI(1, ("In Query All EAs path %s", searchName));
...@@ -5092,7 +5114,7 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, ...@@ -5092,7 +5114,7 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
strncpy(pSMB->FileName, searchName, name_len); strncpy(pSMB->FileName, searchName, name_len);
} }
params = 2 /* level */ + 4 /* reserved */ + name_len /* includes NUL */ ; params = 2 /* level */ + 4 /* reserved */ + name_len /* includes NUL */;
pSMB->TotalDataCount = 0; pSMB->TotalDataCount = 0;
pSMB->MaxParameterCount = cpu_to_le16(2); pSMB->MaxParameterCount = cpu_to_le16(2);
pSMB->MaxDataCount = cpu_to_le16(4000); /* BB find exact max SMB PDU from sess structure BB */ pSMB->MaxDataCount = cpu_to_le16(4000); /* BB find exact max SMB PDU from sess structure BB */
...@@ -5102,7 +5124,7 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, ...@@ -5102,7 +5124,7 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
pSMB->Timeout = 0; pSMB->Timeout = 0;
pSMB->Reserved2 = 0; pSMB->Reserved2 = 0;
pSMB->ParameterOffset = cpu_to_le16(offsetof( pSMB->ParameterOffset = cpu_to_le16(offsetof(
struct smb_com_transaction2_qpi_req ,InformationLevel) - 4); struct smb_com_transaction2_qpi_req, InformationLevel) - 4);
pSMB->DataCount = 0; pSMB->DataCount = 0;
pSMB->DataOffset = 0; pSMB->DataOffset = 0;
pSMB->SetupCount = 1; pSMB->SetupCount = 1;
...@@ -5139,7 +5161,7 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, ...@@ -5139,7 +5161,7 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
/* check that each element of each entry does not /* check that each element of each entry does not
go beyond end of list */ go beyond end of list */
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
struct fealist * ea_response_data; struct fealist *ea_response_data;
rc = 0; rc = 0;
/* validate_trans2_offsets() */ /* validate_trans2_offsets() */
/* BB check if start of smb + data_offset > &bcc+ bcc */ /* BB check if start of smb + data_offset > &bcc+ bcc */
...@@ -5147,16 +5169,16 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, ...@@ -5147,16 +5169,16 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
(((char *) &pSMBr->hdr.Protocol) + (((char *) &pSMBr->hdr.Protocol) +
data_offset); data_offset);
name_len = le32_to_cpu(ea_response_data->list_len); name_len = le32_to_cpu(ea_response_data->list_len);
cFYI(1,("ea length %d", name_len)); cFYI(1, ("ea length %d", name_len));
if (name_len <= 8) { if (name_len <= 8) {
/* returned EA size zeroed at top of function */ /* returned EA size zeroed at top of function */
cFYI(1,("empty EA list returned from server")); cFYI(1, ("empty EA list returned from server"));
} else { } else {
/* account for ea list len */ /* account for ea list len */
name_len -= 4; name_len -= 4;
temp_fea = ea_response_data->list; temp_fea = ea_response_data->list;
temp_ptr = (char *)temp_fea; temp_ptr = (char *)temp_fea;
while(name_len > 0) { while (name_len > 0) {
__u16 value_len; __u16 value_len;
name_len -= 4; name_len -= 4;
temp_ptr += 4; temp_ptr += 4;
...@@ -5164,10 +5186,11 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, ...@@ -5164,10 +5186,11 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
/* account for prefix user. and trailing null */ /* account for prefix user. and trailing null */
rc = rc + 5 + 1; rc = rc + 5 + 1;
if (rc < (int)buf_size) { if (rc < (int)buf_size) {
memcpy(EAData,"user.",5); memcpy(EAData, "user.", 5);
EAData+=5; EAData += 5;
memcpy(EAData,temp_ptr,temp_fea->name_len); memcpy(EAData, temp_ptr,
EAData+=temp_fea->name_len; temp_fea->name_len);
EAData += temp_fea->name_len;
/* null terminate name */ /* null terminate name */
*EAData = 0; *EAData = 0;
EAData = EAData + 1; EAData = EAData + 1;
...@@ -5183,11 +5206,15 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, ...@@ -5183,11 +5206,15 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
/* account for trailing null */ /* account for trailing null */
name_len--; name_len--;
temp_ptr++; temp_ptr++;
value_len = le16_to_cpu(temp_fea->value_len); value_len =
le16_to_cpu(temp_fea->value_len);
name_len -= value_len; name_len -= value_len;
temp_ptr += value_len; temp_ptr += value_len;
/* BB check that temp_ptr is still within smb BB*/ /* BB check that temp_ptr is still
/* no trailing null to account for in value len */ within the SMB BB*/
/* no trailing null to account for
in value len */
/* go on to next EA */ /* go on to next EA */
temp_fea = (struct fea *)temp_ptr; temp_fea = (struct fea *)temp_ptr;
} }
...@@ -5202,9 +5229,9 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, ...@@ -5202,9 +5229,9 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
return (ssize_t)rc; return (ssize_t)rc;
} }
ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon, ssize_t CIFSSMBQueryEA(const int xid, struct cifsTconInfo *tcon,
const unsigned char * searchName,const unsigned char * ea_name, const unsigned char *searchName, const unsigned char *ea_name,
unsigned char * ea_value, size_t buf_size, unsigned char *ea_value, size_t buf_size,
const struct nls_table *nls_codepage, int remap) const struct nls_table *nls_codepage, int remap)
{ {
TRANSACTION2_QPI_REQ *pSMB = NULL; TRANSACTION2_QPI_REQ *pSMB = NULL;
...@@ -5212,8 +5239,8 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon, ...@@ -5212,8 +5239,8 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
int rc = 0; int rc = 0;
int bytes_returned; int bytes_returned;
int name_len; int name_len;
struct fea * temp_fea; struct fea *temp_fea;
char * temp_ptr; char *temp_ptr;
__u16 params, byte_count; __u16 params, byte_count;
cFYI(1, ("In Query EA path %s", searchName)); cFYI(1, ("In Query EA path %s", searchName));
...@@ -5235,7 +5262,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon, ...@@ -5235,7 +5262,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
strncpy(pSMB->FileName, searchName, name_len); strncpy(pSMB->FileName, searchName, name_len);
} }
params = 2 /* level */ + 4 /* reserved */ + name_len /* includes NUL */ ; params = 2 /* level */ + 4 /* reserved */ + name_len /* includes NUL */;
pSMB->TotalDataCount = 0; pSMB->TotalDataCount = 0;
pSMB->MaxParameterCount = cpu_to_le16(2); pSMB->MaxParameterCount = cpu_to_le16(2);
pSMB->MaxDataCount = cpu_to_le16(4000); /* BB find exact max SMB PDU from sess structure BB */ pSMB->MaxDataCount = cpu_to_le16(4000); /* BB find exact max SMB PDU from sess structure BB */
...@@ -5245,7 +5272,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon, ...@@ -5245,7 +5272,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
pSMB->Timeout = 0; pSMB->Timeout = 0;
pSMB->Reserved2 = 0; pSMB->Reserved2 = 0;
pSMB->ParameterOffset = cpu_to_le16(offsetof( pSMB->ParameterOffset = cpu_to_le16(offsetof(
struct smb_com_transaction2_qpi_req ,InformationLevel) - 4); struct smb_com_transaction2_qpi_req, InformationLevel) - 4);
pSMB->DataCount = 0; pSMB->DataCount = 0;
pSMB->DataOffset = 0; pSMB->DataOffset = 0;
pSMB->SetupCount = 1; pSMB->SetupCount = 1;
...@@ -5282,7 +5309,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon, ...@@ -5282,7 +5309,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
/* check that each element of each entry does not /* check that each element of each entry does not
go beyond end of list */ go beyond end of list */
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
struct fealist * ea_response_data; struct fealist *ea_response_data;
rc = -ENODATA; rc = -ENODATA;
/* validate_trans2_offsets() */ /* validate_trans2_offsets() */
/* BB check if start of smb + data_offset > &bcc+ bcc*/ /* BB check if start of smb + data_offset > &bcc+ bcc*/
...@@ -5290,10 +5317,10 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon, ...@@ -5290,10 +5317,10 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
(((char *) &pSMBr->hdr.Protocol) + (((char *) &pSMBr->hdr.Protocol) +
data_offset); data_offset);
name_len = le32_to_cpu(ea_response_data->list_len); name_len = le32_to_cpu(ea_response_data->list_len);
cFYI(1,("ea length %d", name_len)); cFYI(1, ("ea length %d", name_len));
if (name_len <= 8) { if (name_len <= 8) {
/* returned EA size zeroed at top of function */ /* returned EA size zeroed at top of function */
cFYI(1,("empty EA list returned from server")); cFYI(1, ("empty EA list returned from server"));
} else { } else {
/* account for ea list len */ /* account for ea list len */
name_len -= 4; name_len -= 4;
...@@ -5301,11 +5328,12 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon, ...@@ -5301,11 +5328,12 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
temp_ptr = (char *)temp_fea; temp_ptr = (char *)temp_fea;
/* loop through checking if we have a matching /* loop through checking if we have a matching
name and then return the associated value */ name and then return the associated value */
while(name_len > 0) { while (name_len > 0) {
__u16 value_len; __u16 value_len;
name_len -= 4; name_len -= 4;
temp_ptr += 4; temp_ptr += 4;
value_len = le16_to_cpu(temp_fea->value_len); value_len =
le16_to_cpu(temp_fea->value_len);
/* BB validate that value_len falls within SMB, /* BB validate that value_len falls within SMB,
even though maximum for name_len is 255 */ even though maximum for name_len is 255 */
if (memcmp(temp_fea->name, ea_name, if (memcmp(temp_fea->name, ea_name,
...@@ -5317,8 +5345,9 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon, ...@@ -5317,8 +5345,9 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
memcpy(ea_value, memcpy(ea_value,
temp_fea->name+temp_fea->name_len+1, temp_fea->name+temp_fea->name_len+1,
rc); rc);
/* ea values, unlike ea names, /* ea values, unlike ea
are not null terminated */ names, are not null
terminated */
} else if (buf_size == 0) { } else if (buf_size == 0) {
/* skip copy - calc size only */ /* skip copy - calc size only */
} else { } else {
...@@ -5334,8 +5363,8 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon, ...@@ -5334,8 +5363,8 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
temp_ptr++; temp_ptr++;
name_len -= value_len; name_len -= value_len;
temp_ptr += value_len; temp_ptr += value_len;
/* no trailing null to account for in value len */ /* No trailing null to account for in
/* go on to next EA */ value_len. Go on to next EA */
temp_fea = (struct fea *)temp_ptr; temp_fea = (struct fea *)temp_ptr;
} }
} }
...@@ -5351,7 +5380,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon, ...@@ -5351,7 +5380,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
int int
CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName, CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName,
const char * ea_name, const void * ea_value, const char *ea_name, const void *ea_value,
const __u16 ea_value_len, const struct nls_table *nls_codepage, const __u16 ea_value_len, const struct nls_table *nls_codepage,
int remap) int remap)
{ {
...@@ -5390,7 +5419,7 @@ CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName, ...@@ -5390,7 +5419,7 @@ CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName,
if (ea_name == NULL) if (ea_name == NULL)
name_len = 0; name_len = 0;
else else
name_len = strnlen(ea_name,255); name_len = strnlen(ea_name, 255);
count = sizeof(*parm_data) + ea_value_len + name_len + 1; count = sizeof(*parm_data) + ea_value_len + name_len + 1;
pSMB->MaxParameterCount = cpu_to_le16(2); pSMB->MaxParameterCount = cpu_to_le16(2);
...@@ -5422,16 +5451,18 @@ CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName, ...@@ -5422,16 +5451,18 @@ CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName,
parm_data->list[0].name_len = (__u8)name_len; parm_data->list[0].name_len = (__u8)name_len;
/* EA names are always ASCII */ /* EA names are always ASCII */
if (ea_name) if (ea_name)
strncpy(parm_data->list[0].name,ea_name,name_len); strncpy(parm_data->list[0].name, ea_name, name_len);
parm_data->list[0].name[name_len] = 0; parm_data->list[0].name[name_len] = 0;
parm_data->list[0].value_len = cpu_to_le16(ea_value_len); parm_data->list[0].value_len = cpu_to_le16(ea_value_len);
/* caller ensures that ea_value_len is less than 64K but /* caller ensures that ea_value_len is less than 64K but
we need to ensure that it fits within the smb */ we need to ensure that it fits within the smb */
/*BB add length check that it would fit in negotiated SMB buffer size BB */ /*BB add length check to see if it would fit in
negotiated SMB buffer size BB */
/* if (ea_value_len > buffer_size - 512 (enough for header)) */ /* if (ea_value_len > buffer_size - 512 (enough for header)) */
if (ea_value_len) if (ea_value_len)
memcpy(parm_data->list[0].name+name_len+1,ea_value,ea_value_len); memcpy(parm_data->list[0].name+name_len+1,
ea_value, ea_value_len);
pSMB->TotalDataCount = pSMB->DataCount; pSMB->TotalDataCount = pSMB->DataCount;
pSMB->ParameterCount = cpu_to_le16(params); pSMB->ParameterCount = cpu_to_le16(params);
......
...@@ -637,8 +637,9 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -637,8 +637,9 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
wake_up_process(task_to_wake); wake_up_process(task_to_wake);
} else if ((is_valid_oplock_break(smb_buffer, server) == FALSE) } else if ((is_valid_oplock_break(smb_buffer, server) == FALSE)
&& (isMultiRsp == FALSE)) { && (isMultiRsp == FALSE)) {
cERROR(1, ("No task to wake, unknown frame rcvd! NumMids %d", midCount.counter)); cERROR(1, ("No task to wake, unknown frame received! "
cifs_dump_mem("Received Data is: ",(char *)smb_buffer, "NumMids %d", midCount.counter));
cifs_dump_mem("Received Data is: ", (char *)smb_buffer,
sizeof(struct smb_hdr)); sizeof(struct smb_hdr));
#ifdef CONFIG_CIFS_DEBUG2 #ifdef CONFIG_CIFS_DEBUG2
cifs_dump_detail(smb_buffer); cifs_dump_detail(smb_buffer);
...@@ -708,8 +709,8 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -708,8 +709,8 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
list_for_each(tmp, &server->pending_mid_q) { list_for_each(tmp, &server->pending_mid_q) {
mid_entry = list_entry(tmp, struct mid_q_entry, qhead); mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
if (mid_entry->midState == MID_REQUEST_SUBMITTED) { if (mid_entry->midState == MID_REQUEST_SUBMITTED) {
cFYI(1, cFYI(1, ("Clearing Mid 0x%x - waking up ",
("Clearing Mid 0x%x - waking up ",mid_entry->mid)); mid_entry->mid));
task_to_wake = mid_entry->tsk; task_to_wake = mid_entry->tsk;
if (task_to_wake) { if (task_to_wake) {
wake_up_process(task_to_wake); wake_up_process(task_to_wake);
...@@ -763,7 +764,8 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -763,7 +764,8 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
} }
static int static int
cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) cifs_parse_mount_options(char *options, const char *devname,
struct smb_vol *vol)
{ {
char *value; char *value;
char *data; char *data;
...@@ -774,12 +776,12 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -774,12 +776,12 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
separator[1] = 0; separator[1] = 0;
if (Local_System_Name[0] != 0) if (Local_System_Name[0] != 0)
memcpy(vol->source_rfc1001_name, Local_System_Name,15); memcpy(vol->source_rfc1001_name, Local_System_Name, 15);
else { else {
char *nodename = utsname()->nodename; char *nodename = utsname()->nodename;
int n = strnlen(nodename,15); int n = strnlen(nodename, 15);
memset(vol->source_rfc1001_name,0x20,15); memset(vol->source_rfc1001_name, 0x20, 15);
for(i=0 ; i < n ; i++) { for (i = 0; i < n; i++) {
/* does not have to be perfect mapping since field is /* does not have to be perfect mapping since field is
informational, only used for servers that do not support informational, only used for servers that do not support
port 445 and it can be overridden at mount time */ port 445 and it can be overridden at mount time */
...@@ -804,7 +806,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -804,7 +806,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
if (!options) if (!options)
return 1; return 1;
if (strncmp(options,"sep=",4) == 0) { if (strncmp(options, "sep=", 4) == 0) {
if (options[4] != 0) { if (options[4] != 0) {
separator[0] = options[4]; separator[0] = options[4];
options += 5; options += 5;
...@@ -819,9 +821,10 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -819,9 +821,10 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
if ((value = strchr(data, '=')) != NULL) if ((value = strchr(data, '=')) != NULL)
*value++ = '\0'; *value++ = '\0';
if (strnicmp(data, "user_xattr",10) == 0) {/*parse before user*/ /* Have to parse this before we parse for "user" */
if (strnicmp(data, "user_xattr", 10) == 0) {
vol->no_xattr = 0; vol->no_xattr = 0;
} else if (strnicmp(data, "nouser_xattr",12) == 0) { } else if (strnicmp(data, "nouser_xattr", 12) == 0) {
vol->no_xattr = 1; vol->no_xattr = 1;
} else if (strnicmp(data, "user", 4) == 0) { } else if (strnicmp(data, "user", 4) == 0) {
if (!value) { if (!value) {
...@@ -870,8 +873,8 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -870,8 +873,8 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
(value[temp_len+1] == separator[0])) { (value[temp_len+1] == separator[0])) {
/* reinsert comma */ /* reinsert comma */
value[temp_len] = separator[0]; value[temp_len] = separator[0];
temp_len+=2; /* move after the second comma */ temp_len += 2; /* move after second comma */
while(value[temp_len] != 0) { while (value[temp_len] != 0) {
if (value[temp_len] == separator[0]) { if (value[temp_len] == separator[0]) {
if (value[temp_len+1] == if (value[temp_len+1] ==
separator[0]) { separator[0]) {
...@@ -897,10 +900,11 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -897,10 +900,11 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
allocating a few bytes too many, which is ok */ allocating a few bytes too many, which is ok */
vol->password = kzalloc(temp_len, GFP_KERNEL); vol->password = kzalloc(temp_len, GFP_KERNEL);
if (vol->password == NULL) { if (vol->password == NULL) {
printk("CIFS: no memory for pass\n"); printk(KERN_WARNING "CIFS: no memory "
"for password\n");
return 1; return 1;
} }
for(i=0,j=0;i<temp_len;i++,j++) { for (i = 0, j = 0; i < temp_len; i++, j++) {
vol->password[j] = value[i]; vol->password[j] = value[i];
if (value[i] == separator[0] if (value[i] == separator[0]
&& value[i+1] == separator[0]) { && value[i+1] == separator[0]) {
...@@ -912,7 +916,8 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -912,7 +916,8 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
} else { } else {
vol->password = kzalloc(temp_len+1, GFP_KERNEL); vol->password = kzalloc(temp_len+1, GFP_KERNEL);
if (vol->password == NULL) { if (vol->password == NULL) {
printk("CIFS: no memory for pass\n"); printk(KERN_WARNING "CIFS: no memory "
"for password\n");
return 1; return 1;
} }
strcpy(vol->password, value); strcpy(vol->password, value);
...@@ -923,12 +928,13 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -923,12 +928,13 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
} else if (strnlen(value, 35) < 35) { } else if (strnlen(value, 35) < 35) {
vol->UNCip = value; vol->UNCip = value;
} else { } else {
printk(KERN_WARNING "CIFS: ip address too long\n"); printk(KERN_WARNING "CIFS: ip address "
"too long\n");
return 1; return 1;
} }
} else if (strnicmp(data, "sec", 3) == 0) { } else if (strnicmp(data, "sec", 3) == 0) {
if (!value || !*value) { if (!value || !*value) {
cERROR(1,("no security value specified")); cERROR(1, ("no security value specified"));
continue; continue;
} else if (strnicmp(value, "krb5i", 5) == 0) { } else if (strnicmp(value, "krb5i", 5) == 0) {
vol->secFlg |= CIFSSEC_MAY_KRB5 | vol->secFlg |= CIFSSEC_MAY_KRB5 |
...@@ -936,7 +942,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -936,7 +942,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
} else if (strnicmp(value, "krb5p", 5) == 0) { } else if (strnicmp(value, "krb5p", 5) == 0) {
/* vol->secFlg |= CIFSSEC_MUST_SEAL | /* vol->secFlg |= CIFSSEC_MUST_SEAL |
CIFSSEC_MAY_KRB5; */ CIFSSEC_MAY_KRB5; */
cERROR(1,("Krb5 cifs privacy not supported")); cERROR(1, ("Krb5 cifs privacy not supported"));
return 1; return 1;
} else if (strnicmp(value, "krb5", 4) == 0) { } else if (strnicmp(value, "krb5", 4) == 0) {
vol->secFlg |= CIFSSEC_MAY_KRB5; vol->secFlg |= CIFSSEC_MAY_KRB5;
...@@ -961,28 +967,29 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -961,28 +967,29 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
} else if (strnicmp(value, "none", 4) == 0) { } else if (strnicmp(value, "none", 4) == 0) {
vol->nullauth = 1; vol->nullauth = 1;
} else { } else {
cERROR(1,("bad security option: %s", value)); cERROR(1, ("bad security option: %s", value));
return 1; return 1;
} }
} else if ((strnicmp(data, "unc", 3) == 0) } else if ((strnicmp(data, "unc", 3) == 0)
|| (strnicmp(data, "target", 6) == 0) || (strnicmp(data, "target", 6) == 0)
|| (strnicmp(data, "path", 4) == 0)) { || (strnicmp(data, "path", 4) == 0)) {
if (!value || !*value) { if (!value || !*value) {
printk(KERN_WARNING printk(KERN_WARNING "CIFS: invalid path to "
"CIFS: invalid path to network resource\n"); "network resource\n");
return 1; /* needs_arg; */ return 1; /* needs_arg; */
} }
if ((temp_len = strnlen(value, 300)) < 300) { if ((temp_len = strnlen(value, 300)) < 300) {
vol->UNC = kmalloc(temp_len+1,GFP_KERNEL); vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
if (vol->UNC == NULL) if (vol->UNC == NULL)
return 1; return 1;
strcpy(vol->UNC,value); strcpy(vol->UNC, value);
if (strncmp(vol->UNC, "//", 2) == 0) { if (strncmp(vol->UNC, "//", 2) == 0) {
vol->UNC[0] = '\\'; vol->UNC[0] = '\\';
vol->UNC[1] = '\\'; vol->UNC[1] = '\\';
} else if (strncmp(vol->UNC, "\\\\", 2) != 0) { } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
printk(KERN_WARNING printk(KERN_WARNING
"CIFS: UNC Path does not begin with // or \\\\ \n"); "CIFS: UNC Path does not begin "
"with // or \\\\ \n");
return 1; return 1;
} }
} else { } else {
...@@ -1001,27 +1008,28 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1001,27 +1008,28 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
vol->domainname = value; vol->domainname = value;
cFYI(1, ("Domain name set")); cFYI(1, ("Domain name set"));
} else { } else {
printk(KERN_WARNING "CIFS: domain name too long\n"); printk(KERN_WARNING "CIFS: domain name too "
"long\n");
return 1; return 1;
} }
} else if (strnicmp(data, "prefixpath", 10) == 0) { } else if (strnicmp(data, "prefixpath", 10) == 0) {
if (!value || !*value) { if (!value || !*value) {
printk(KERN_WARNING printk(KERN_WARNING
"CIFS: invalid path prefix\n"); "CIFS: invalid path prefix\n");
return 1; /* needs_arg; */ return 1; /* needs_argument */
} }
if ((temp_len = strnlen(value, 1024)) < 1024) { if ((temp_len = strnlen(value, 1024)) < 1024) {
if (value[0] != '/') if (value[0] != '/')
temp_len++; /* missing leading slash */ temp_len++; /* missing leading slash */
vol->prepath = kmalloc(temp_len+1,GFP_KERNEL); vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
if (vol->prepath == NULL) if (vol->prepath == NULL)
return 1; return 1;
if (value[0] != '/') { if (value[0] != '/') {
vol->prepath[0] = '/'; vol->prepath[0] = '/';
strcpy(vol->prepath+1,value); strcpy(vol->prepath+1, value);
} else } else
strcpy(vol->prepath,value); strcpy(vol->prepath, value);
cFYI(1, ("prefix path %s",vol->prepath)); cFYI(1, ("prefix path %s", vol->prepath));
} else { } else {
printk(KERN_WARNING "CIFS: prefix too long\n"); printk(KERN_WARNING "CIFS: prefix too long\n");
return 1; return 1;
...@@ -1032,10 +1040,11 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1032,10 +1040,11 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
return 1; /* needs_arg; */ return 1; /* needs_arg; */
} }
if (strnlen(value, 65) < 65) { if (strnlen(value, 65) < 65) {
if (strnicmp(value,"default",7)) if (strnicmp(value, "default", 7))
vol->iocharset = value; vol->iocharset = value;
/* if iocharset not set load_nls_default used by caller */ /* if iocharset not set then load_nls_default
cFYI(1, ("iocharset set to %s",value)); is used by caller */
cFYI(1, ("iocharset set to %s", value));
} else { } else {
printk(KERN_WARNING "CIFS: iocharset name too long.\n"); printk(KERN_WARNING "CIFS: iocharset name too long.\n");
return 1; return 1;
...@@ -1091,22 +1100,24 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1091,22 +1100,24 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
if (!value || !*value || (*value == ' ')) { if (!value || !*value || (*value == ' ')) {
cFYI(1, ("invalid (empty) netbiosname specified")); cFYI(1, ("invalid (empty) netbiosname specified"));
} else { } else {
memset(vol->source_rfc1001_name,0x20,15); memset(vol->source_rfc1001_name, 0x20, 15);
for(i=0;i<15;i++) { for (i = 0; i < 15; i++) {
/* BB are there cases in which a comma can be /* BB are there cases in which a comma can be
valid in this workstation netbios name (and need valid in this workstation netbios name (and need
special handling)? */ special handling)? */
/* We do not uppercase netbiosname for user */ /* We do not uppercase netbiosname for user */
if (value[i]==0) if (value[i] == 0)
break; break;
else else
vol->source_rfc1001_name[i] = value[i]; vol->source_rfc1001_name[i] =
value[i];
} }
/* The string has 16th byte zero still from /* The string has 16th byte zero still from
set at top of the function */ set at top of the function */
if ((i==15) && (value[i] != 0)) if ((i == 15) && (value[i] != 0))
printk(KERN_WARNING "CIFS: netbiosname longer than 15 truncated.\n"); printk(KERN_WARNING "CIFS: netbiosname"
" longer than 15 truncated.\n");
} }
} else if (strnicmp(data, "servern", 7) == 0) { } else if (strnicmp(data, "servern", 7) == 0) {
/* servernetbiosname specified override *SMBSERVER */ /* servernetbiosname specified override *SMBSERVER */
...@@ -1114,29 +1125,32 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1114,29 +1125,32 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
cFYI(1, ("empty server netbiosname specified")); cFYI(1, ("empty server netbiosname specified"));
} else { } else {
/* last byte, type, is 0x20 for servr type */ /* last byte, type, is 0x20 for servr type */
memset(vol->target_rfc1001_name,0x20,16); memset(vol->target_rfc1001_name, 0x20, 16);
for(i=0;i<15;i++) { for (i = 0; i < 15; i++) {
/* BB are there cases in which a comma can be /* BB are there cases in which a comma can be
valid in this workstation netbios name (and need valid in this workstation netbios name
special handling)? */ (and need special handling)? */
/* user or mount helper must uppercase netbiosname */ /* user or mount helper must uppercase
if (value[i]==0) the netbiosname */
if (value[i] == 0)
break; break;
else else
vol->target_rfc1001_name[i] = value[i]; vol->target_rfc1001_name[i] =
value[i];
} }
/* The string has 16th byte zero still from /* The string has 16th byte zero still from
set at top of the function */ set at top of the function */
if ((i==15) && (value[i] != 0)) if ((i == 15) && (value[i] != 0))
printk(KERN_WARNING "CIFS: server netbiosname longer than 15 truncated.\n"); printk(KERN_WARNING "CIFS: server net"
"biosname longer than 15 truncated.\n");
} }
} else if (strnicmp(data, "credentials", 4) == 0) { } else if (strnicmp(data, "credentials", 4) == 0) {
/* ignore */ /* ignore */
} else if (strnicmp(data, "version", 3) == 0) { } else if (strnicmp(data, "version", 3) == 0) {
/* ignore */ /* ignore */
} else if (strnicmp(data, "guest",5) == 0) { } else if (strnicmp(data, "guest", 5) == 0) {
/* ignore */ /* ignore */
} else if (strnicmp(data, "rw", 2) == 0) { } else if (strnicmp(data, "rw", 2) == 0) {
vol->rw = TRUE; vol->rw = TRUE;
...@@ -1187,7 +1201,8 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1187,7 +1201,8 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
/* turn off mandatory locking in mode /* turn off mandatory locking in mode
if remote locking is turned off since the if remote locking is turned off since the
local vfs will do advisory */ local vfs will do advisory */
if (vol->file_mode == (S_IALLUGO & ~(S_ISUID | S_IXGRP))) if (vol->file_mode ==
(S_IALLUGO & ~(S_ISUID | S_IXGRP)))
vol->file_mode = S_IALLUGO; vol->file_mode = S_IALLUGO;
} else if (strnicmp(data, "setuids", 7) == 0) { } else if (strnicmp(data, "setuids", 7) == 0) {
vol->setuids = 1; vol->setuids = 1;
...@@ -1201,55 +1216,61 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1201,55 +1216,61 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
vol->intr = 0; vol->intr = 0;
} else if (strnicmp(data, "intr", 4) == 0) { } else if (strnicmp(data, "intr", 4) == 0) {
vol->intr = 1; vol->intr = 1;
} else if (strnicmp(data, "serverino",7) == 0) { } else if (strnicmp(data, "serverino", 7) == 0) {
vol->server_ino = 1; vol->server_ino = 1;
} else if (strnicmp(data, "noserverino",9) == 0) { } else if (strnicmp(data, "noserverino", 9) == 0) {
vol->server_ino = 0; vol->server_ino = 0;
} else if (strnicmp(data, "cifsacl",7) == 0) { } else if (strnicmp(data, "cifsacl", 7) == 0) {
vol->cifs_acl = 1; vol->cifs_acl = 1;
} else if (strnicmp(data, "nocifsacl", 9) == 0) { } else if (strnicmp(data, "nocifsacl", 9) == 0) {
vol->cifs_acl = 0; vol->cifs_acl = 0;
} else if (strnicmp(data, "acl",3) == 0) { } else if (strnicmp(data, "acl", 3) == 0) {
vol->no_psx_acl = 0; vol->no_psx_acl = 0;
} else if (strnicmp(data, "noacl",5) == 0) { } else if (strnicmp(data, "noacl", 5) == 0) {
vol->no_psx_acl = 1; vol->no_psx_acl = 1;
} else if (strnicmp(data, "sign",4) == 0) { } else if (strnicmp(data, "sign", 4) == 0) {
vol->secFlg |= CIFSSEC_MUST_SIGN; vol->secFlg |= CIFSSEC_MUST_SIGN;
/* } else if (strnicmp(data, "seal",4) == 0) { /* } else if (strnicmp(data, "seal",4) == 0) {
vol->secFlg |= CIFSSEC_MUST_SEAL; */ vol->secFlg |= CIFSSEC_MUST_SEAL; */
} else if (strnicmp(data, "direct",6) == 0) { } else if (strnicmp(data, "direct", 6) == 0) {
vol->direct_io = 1; vol->direct_io = 1;
} else if (strnicmp(data, "forcedirectio",13) == 0) { } else if (strnicmp(data, "forcedirectio", 13) == 0) {
vol->direct_io = 1; vol->direct_io = 1;
} else if (strnicmp(data, "in6_addr",8) == 0) { } else if (strnicmp(data, "in6_addr", 8) == 0) {
if (!value || !*value) { if (!value || !*value) {
vol->in6_addr = NULL; vol->in6_addr = NULL;
} else if (strnlen(value, 49) == 48) { } else if (strnlen(value, 49) == 48) {
vol->in6_addr = value; vol->in6_addr = value;
} else { } else {
printk(KERN_WARNING "CIFS: ip v6 address not 48 characters long\n"); printk(KERN_WARNING "CIFS: ip v6 address not "
"48 characters long\n");
return 1; return 1;
} }
} else if (strnicmp(data, "noac", 4) == 0) { } else if (strnicmp(data, "noac", 4) == 0) {
printk(KERN_WARNING "CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n"); printk(KERN_WARNING "CIFS: Mount option noac not "
"supported. Instead set "
"/proc/fs/cifs/LookupCacheEnabled to 0\n");
} else } else
printk(KERN_WARNING "CIFS: Unknown mount option %s\n",data); printk(KERN_WARNING "CIFS: Unknown mount option %s\n",
data);
} }
if (vol->UNC == NULL) { if (vol->UNC == NULL) {
if (devname == NULL) { if (devname == NULL) {
printk(KERN_WARNING "CIFS: Missing UNC name for mount target\n"); printk(KERN_WARNING "CIFS: Missing UNC name for mount "
"target\n");
return 1; return 1;
} }
if ((temp_len = strnlen(devname, 300)) < 300) { if ((temp_len = strnlen(devname, 300)) < 300) {
vol->UNC = kmalloc(temp_len+1,GFP_KERNEL); vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
if (vol->UNC == NULL) if (vol->UNC == NULL)
return 1; return 1;
strcpy(vol->UNC,devname); strcpy(vol->UNC, devname);
if (strncmp(vol->UNC, "//", 2) == 0) { if (strncmp(vol->UNC, "//", 2) == 0) {
vol->UNC[0] = '\\'; vol->UNC[0] = '\\';
vol->UNC[1] = '\\'; vol->UNC[1] = '\\';
} else if (strncmp(vol->UNC, "\\\\", 2) != 0) { } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
printk(KERN_WARNING "CIFS: UNC Path does not begin with // or \\\\ \n"); printk(KERN_WARNING "CIFS: UNC Path does not "
"begin with // or \\\\ \n");
return 1; return 1;
} }
} else { } else {
...@@ -1264,7 +1285,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1264,7 +1285,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
} }
static struct cifsSesInfo * static struct cifsSesInfo *
cifs_find_tcp_session(struct in_addr * target_ip_addr, cifs_find_tcp_session(struct in_addr *target_ip_addr,
struct in6_addr *target_ip6_addr, struct in6_addr *target_ip6_addr,
char *userName, struct TCP_Server_Info **psrvTcp) char *userName, struct TCP_Server_Info **psrvTcp)
{ {
...@@ -1280,15 +1301,21 @@ cifs_find_tcp_session(struct in_addr * target_ip_addr, ...@@ -1280,15 +1301,21 @@ cifs_find_tcp_session(struct in_addr * target_ip_addr,
(ses->server->addr.sockAddr.sin_addr.s_addr (ses->server->addr.sockAddr.sin_addr.s_addr
== target_ip_addr->s_addr)) || (target_ip6_addr == target_ip_addr->s_addr)) || (target_ip6_addr
&& memcmp(&ses->server->addr.sockAddr6.sin6_addr, && memcmp(&ses->server->addr.sockAddr6.sin6_addr,
target_ip6_addr,sizeof(*target_ip6_addr)))){ target_ip6_addr, sizeof(*target_ip6_addr)))) {
/* BB lock server and tcp session and increment use count here?? */ /* BB lock server and tcp session and increment
*psrvTcp = ses->server; /* found a match on the TCP session */ use count here?? */
/* found a match on the TCP session */
*psrvTcp = ses->server;
/* BB check if reconnection needed */ /* BB check if reconnection needed */
if (strncmp if (strncmp
(ses->userName, userName, (ses->userName, userName,
MAX_USERNAME_SIZE) == 0){ MAX_USERNAME_SIZE) == 0){
read_unlock(&GlobalSMBSeslock); read_unlock(&GlobalSMBSeslock);
return ses; /* found exact match on both tcp and SMB sessions */ /* Found exact match on both TCP and
SMB sessions */
return ses;
} }
} }
} }
...@@ -1319,7 +1346,8 @@ find_unc(__be32 new_target_ip_addr, char *uncName, char *userName) ...@@ -1319,7 +1346,8 @@ find_unc(__be32 new_target_ip_addr, char *uncName, char *userName)
/* BB lock tcon, server and tcp session and increment use count here? */ /* BB lock tcon, server and tcp session and increment use count here? */
/* found a match on the TCP session */ /* found a match on the TCP session */
/* BB check if reconnection needed */ /* BB check if reconnection needed */
cFYI(1, ("IP match, old UNC: %s new: %s", cFYI(1,
("IP match, old UNC: %s new: %s",
tcon->treeName, uncName)); tcon->treeName, uncName));
if (strncmp if (strncmp
(tcon->treeName, uncName, (tcon->treeName, uncName,
...@@ -1354,7 +1382,7 @@ connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -1354,7 +1382,7 @@ connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
unsigned int num_referrals; unsigned int num_referrals;
int rc = 0; int rc = 0;
rc = get_dfs_path(xid, pSesInfo,old_path, nls_codepage, rc = get_dfs_path(xid, pSesInfo, old_path, nls_codepage,
&num_referrals, &referrals, remap); &num_referrals, &referrals, remap);
/* BB Add in code to: if valid refrl, if not ip address contact /* BB Add in code to: if valid refrl, if not ip address contact
...@@ -1367,10 +1395,9 @@ connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -1367,10 +1395,9 @@ connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
} }
int int
get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
const char *old_path, const struct nls_table *nls_codepage, const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
unsigned int *pnum_referrals, unsigned char **preferrals, int remap)
unsigned char ** preferrals, int remap)
{ {
char *temp_unc; char *temp_unc;
int rc = 0; int rc = 0;
...@@ -1379,7 +1406,8 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -1379,7 +1406,8 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
if (pSesInfo->ipc_tid == 0) { if (pSesInfo->ipc_tid == 0) {
temp_unc = kmalloc(2 /* for slashes */ + temp_unc = kmalloc(2 /* for slashes */ +
strnlen(pSesInfo->serverName,SERVER_NAME_LEN_WITH_NULL * 2) strnlen(pSesInfo->serverName,
SERVER_NAME_LEN_WITH_NULL * 2)
+ 1 + 4 /* slash IPC$ */ + 2, + 1 + 4 /* slash IPC$ */ + 2,
GFP_KERNEL); GFP_KERNEL);
if (temp_unc == NULL) if (temp_unc == NULL)
...@@ -1390,7 +1418,7 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -1390,7 +1418,7 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$"); strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$");
rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage); rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage);
cFYI(1, cFYI(1,
("CIFS Tcon rc = %d ipc_tid = %d", rc,pSesInfo->ipc_tid)); ("CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid));
kfree(temp_unc); kfree(temp_unc);
} }
if (rc == 0) if (rc == 0)
...@@ -1401,15 +1429,15 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -1401,15 +1429,15 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
} }
/* See RFC1001 section 14 on representation of Netbios names */ /* See RFC1001 section 14 on representation of Netbios names */
static void rfc1002mangle(char * target,char * source, unsigned int length) static void rfc1002mangle(char *target, char *source, unsigned int length)
{ {
unsigned int i,j; unsigned int i, j;
for(i=0,j=0;i<(length);i++) { for (i = 0, j = 0; i < (length); i++) {
/* mask a nibble at a time and encode */ /* mask a nibble at a time and encode */
target[j] = 'A' + (0x0F & (source[i] >> 4)); target[j] = 'A' + (0x0F & (source[i] >> 4));
target[j+1] = 'A' + (0x0F & source[i]); target[j+1] = 'A' + (0x0F & source[i]);
j+=2; j += 2;
} }
} }
...@@ -1417,16 +1445,17 @@ static void rfc1002mangle(char * target,char * source, unsigned int length) ...@@ -1417,16 +1445,17 @@ static void rfc1002mangle(char * target,char * source, unsigned int length)
static int static int
ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
char * netbios_name, char * target_name) char *netbios_name, char *target_name)
{ {
int rc = 0; int rc = 0;
int connected = 0; int connected = 0;
__be16 orig_port = 0; __be16 orig_port = 0;
if (*csocket == NULL) { if (*csocket == NULL) {
rc = sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, csocket); rc = sock_create_kern(PF_INET, SOCK_STREAM,
IPPROTO_TCP, csocket);
if (rc < 0) { if (rc < 0) {
cERROR(1, ("Error %d creating socket",rc)); cERROR(1, ("Error %d creating socket", rc));
*csocket = NULL; *csocket = NULL;
return rc; return rc;
} else { } else {
...@@ -1440,7 +1469,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1440,7 +1469,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
if (psin_server->sin_port) { /* user overrode default port */ if (psin_server->sin_port) { /* user overrode default port */
rc = (*csocket)->ops->connect(*csocket, rc = (*csocket)->ops->connect(*csocket,
(struct sockaddr *) psin_server, (struct sockaddr *) psin_server,
sizeof (struct sockaddr_in),0); sizeof (struct sockaddr_in), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
} }
...@@ -1456,7 +1485,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1456,7 +1485,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
rc = (*csocket)->ops->connect(*csocket, rc = (*csocket)->ops->connect(*csocket,
(struct sockaddr *) psin_server, (struct sockaddr *) psin_server,
sizeof (struct sockaddr_in),0); sizeof (struct sockaddr_in), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
} }
...@@ -1464,7 +1493,8 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1464,7 +1493,8 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
if (!connected) { if (!connected) {
psin_server->sin_port = htons(RFC1001_PORT); psin_server->sin_port = htons(RFC1001_PORT);
rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *) rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *)
psin_server, sizeof (struct sockaddr_in),0); psin_server,
sizeof (struct sockaddr_in), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
} }
...@@ -1474,7 +1504,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1474,7 +1504,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
if (!connected) { if (!connected) {
if (orig_port) if (orig_port)
psin_server->sin_port = orig_port; psin_server->sin_port = orig_port;
cFYI(1, ("Error %d connecting to server via ipv4",rc)); cFYI(1, ("Error %d connecting to server via ipv4", rc));
sock_release(*csocket); sock_release(*csocket);
*csocket = NULL; *csocket = NULL;
return rc; return rc;
...@@ -1482,7 +1512,8 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1482,7 +1512,8 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
/* Eventually check for other socket options to change from /* Eventually check for other socket options to change from
the default. sock_setsockopt not used because it expects the default. sock_setsockopt not used because it expects
user space buffer */ user space buffer */
cFYI(1, ("sndbuf %d rcvbuf %d rcvtimeo 0x%lx",(*csocket)->sk->sk_sndbuf, cFYI(1, ("sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
(*csocket)->sk->sk_sndbuf,
(*csocket)->sk->sk_rcvbuf, (*csocket)->sk->sk_rcvtimeo)); (*csocket)->sk->sk_rcvbuf, (*csocket)->sk->sk_rcvtimeo));
(*csocket)->sk->sk_rcvtimeo = 7 * HZ; (*csocket)->sk->sk_rcvtimeo = 7 * HZ;
/* make the bufsizes depend on wsize/rsize and max requests */ /* make the bufsizes depend on wsize/rsize and max requests */
...@@ -1496,9 +1527,10 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1496,9 +1527,10 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
/* some servers require RFC1001 sessinit before sending /* some servers require RFC1001 sessinit before sending
negprot - BB check reconnection in case where second negprot - BB check reconnection in case where second
sessinit is sent but no second negprot */ sessinit is sent but no second negprot */
struct rfc1002_session_packet * ses_init_buf; struct rfc1002_session_packet *ses_init_buf;
struct smb_hdr * smb_buf; struct smb_hdr *smb_buf;
ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet), GFP_KERNEL); ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
GFP_KERNEL);
if (ses_init_buf) { if (ses_init_buf) {
ses_init_buf->trailer.session_req.called_len = 32; ses_init_buf->trailer.session_req.called_len = 32;
if (target_name && (target_name[0] != 0)) { if (target_name && (target_name[0] != 0)) {
...@@ -1506,18 +1538,18 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1506,18 +1538,18 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
target_name, 16); target_name, 16);
} else { } else {
rfc1002mangle(ses_init_buf->trailer.session_req.called_name, rfc1002mangle(ses_init_buf->trailer.session_req.called_name,
DEFAULT_CIFS_CALLED_NAME,16); DEFAULT_CIFS_CALLED_NAME, 16);
} }
ses_init_buf->trailer.session_req.calling_len = 32; ses_init_buf->trailer.session_req.calling_len = 32;
/* calling name ends in null (byte 16) from old smb /* calling name ends in null (byte 16) from old smb
convention. */ convention. */
if (netbios_name && (netbios_name[0] !=0)) { if (netbios_name && (netbios_name[0] != 0)) {
rfc1002mangle(ses_init_buf->trailer.session_req.calling_name, rfc1002mangle(ses_init_buf->trailer.session_req.calling_name,
netbios_name,16); netbios_name, 16);
} else { } else {
rfc1002mangle(ses_init_buf->trailer.session_req.calling_name, rfc1002mangle(ses_init_buf->trailer.session_req.calling_name,
"LINUX_CIFS_CLNT",16); "LINUX_CIFS_CLNT", 16);
} }
ses_init_buf->trailer.session_req.scope1 = 0; ses_init_buf->trailer.session_req.scope1 = 0;
ses_init_buf->trailer.session_req.scope2 = 0; ses_init_buf->trailer.session_req.scope2 = 0;
...@@ -1552,9 +1584,10 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket) ...@@ -1552,9 +1584,10 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
__be16 orig_port = 0; __be16 orig_port = 0;
if (*csocket == NULL) { if (*csocket == NULL) {
rc = sock_create_kern(PF_INET6, SOCK_STREAM, IPPROTO_TCP, csocket); rc = sock_create_kern(PF_INET6, SOCK_STREAM,
IPPROTO_TCP, csocket);
if (rc < 0) { if (rc < 0) {
cERROR(1, ("Error %d creating ipv6 socket",rc)); cERROR(1, ("Error %d creating ipv6 socket", rc));
*csocket = NULL; *csocket = NULL;
return rc; return rc;
} else { } else {
...@@ -1569,7 +1602,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket) ...@@ -1569,7 +1602,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
if (psin_server->sin6_port) { /* user overrode default port */ if (psin_server->sin6_port) { /* user overrode default port */
rc = (*csocket)->ops->connect(*csocket, rc = (*csocket)->ops->connect(*csocket,
(struct sockaddr *) psin_server, (struct sockaddr *) psin_server,
sizeof (struct sockaddr_in6),0); sizeof (struct sockaddr_in6), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
} }
...@@ -1585,7 +1618,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket) ...@@ -1585,7 +1618,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
rc = (*csocket)->ops->connect(*csocket, rc = (*csocket)->ops->connect(*csocket,
(struct sockaddr *) psin_server, (struct sockaddr *) psin_server,
sizeof (struct sockaddr_in6),0); sizeof (struct sockaddr_in6), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
} }
...@@ -1593,7 +1626,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket) ...@@ -1593,7 +1626,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
if (!connected) { if (!connected) {
psin_server->sin6_port = htons(RFC1001_PORT); psin_server->sin6_port = htons(RFC1001_PORT);
rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *) rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *)
psin_server, sizeof (struct sockaddr_in6),0); psin_server, sizeof (struct sockaddr_in6), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
} }
...@@ -1603,7 +1636,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket) ...@@ -1603,7 +1636,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
if (!connected) { if (!connected) {
if (orig_port) if (orig_port)
psin_server->sin6_port = orig_port; psin_server->sin6_port = orig_port;
cFYI(1, ("Error %d connecting to server via ipv6",rc)); cFYI(1, ("Error %d connecting to server via ipv6", rc));
sock_release(*csocket); sock_release(*csocket);
*csocket = NULL; *csocket = NULL;
return rc; return rc;
...@@ -1616,8 +1649,8 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket) ...@@ -1616,8 +1649,8 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
return rc; return rc;
} }
void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon, void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
struct super_block * sb, struct smb_vol * vol_info) struct super_block *sb, struct smb_vol *vol_info)
{ {
/* if we are reconnecting then should we check to see if /* if we are reconnecting then should we check to see if
* any requested capabilities changed locally e.g. via * any requested capabilities changed locally e.g. via
...@@ -1683,7 +1716,7 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon, ...@@ -1683,7 +1716,7 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon,
} }
cFYI(1, ("Negotiate caps 0x%x",(int)cap)); cFYI(1, ("Negotiate caps 0x%x", (int)cap));
#ifdef CONFIG_CIFS_DEBUG2 #ifdef CONFIG_CIFS_DEBUG2
if (cap & CIFS_UNIX_FCNTL_CAP) if (cap & CIFS_UNIX_FCNTL_CAP)
cFYI(1, ("FCNTL cap")); cFYI(1, ("FCNTL cap"));
...@@ -1726,7 +1759,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1726,7 +1759,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
/* cFYI(1, ("Entering cifs_mount. Xid: %d with: %s", xid, mount_data)); */ /* cFYI(1, ("Entering cifs_mount. Xid: %d with: %s", xid, mount_data)); */
memset(&volume_info,0,sizeof(struct smb_vol)); memset(&volume_info, 0, sizeof(struct smb_vol));
if (cifs_parse_mount_options(mount_data, devname, &volume_info)) { if (cifs_parse_mount_options(mount_data, devname, &volume_info)) {
kfree(volume_info.UNC); kfree(volume_info.UNC);
kfree(volume_info.password); kfree(volume_info.password);
...@@ -1753,11 +1786,13 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1753,11 +1786,13 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
} }
if (volume_info.UNCip && volume_info.UNC) { if (volume_info.UNCip && volume_info.UNC) {
rc = cifs_inet_pton(AF_INET, volume_info.UNCip,&sin_server.sin_addr.s_addr); rc = cifs_inet_pton(AF_INET, volume_info.UNCip,
&sin_server.sin_addr.s_addr);
if (rc <= 0) { if (rc <= 0) {
/* not ipv4 address, try ipv6 */ /* not ipv4 address, try ipv6 */
rc = cifs_inet_pton(AF_INET6,volume_info.UNCip,&sin_server6.sin6_addr.in6_u); rc = cifs_inet_pton(AF_INET6, volume_info.UNCip,
&sin_server6.sin6_addr.in6_u);
if (rc > 0) if (rc > 0)
address_type = AF_INET6; address_type = AF_INET6;
} else { } else {
...@@ -1776,9 +1811,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1776,9 +1811,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
cFYI(1, ("UNC: %s ip: %s", volume_info.UNC, volume_info.UNCip)); cFYI(1, ("UNC: %s ip: %s", volume_info.UNC, volume_info.UNCip));
/* success */ /* success */
rc = 0; rc = 0;
} else if (volume_info.UNCip){ } else if (volume_info.UNCip) {
/* BB using ip addr as server name connect to the DFS root below */ /* BB using ip addr as server name to connect to the
cERROR(1,("Connecting to DFS root not implemented yet")); DFS root below */
cERROR(1, ("Connecting to DFS root not implemented yet"));
kfree(volume_info.UNC); kfree(volume_info.UNC);
kfree(volume_info.password); kfree(volume_info.password);
kfree(volume_info.prepath); kfree(volume_info.prepath);
...@@ -1786,7 +1822,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1786,7 +1822,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
return -EINVAL; return -EINVAL;
} else /* which servers DFS root would we conect to */ { } else /* which servers DFS root would we conect to */ {
cERROR(1, cERROR(1,
("CIFS mount error: No UNC path (e.g. -o unc=//192.168.1.100/public) specified")); ("CIFS mount error: No UNC path (e.g. -o "
"unc=//192.168.1.100/public) specified"));
kfree(volume_info.UNC); kfree(volume_info.UNC);
kfree(volume_info.password); kfree(volume_info.password);
kfree(volume_info.prepath); kfree(volume_info.prepath);
...@@ -1801,7 +1838,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1801,7 +1838,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
} else { } else {
cifs_sb->local_nls = load_nls(volume_info.iocharset); cifs_sb->local_nls = load_nls(volume_info.iocharset);
if (cifs_sb->local_nls == NULL) { if (cifs_sb->local_nls == NULL) {
cERROR(1,("CIFS mount error: iocharset %s not found",volume_info.iocharset)); cERROR(1, ("CIFS mount error: iocharset %s not found",
volume_info.iocharset));
kfree(volume_info.UNC); kfree(volume_info.UNC);
kfree(volume_info.password); kfree(volume_info.password);
kfree(volume_info.prepath); kfree(volume_info.prepath);
...@@ -1827,7 +1865,6 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1827,7 +1865,6 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
return -EINVAL; return -EINVAL;
} }
if (srvTcp) { if (srvTcp) {
cFYI(1, ("Existing tcp session with server found")); cFYI(1, ("Existing tcp session with server found"));
} else { /* create socket */ } else { /* create socket */
...@@ -1839,14 +1876,14 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1839,14 +1876,14 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
cFYI(1, ("attempting ipv6 connect")); cFYI(1, ("attempting ipv6 connect"));
/* BB should we allow ipv6 on port 139? */ /* BB should we allow ipv6 on port 139? */
/* other OS never observed in Wild doing 139 with v6 */ /* other OS never observed in Wild doing 139 with v6 */
rc = ipv6_connect(&sin_server6,&csocket); rc = ipv6_connect(&sin_server6, &csocket);
} else } else
rc = ipv4_connect(&sin_server,&csocket, rc = ipv4_connect(&sin_server, &csocket,
volume_info.source_rfc1001_name, volume_info.source_rfc1001_name,
volume_info.target_rfc1001_name); volume_info.target_rfc1001_name);
if (rc < 0) { if (rc < 0) {
cERROR(1, cERROR(1, ("Error connecting to IPv4 socket. "
("Error connecting to IPv4 socket. Aborting operation")); "Aborting operation"));
if (csocket != NULL) if (csocket != NULL)
sock_release(csocket); sock_release(csocket);
kfree(volume_info.UNC); kfree(volume_info.UNC);
...@@ -1867,8 +1904,9 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1867,8 +1904,9 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
return rc; return rc;
} else { } else {
memset(srvTcp, 0, sizeof (struct TCP_Server_Info)); memset(srvTcp, 0, sizeof (struct TCP_Server_Info));
memcpy(&srvTcp->addr.sockAddr, &sin_server, sizeof (struct sockaddr_in)); memcpy(&srvTcp->addr.sockAddr, &sin_server,
atomic_set(&srvTcp->inFlight,0); sizeof (struct sockaddr_in));
atomic_set(&srvTcp->inFlight, 0);
/* BB Add code for ipv6 case too */ /* BB Add code for ipv6 case too */
srvTcp->ssocket = csocket; srvTcp->ssocket = csocket;
srvTcp->protocolType = IPV4; srvTcp->protocolType = IPV4;
...@@ -1883,7 +1921,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1883,7 +1921,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
srvTcp->tsk = kthread_run((void *)(void *)cifs_demultiplex_thread, srvTcp, "cifsd"); srvTcp->tsk = kthread_run((void *)(void *)cifs_demultiplex_thread, srvTcp, "cifsd");
if ( IS_ERR(srvTcp->tsk) ) { if ( IS_ERR(srvTcp->tsk) ) {
rc = PTR_ERR(srvTcp->tsk); rc = PTR_ERR(srvTcp->tsk);
cERROR(1,("error %d create cifsd thread", rc)); cERROR(1, ("error %d create cifsd thread", rc));
srvTcp->tsk = NULL; srvTcp->tsk = NULL;
sock_release(csocket); sock_release(csocket);
kfree(volume_info.UNC); kfree(volume_info.UNC);
...@@ -1894,8 +1932,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1894,8 +1932,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
} }
wait_for_completion(&cifsd_complete); wait_for_completion(&cifsd_complete);
rc = 0; rc = 0;
memcpy(srvTcp->workstation_RFC1001_name, volume_info.source_rfc1001_name,16); memcpy(srvTcp->workstation_RFC1001_name,
memcpy(srvTcp->server_RFC1001_name, volume_info.target_rfc1001_name,16); volume_info.source_rfc1001_name, 16);
memcpy(srvTcp->server_RFC1001_name,
volume_info.target_rfc1001_name, 16);
srvTcp->sequence_number = 0; srvTcp->sequence_number = 0;
} }
} }
...@@ -1916,13 +1956,14 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1916,13 +1956,14 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
NIPQUAD(sin_server.sin_addr.s_addr)); NIPQUAD(sin_server.sin_addr.s_addr));
} }
if (!rc){ if (!rc) {
/* volume_info.password freed at unmount */ /* volume_info.password freed at unmount */
if (volume_info.password) if (volume_info.password)
pSesInfo->password = volume_info.password; pSesInfo->password = volume_info.password;
if (volume_info.username) if (volume_info.username)
strncpy(pSesInfo->userName, strncpy(pSesInfo->userName,
volume_info.username,MAX_USERNAME_SIZE); volume_info.username,
MAX_USERNAME_SIZE);
if (volume_info.domainname) { if (volume_info.domainname) {
int len = strlen(volume_info.domainname); int len = strlen(volume_info.domainname);
pSesInfo->domainName = pSesInfo->domainName =
...@@ -1935,7 +1976,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1935,7 +1976,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
pSesInfo->overrideSecFlg = volume_info.secFlg; pSesInfo->overrideSecFlg = volume_info.secFlg;
down(&pSesInfo->sesSem); down(&pSesInfo->sesSem);
/* BB FIXME need to pass vol->secFlgs BB */ /* BB FIXME need to pass vol->secFlgs BB */
rc = cifs_setup_session(xid,pSesInfo, cifs_sb->local_nls); rc = cifs_setup_session(xid, pSesInfo,
cifs_sb->local_nls);
up(&pSesInfo->sesSem); up(&pSesInfo->sesSem);
if (!rc) if (!rc)
atomic_inc(&srvTcp->socketUseCount); atomic_inc(&srvTcp->socketUseCount);
...@@ -1946,7 +1988,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1946,7 +1988,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
/* search for existing tcon to this server share */ /* search for existing tcon to this server share */
if (!rc) { if (!rc) {
if (volume_info.rsize > CIFSMaxBufSize) { if (volume_info.rsize > CIFSMaxBufSize) {
cERROR(1,("rsize %d too large, using MaxBufSize", cERROR(1, ("rsize %d too large, using MaxBufSize",
volume_info.rsize)); volume_info.rsize));
cifs_sb->rsize = CIFSMaxBufSize; cifs_sb->rsize = CIFSMaxBufSize;
} else if ((volume_info.rsize) && } else if ((volume_info.rsize) &&
...@@ -1956,7 +1998,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1956,7 +1998,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
cifs_sb->rsize = CIFSMaxBufSize; cifs_sb->rsize = CIFSMaxBufSize;
if (volume_info.wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) { if (volume_info.wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) {
cERROR(1,("wsize %d too large, using 4096 instead", cERROR(1, ("wsize %d too large, using 4096 instead",
volume_info.wsize)); volume_info.wsize));
cifs_sb->wsize = 4096; cifs_sb->wsize = 4096;
} else if (volume_info.wsize) } else if (volume_info.wsize)
...@@ -2089,7 +2131,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -2089,7 +2131,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
always wake up processes blocked in always wake up processes blocked in
tcp in recv_mesg then we could remove the tcp in recv_mesg then we could remove the
send_sig call */ send_sig call */
force_sig(SIGKILL,srvTcp->tsk); force_sig(SIGKILL, srvTcp->tsk);
tsk = srvTcp->tsk; tsk = srvTcp->tsk;
if (tsk) if (tsk)
kthread_stop(tsk); kthread_stop(tsk);
...@@ -2200,7 +2242,8 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2200,7 +2242,8 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
pSMB->req_no_secext.MaxBufferSize = cpu_to_le16(ses->server->maxBuf); pSMB->req_no_secext.MaxBufferSize = cpu_to_le16(ses->server->maxBuf);
pSMB->req_no_secext.MaxMpxCount = cpu_to_le16(ses->server->maxReq); pSMB->req_no_secext.MaxMpxCount = cpu_to_le16(ses->server->maxReq);
if (ses->server->secMode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) if (ses->server->secMode &
(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE; smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS | capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS |
...@@ -2304,8 +2347,9 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2304,8 +2347,9 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
__u16 action = le16_to_cpu(pSMBr->resp.Action); __u16 action = le16_to_cpu(pSMBr->resp.Action);
__u16 blob_len = le16_to_cpu(pSMBr->resp.SecurityBlobLength); __u16 blob_len = le16_to_cpu(pSMBr->resp.SecurityBlobLength);
if (action & GUEST_LOGIN) if (action & GUEST_LOGIN)
cFYI(1, (" Guest login")); /* do we want to mark SesInfo struct ? */ cFYI(1, (" Guest login")); /* BB mark SesInfo struct? */
ses->Suid = smb_buffer_response->Uid; /* UID left in wire format (le) */ ses->Suid = smb_buffer_response->Uid; /* UID left in wire format
(little endian) */
cFYI(1, ("UID = %d ", ses->Suid)); cFYI(1, ("UID = %d ", ses->Suid));
/* response can have either 3 or 4 word count - Samba sends 3 */ /* response can have either 3 or 4 word count - Samba sends 3 */
bcc_ptr = pByteArea(smb_buffer_response); bcc_ptr = pByteArea(smb_buffer_response);
...@@ -2318,8 +2362,10 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2318,8 +2362,10 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
if (smb_buffer->Flags2 & SMBFLG2_UNICODE) { if (smb_buffer->Flags2 & SMBFLG2_UNICODE) {
if ((long) (bcc_ptr) % 2) { if ((long) (bcc_ptr) % 2) {
remaining_words = remaining_words =
(BCC(smb_buffer_response) - 1) /2; (BCC(smb_buffer_response) - 1) / 2;
bcc_ptr++; /* Unicode strings must be word aligned */ /* Unicode strings must be word
aligned */
bcc_ptr++;
} else { } else {
remaining_words = remaining_words =
BCC(smb_buffer_response) / 2; BCC(smb_buffer_response) / 2;
...@@ -2332,11 +2378,13 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2332,11 +2378,13 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
terminating last Unicode string in response */ terminating last Unicode string in response */
if (ses->serverOS) if (ses->serverOS)
kfree(ses->serverOS); kfree(ses->serverOS);
ses->serverOS = kzalloc(2 * (len + 1), GFP_KERNEL); ses->serverOS = kzalloc(2 * (len + 1),
GFP_KERNEL);
if (ses->serverOS == NULL) if (ses->serverOS == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
cifs_strfromUCS_le(ses->serverOS, cifs_strfromUCS_le(ses->serverOS,
(__le16 *)bcc_ptr, len,nls_codepage); (__le16 *)bcc_ptr,
len, nls_codepage);
bcc_ptr += 2 * (len + 1); bcc_ptr += 2 * (len + 1);
remaining_words -= len + 1; remaining_words -= len + 1;
ses->serverOS[2 * len] = 0; ses->serverOS[2 * len] = 0;
...@@ -2345,42 +2393,49 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2345,42 +2393,49 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
len = UniStrnlen((wchar_t *)bcc_ptr, len = UniStrnlen((wchar_t *)bcc_ptr,
remaining_words-1); remaining_words-1);
kfree(ses->serverNOS); kfree(ses->serverNOS);
ses->serverNOS = kzalloc(2 * (len + 1),GFP_KERNEL); ses->serverNOS = kzalloc(2 * (len + 1),
GFP_KERNEL);
if (ses->serverNOS == NULL) if (ses->serverNOS == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
cifs_strfromUCS_le(ses->serverNOS, cifs_strfromUCS_le(ses->serverNOS,
(__le16 *)bcc_ptr,len,nls_codepage); (__le16 *)bcc_ptr,
len, nls_codepage);
bcc_ptr += 2 * (len + 1); bcc_ptr += 2 * (len + 1);
ses->serverNOS[2 * len] = 0; ses->serverNOS[2 * len] = 0;
ses->serverNOS[1 + (2 * len)] = 0; ses->serverNOS[1 + (2 * len)] = 0;
if (strncmp(ses->serverNOS, if (strncmp(ses->serverNOS,
"NT LAN Manager 4",16) == 0) { "NT LAN Manager 4", 16) == 0) {
cFYI(1, ("NT4 server")); cFYI(1, ("NT4 server"));
ses->flags |= CIFS_SES_NT4; ses->flags |= CIFS_SES_NT4;
} }
remaining_words -= len + 1; remaining_words -= len + 1;
if (remaining_words > 0) { if (remaining_words > 0) {
len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words); len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words);
/* last string is not always null terminated (for e.g. for Windows XP & 2000) */ /* last string is not always null terminated
(for e.g. for Windows XP & 2000) */
if (ses->serverDomain) if (ses->serverDomain)
kfree(ses->serverDomain); kfree(ses->serverDomain);
ses->serverDomain = ses->serverDomain =
kzalloc(2*(len+1),GFP_KERNEL); kzalloc(2*(len+1),
GFP_KERNEL);
if (ses->serverDomain == NULL) if (ses->serverDomain == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
cifs_strfromUCS_le(ses->serverDomain, cifs_strfromUCS_le(ses->serverDomain,
(__le16 *)bcc_ptr,len,nls_codepage); (__le16 *)bcc_ptr,
len, nls_codepage);
bcc_ptr += 2 * (len + 1); bcc_ptr += 2 * (len + 1);
ses->serverDomain[2*len] = 0; ses->serverDomain[2*len] = 0;
ses->serverDomain[1+(2*len)] = 0; ses->serverDomain[1+(2*len)] = 0;
} /* else no more room so create dummy domain string */ } else { /* else no more room so create
else { dummy domain string */
if (ses->serverDomain) if (ses->serverDomain)
kfree(ses->serverDomain); kfree(ses->serverDomain);
ses->serverDomain = ses->serverDomain =
kzalloc(2, GFP_KERNEL); kzalloc(2, GFP_KERNEL);
} }
} else { /* no room so create dummy domain and NOS string */ } else { /* no room so create dummy domain
and NOS string */
/* if these kcallocs fail not much we /* if these kcallocs fail not much we
can do, but better to not fail the can do, but better to not fail the
sesssetup itself */ sesssetup itself */
...@@ -2397,18 +2452,21 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2397,18 +2452,21 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
pByteArea(smb_buffer_response) pByteArea(smb_buffer_response)
<= BCC(smb_buffer_response)) { <= BCC(smb_buffer_response)) {
kfree(ses->serverOS); kfree(ses->serverOS);
ses->serverOS = kzalloc(len + 1,GFP_KERNEL); ses->serverOS = kzalloc(len + 1,
GFP_KERNEL);
if (ses->serverOS == NULL) if (ses->serverOS == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
strncpy(ses->serverOS,bcc_ptr, len); strncpy(ses->serverOS, bcc_ptr, len);
bcc_ptr += len; bcc_ptr += len;
bcc_ptr[0] = 0; /* null terminate the string */ /* null terminate the string */
bcc_ptr[0] = 0;
bcc_ptr++; bcc_ptr++;
len = strnlen(bcc_ptr, 1024); len = strnlen(bcc_ptr, 1024);
kfree(ses->serverNOS); kfree(ses->serverNOS);
ses->serverNOS = kzalloc(len + 1,GFP_KERNEL); ses->serverNOS = kzalloc(len + 1,
GFP_KERNEL);
if (ses->serverNOS == NULL) if (ses->serverNOS == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
strncpy(ses->serverNOS, bcc_ptr, len); strncpy(ses->serverNOS, bcc_ptr, len);
...@@ -2419,21 +2477,25 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2419,21 +2477,25 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
len = strnlen(bcc_ptr, 1024); len = strnlen(bcc_ptr, 1024);
if (ses->serverDomain) if (ses->serverDomain)
kfree(ses->serverDomain); kfree(ses->serverDomain);
ses->serverDomain = kzalloc(len + 1,GFP_KERNEL); ses->serverDomain = kzalloc(len + 1,
GFP_KERNEL);
if (ses->serverDomain == NULL) if (ses->serverDomain == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
strncpy(ses->serverDomain, bcc_ptr, len); strncpy(ses->serverDomain, bcc_ptr,
len);
bcc_ptr += len; bcc_ptr += len;
bcc_ptr[0] = 0; bcc_ptr[0] = 0;
bcc_ptr++; bcc_ptr++;
} else } else
cFYI(1, cFYI(1,
("Variable field of length %d extends beyond end of smb ", ("Variable field of length %d "
"extends beyond end of smb ",
len)); len));
} }
} else { } else {
cERROR(1, cERROR(1,
(" Security Blob Length extends beyond end of SMB")); (" Security Blob Length extends beyond "
"end of SMB"));
} }
} else { } else {
cERROR(1, cERROR(1,
...@@ -2452,7 +2514,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2452,7 +2514,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
static int static int
CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
struct cifsSesInfo *ses, int * pNTLMv2_flag, struct cifsSesInfo *ses, int *pNTLMv2_flag,
const struct nls_table *nls_codepage) const struct nls_table *nls_codepage)
{ {
struct smb_hdr *smb_buffer; struct smb_hdr *smb_buffer;
...@@ -2645,7 +2707,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, ...@@ -2645,7 +2707,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
remaining_words = remaining_words =
(BCC(smb_buffer_response) (BCC(smb_buffer_response)
- 1) / 2; - 1) / 2;
bcc_ptr++; /* Unicode strings must be word aligned */ /* Must word align unicode strings */
bcc_ptr++;
} else { } else {
remaining_words = remaining_words =
BCC BCC
...@@ -2691,7 +2754,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, ...@@ -2691,7 +2754,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
remaining_words -= len + 1; remaining_words -= len + 1;
if (remaining_words > 0) { if (remaining_words > 0) {
len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words); len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words);
/* last string is not always null terminated (for e.g. for Windows XP & 2000) */ /* last string not always null terminated
(for e.g. for Windows XP & 2000) */
kfree(ses->serverDomain); kfree(ses->serverDomain);
ses->serverDomain = ses->serverDomain =
kzalloc(2 * kzalloc(2 *
...@@ -2756,7 +2820,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, ...@@ -2756,7 +2820,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
ses->serverDomain = ses->serverDomain =
kzalloc(len + 1, kzalloc(len + 1,
GFP_KERNEL); GFP_KERNEL);
strncpy(ses->serverDomain, bcc_ptr, len); strncpy(ses->serverDomain,
bcc_ptr, len);
bcc_ptr += len; bcc_ptr += len;
bcc_ptr[0] = 0; bcc_ptr[0] = 0;
bcc_ptr++; bcc_ptr++;
...@@ -2766,8 +2831,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, ...@@ -2766,8 +2831,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
len)); len));
} }
} else { } else {
cERROR(1, cERROR(1, ("Security Blob Length extends beyond"
(" Security Blob Length extends beyond end of SMB")); " end of SMB"));
} }
} else { } else {
cERROR(1, ("No session structure passed in.")); cERROR(1, ("No session structure passed in."));
...@@ -3017,15 +3082,18 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3017,15 +3082,18 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
__u16 blob_len = __u16 blob_len =
le16_to_cpu(pSMBr->resp.SecurityBlobLength); le16_to_cpu(pSMBr->resp.SecurityBlobLength);
if (action & GUEST_LOGIN) if (action & GUEST_LOGIN)
cFYI(1, (" Guest login")); /* BB do we want to set anything in SesInfo struct ? */ cFYI(1, (" Guest login")); /* BB Should we set anything
/* if (SecurityBlob2->MessageType != NtLm??){ in SesInfo struct ? */
cFYI("Unexpected message type on auth response is %d ")); /* if (SecurityBlob2->MessageType != NtLm??) {
cFYI("Unexpected message type on auth response is %d"));
} */ } */
if (ses) { if (ses) {
cFYI(1, cFYI(1,
("Does UID on challenge %d match auth response UID %d ", ("Check challenge UID %d vs auth response UID %d",
ses->Suid, smb_buffer_response->Uid)); ses->Suid, smb_buffer_response->Uid));
ses->Suid = smb_buffer_response->Uid; /* UID left in wire format */ /* UID left in wire format */
ses->Suid = smb_buffer_response->Uid;
bcc_ptr = pByteArea(smb_buffer_response); bcc_ptr = pByteArea(smb_buffer_response);
/* response can have either 3 or 4 word count - Samba sends 3 */ /* response can have either 3 or 4 word count - Samba sends 3 */
if ((pSMBr->resp.hdr.WordCount == 3) if ((pSMBr->resp.hdr.WordCount == 3)
...@@ -3146,7 +3214,8 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3146,7 +3214,8 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
len = strnlen(bcc_ptr, 1024); len = strnlen(bcc_ptr, 1024);
kfree(ses->serverNOS); kfree(ses->serverNOS);
ses->serverNOS = kzalloc(len+1,GFP_KERNEL); ses->serverNOS = kzalloc(len+1,
GFP_KERNEL);
strncpy(ses->serverNOS, bcc_ptr, len); strncpy(ses->serverNOS, bcc_ptr, len);
bcc_ptr += len; bcc_ptr += len;
bcc_ptr[0] = 0; bcc_ptr[0] = 0;
...@@ -3307,7 +3376,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3307,7 +3376,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
bcc_ptr[1] = 0; bcc_ptr[1] = 0;
bcc_ptr += 2; bcc_ptr += 2;
} }
/* else do not bother copying these informational fields */ /* else do not bother copying these information fields*/
} else { } else {
length = strnlen(bcc_ptr, 1024); length = strnlen(bcc_ptr, 1024);
if ((bcc_ptr + length) - if ((bcc_ptr + length) -
...@@ -3319,7 +3388,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3319,7 +3388,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
strncpy(tcon->nativeFileSystem, bcc_ptr, strncpy(tcon->nativeFileSystem, bcc_ptr,
length); length);
} }
/* else do not bother copying these informational fields */ /* else do not bother copying these information fields*/
} }
if ((smb_buffer_response->WordCount == 3) || if ((smb_buffer_response->WordCount == 3) ||
(smb_buffer_response->WordCount == 7)) (smb_buffer_response->WordCount == 7))
...@@ -3345,7 +3414,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb) ...@@ -3345,7 +3414,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
int xid; int xid;
struct cifsSesInfo *ses = NULL; struct cifsSesInfo *ses = NULL;
struct task_struct *cifsd_task; struct task_struct *cifsd_task;
char * tmp; char *tmp;
xid = GetXid(); xid = GetXid();
...@@ -3368,7 +3437,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb) ...@@ -3368,7 +3437,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
} else if (rc == -ESHUTDOWN) { } else if (rc == -ESHUTDOWN) {
cFYI(1, ("Waking up socket by sending signal")); cFYI(1, ("Waking up socket by sending signal"));
if (cifsd_task) { if (cifsd_task) {
force_sig(SIGKILL,cifsd_task); force_sig(SIGKILL, cifsd_task);
kthread_stop(cifsd_task); kthread_stop(cifsd_task);
} }
rc = 0; rc = 0;
...@@ -3393,7 +3462,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb) ...@@ -3393,7 +3462,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
} }
int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
struct nls_table * nls_info) struct nls_table *nls_info)
{ {
int rc = 0; int rc = 0;
char ntlm_session_key[CIFS_SESS_KEY_SIZE]; char ntlm_session_key[CIFS_SESS_KEY_SIZE];
...@@ -3425,7 +3494,8 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, ...@@ -3425,7 +3494,8 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
if (linuxExtEnabled == 0) if (linuxExtEnabled == 0)
pSesInfo->capabilities &= (~CAP_UNIX); pSesInfo->capabilities &= (~CAP_UNIX);
/* pSesInfo->sequence_number = 0;*/ /* pSesInfo->sequence_number = 0;*/
cFYI(1, ("Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d", cFYI(1,
("Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
pSesInfo->server->secMode, pSesInfo->server->secMode,
pSesInfo->server->capabilities, pSesInfo->server->capabilities,
pSesInfo->server->timeAdj)); pSesInfo->server->timeAdj));
...@@ -3447,7 +3517,7 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, ...@@ -3447,7 +3517,7 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
nls_info); nls_info);
if (!rc) { if (!rc) {
if (ntlmv2_flag) { if (ntlmv2_flag) {
char * v2_response; char *v2_response;
cFYI(1, ("more secure NTLM ver2 hash")); cFYI(1, ("more secure NTLM ver2 hash"));
if (CalcNTLMv2_partial_mac_key(pSesInfo, if (CalcNTLMv2_partial_mac_key(pSesInfo,
nls_info)) { nls_info)) {
...@@ -3456,11 +3526,12 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, ...@@ -3456,11 +3526,12 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
} else } else
v2_response = kmalloc(16 + 64 /* blob */, GFP_KERNEL); v2_response = kmalloc(16 + 64 /* blob */, GFP_KERNEL);
if (v2_response) { if (v2_response) {
CalcNTLMv2_response(pSesInfo,v2_response); CalcNTLMv2_response(pSesInfo,
v2_response);
/* if (first_time) /* if (first_time)
cifs_calculate_ntlmv2_mac_key( cifs_calculate_ntlmv2_mac_key(
pSesInfo->server->mac_signing_key, pSesInfo->server->mac_signing_key,
response, ntlm_session_key, */ response, ntlm_session_key,*/
kfree(v2_response); kfree(v2_response);
/* BB Put dummy sig in SessSetup PDU? */ /* BB Put dummy sig in SessSetup PDU? */
} else { } else {
......
...@@ -1035,7 +1035,8 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode) ...@@ -1035,7 +1035,8 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode)
/* if it fails, try another handle - might be */ /* if it fails, try another handle - might be */
/* dangerous to hold up writepages with retry */ /* dangerous to hold up writepages with retry */
if (rc) { if (rc) {
cFYI(1, ("failed on reopen file in wp")); cFYI(1,
("failed on reopen file in wp"));
read_lock(&GlobalSMBSeslock); read_lock(&GlobalSMBSeslock);
/* can not use this handle, no write /* can not use this handle, no write
pending on this one after all */ pending on this one after all */
......
...@@ -285,7 +285,6 @@ static int decode_sfu_inode(struct inode *inode, __u64 size, ...@@ -285,7 +285,6 @@ static int decode_sfu_inode(struct inode *inode, __u64 size,
CIFSSMBClose(xid, pTcon, netfid); CIFSSMBClose(xid, pTcon, netfid);
} }
return rc; return rc;
} }
#define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */ #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
...@@ -317,8 +316,6 @@ static int get_sfu_uid_mode(struct inode *inode, ...@@ -317,8 +316,6 @@ static int get_sfu_uid_mode(struct inode *inode,
#else #else
return -EOPNOTSUPP; return -EOPNOTSUPP;
#endif #endif
} }
int cifs_get_inode_info(struct inode **pinode, int cifs_get_inode_info(struct inode **pinode,
...@@ -364,7 +361,6 @@ int cifs_get_inode_info(struct inode **pinode, ...@@ -364,7 +361,6 @@ int cifs_get_inode_info(struct inode **pinode,
CIFS_MOUNT_MAP_SPECIAL_CHR); CIFS_MOUNT_MAP_SPECIAL_CHR);
adjustTZ = TRUE; adjustTZ = TRUE;
} }
} }
/* dump_mem("\nQPathInfo return data",&findData, sizeof(findData)); */ /* dump_mem("\nQPathInfo return data",&findData, sizeof(findData)); */
if (rc) { if (rc) {
......
...@@ -274,7 +274,6 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen) ...@@ -274,7 +274,6 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) { else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
cERROR(1, ("SFU style symlinks not implemented yet")); cERROR(1, ("SFU style symlinks not implemented yet"));
/* add open and read as in fs/cifs/inode.c */ /* add open and read as in fs/cifs/inode.c */
} else { } else {
rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN, GENERIC_READ, rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN, GENERIC_READ,
OPEN_REPARSE_POINT, &fid, &oplock, NULL, OPEN_REPARSE_POINT, &fid, &oplock, NULL,
...@@ -315,7 +314,9 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen) ...@@ -315,7 +314,9 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
num_referrals)); num_referrals));
if (referrals) { if (referrals) {
cFYI(1,("referral string: %s", referrals)); cFYI(1,("referral string: %s", referrals));
strncpy(tmpbuffer, referrals, len-1); strncpy(tmpbuffer,
referrals,
len-1);
} }
} }
kfree(referrals); kfree(referrals);
......
...@@ -47,8 +47,10 @@ _GetXid(void) ...@@ -47,8 +47,10 @@ _GetXid(void)
spin_lock(&GlobalMid_Lock); spin_lock(&GlobalMid_Lock);
GlobalTotalActiveXid++; GlobalTotalActiveXid++;
/* keep high water mark for number of simultaneous ops in filesystem */
if (GlobalTotalActiveXid > GlobalMaxActiveXid) if (GlobalTotalActiveXid > GlobalMaxActiveXid)
GlobalMaxActiveXid = GlobalTotalActiveXid; /* keep high water mark for number of simultaneous vfs ops in our filesystem */ GlobalMaxActiveXid = GlobalTotalActiveXid;
if (GlobalTotalActiveXid > 65000) if (GlobalTotalActiveXid > 65000)
cFYI(1, ("warning: more than 65000 requests active")); cFYI(1, ("warning: more than 65000 requests active"));
xid = GlobalCurrentXid++; xid = GlobalCurrentXid++;
...@@ -148,8 +150,8 @@ cifs_buf_get(void) ...@@ -148,8 +150,8 @@ cifs_buf_get(void)
but it may be more efficient to always alloc same size but it may be more efficient to always alloc same size
albeit slightly larger than necessary and maxbuffersize albeit slightly larger than necessary and maxbuffersize
defaults to this and can not be bigger */ defaults to this and can not be bigger */
ret_buf = ret_buf = (struct smb_hdr *) mempool_alloc(cifs_req_poolp,
(struct smb_hdr *) mempool_alloc(cifs_req_poolp, GFP_KERNEL | GFP_NOFS); GFP_KERNEL | GFP_NOFS);
/* clear the first few header bytes */ /* clear the first few header bytes */
/* for most paths, more is cleared in header_assemble */ /* for most paths, more is cleared in header_assemble */
...@@ -187,8 +189,8 @@ cifs_small_buf_get(void) ...@@ -187,8 +189,8 @@ cifs_small_buf_get(void)
but it may be more efficient to always alloc same size but it may be more efficient to always alloc same size
albeit slightly larger than necessary and maxbuffersize albeit slightly larger than necessary and maxbuffersize
defaults to this and can not be bigger */ defaults to this and can not be bigger */
ret_buf = ret_buf = (struct smb_hdr *) mempool_alloc(cifs_sm_req_poolp,
(struct smb_hdr *) mempool_alloc(cifs_sm_req_poolp, GFP_KERNEL | GFP_NOFS); GFP_KERNEL | GFP_NOFS);
if (ret_buf) { if (ret_buf) {
/* No need to clear memory here, cleared in header assemble */ /* No need to clear memory here, cleared in header assemble */
/* memset(ret_buf, 0, sizeof(struct smb_hdr) + 27);*/ /* memset(ret_buf, 0, sizeof(struct smb_hdr) + 27);*/
......
...@@ -51,7 +51,6 @@ static void dump_cifs_file_struct(struct file *file, char *label) ...@@ -51,7 +51,6 @@ static void dump_cifs_file_struct(struct file *file, char *label)
if (cf->srch_inf.emptyDir) { if (cf->srch_inf.emptyDir) {
cFYI(1, ("empty dir")); cFYI(1, ("empty dir"));
} }
} }
} }
#endif /* DEBUG2 */ #endif /* DEBUG2 */
...@@ -255,7 +254,6 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type, ...@@ -255,7 +254,6 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
tmp_inode->i_fop = &cifs_file_direct_nobrl_ops; tmp_inode->i_fop = &cifs_file_direct_nobrl_ops;
else else
tmp_inode->i_fop = &cifs_file_direct_ops; tmp_inode->i_fop = &cifs_file_direct_ops;
} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
tmp_inode->i_fop = &cifs_file_nobrl_ops; tmp_inode->i_fop = &cifs_file_nobrl_ops;
else else
...@@ -712,7 +710,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, ...@@ -712,7 +710,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
pos_in_buf = index_to_find - first_entry_in_buffer; pos_in_buf = index_to_find - first_entry_in_buffer;
cFYI(1, ("found entry - pos_in_buf %d", pos_in_buf)); cFYI(1, ("found entry - pos_in_buf %d", pos_in_buf));
for (i=0;(i<(pos_in_buf)) && (current_entry != NULL);i++) { for (i=0; (i < (pos_in_buf)) && (current_entry != NULL); i++) {
/* go entry by entry figuring out which is first */ /* go entry by entry figuring out which is first */
current_entry = nxt_dir_entry(current_entry, end_of_smb, current_entry = nxt_dir_entry(current_entry, end_of_smb,
cifsFile->srch_inf.info_level); cifsFile->srch_inf.info_level);
...@@ -982,7 +980,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) ...@@ -982,7 +980,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
char *current_entry; char *current_entry;
int num_to_fill = 0; int num_to_fill = 0;
char *tmp_buf = NULL; char *tmp_buf = NULL;
char * end_of_smb; char *end_of_smb;
int max_len; int max_len;
xid = GetXid(); xid = GetXid();
......
...@@ -178,8 +178,8 @@ ntv2_owf_gen(const unsigned char owf[16], const char *user_n, ...@@ -178,8 +178,8 @@ ntv2_owf_gen(const unsigned char owf[16], const char *user_n,
const char *domain_n, unsigned char kr_buf[16], const char *domain_n, unsigned char kr_buf[16],
const struct nls_table *nls_codepage) const struct nls_table *nls_codepage)
{ {
wchar_t * user_u; wchar_t *user_u;
wchar_t * dom_u; wchar_t *dom_u;
int user_l, domain_l; int user_l, domain_l;
struct HMACMD5Context ctx; struct HMACMD5Context ctx;
......
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