|
|
@@ -48,7 +48,7 @@ static struct {
|
|
|
{LANMAN_PROT, "\2LM1.2X002"},
|
|
|
{LANMAN2_PROT, "\2LANMAN2.1"},
|
|
|
#endif /* weak password hashing for legacy clients */
|
|
|
- {CIFS_PROT, "\2NT LM 0.12"},
|
|
|
+ {CIFS_PROT, "\2NT LM 0.12"},
|
|
|
{POSIX_PROT, "\2POSIX 2"},
|
|
|
{BAD_PROT, "\2"}
|
|
|
};
|
|
|
@@ -119,7 +119,7 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
|
|
|
(and ulogoff which does not have tcon)
|
|
|
are allowed as we start force umount */
|
|
|
if ((smb_command != SMB_COM_WRITE_ANDX) &&
|
|
|
- (smb_command != SMB_COM_OPEN_ANDX) &&
|
|
|
+ (smb_command != SMB_COM_OPEN_ANDX) &&
|
|
|
(smb_command != SMB_COM_TREE_DISCONNECT)) {
|
|
|
cFYI(1, ("can not send cmd %d while umounting",
|
|
|
smb_command));
|
|
|
@@ -127,9 +127,9 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
|
|
|
}
|
|
|
}
|
|
|
if ((tcon->ses) && (tcon->ses->status != CifsExiting) &&
|
|
|
- (tcon->ses->server)){
|
|
|
+ (tcon->ses->server)) {
|
|
|
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
|
|
|
timeout which is 7 seconds */
|
|
|
while(tcon->ses->server->tcpStatus == CifsNeedReconnect) {
|
|
|
@@ -139,34 +139,34 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
|
|
|
/* on "soft" mounts we wait once */
|
|
|
if ((tcon->retry == FALSE) ||
|
|
|
(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;
|
|
|
} /* else "hard" mount - keep retrying
|
|
|
until process is killed or server
|
|
|
comes back on-line */
|
|
|
} else /* TCP session is reestablished now */
|
|
|
break;
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
nls_codepage = load_nls_default();
|
|
|
/* need to prevent multiple threads trying to
|
|
|
simultaneously reconnect the same SMB session */
|
|
|
down(&tcon->ses->sesSem);
|
|
|
if (tcon->ses->status == CifsNeedReconnect)
|
|
|
- rc = cifs_setup_session(0, tcon->ses,
|
|
|
+ rc = cifs_setup_session(0, tcon->ses,
|
|
|
nls_codepage);
|
|
|
if (!rc && (tcon->tidStatus == CifsNeedReconnect)) {
|
|
|
mark_open_files_invalid(tcon);
|
|
|
- rc = CIFSTCon(0, tcon->ses, tcon->treeName,
|
|
|
+ rc = CIFSTCon(0, tcon->ses, tcon->treeName,
|
|
|
tcon, nls_codepage);
|
|
|
up(&tcon->ses->sesSem);
|
|
|
/* tell server which Unix caps we support */
|
|
|
if (tcon->ses->capabilities & CAP_UNIX)
|
|
|
reset_cifs_unix_caps(0 /* no xid */,
|
|
|
- tcon,
|
|
|
+ tcon,
|
|
|
NULL /* we do not know sb */,
|
|
|
- NULL /* no vol info */);
|
|
|
+ NULL /* no vol info */);
|
|
|
/* BB FIXME add code to check if wsize needs
|
|
|
update due to negotiated smb buffer size
|
|
|
shrinking */
|
|
|
@@ -174,14 +174,14 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
|
|
|
atomic_inc(&tconInfoReconnectCount);
|
|
|
|
|
|
cFYI(1, ("reconnect tcon rc = %d", rc));
|
|
|
- /* Removed call to reopen open files here -
|
|
|
- it is safer (and faster) to reopen files
|
|
|
+ /* Removed call to reopen open files here.
|
|
|
+ It is safer (and faster) to reopen files
|
|
|
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
|
|
|
returning to caller to reset file handle */
|
|
|
- switch(smb_command) {
|
|
|
+ switch (smb_command) {
|
|
|
case SMB_COM_READ_ANDX:
|
|
|
case SMB_COM_WRITE_ANDX:
|
|
|
case SMB_COM_CLOSE:
|
|
|
@@ -218,11 +218,11 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-small_smb_init_no_tc(const int smb_command, const int wct,
|
|
|
+small_smb_init_no_tc(const int smb_command, const int wct,
|
|
|
struct cifsSesInfo *ses, void **request_buf)
|
|
|
{
|
|
|
int rc;
|
|
|
- struct smb_hdr * buffer;
|
|
|
+ struct smb_hdr *buffer;
|
|
|
|
|
|
rc = small_smb_init(smb_command, wct, NULL, request_buf);
|
|
|
if (rc)
|
|
|
@@ -237,7 +237,7 @@ small_smb_init_no_tc(const int smb_command, const int wct,
|
|
|
|
|
|
/* uid, tid can stay at zero as set in header assemble */
|
|
|
|
|
|
- /* BB add support for turning on the signing when
|
|
|
+ /* BB add support for turning on the signing when
|
|
|
this function is used after 1st of session setup requests */
|
|
|
|
|
|
return rc;
|
|
|
@@ -269,7 +269,7 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
|
|
|
}
|
|
|
|
|
|
if ((tcon->ses) && (tcon->ses->status != CifsExiting) &&
|
|
|
- (tcon->ses->server)){
|
|
|
+ (tcon->ses->server)) {
|
|
|
struct nls_table *nls_codepage;
|
|
|
/* Give Demultiplex thread up to 10 seconds to
|
|
|
reconnect, should be greater than cifs socket
|
|
|
@@ -282,22 +282,21 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
|
|
|
/* on "soft" mounts we wait once */
|
|
|
if ((tcon->retry == FALSE) ||
|
|
|
(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;
|
|
|
} /* else "hard" mount - keep retrying
|
|
|
until process is killed or server
|
|
|
comes on-line */
|
|
|
} else /* TCP session is reestablished now */
|
|
|
break;
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
nls_codepage = load_nls_default();
|
|
|
/* need to prevent multiple threads trying to
|
|
|
simultaneously reconnect the same SMB session */
|
|
|
down(&tcon->ses->sesSem);
|
|
|
if (tcon->ses->status == CifsNeedReconnect)
|
|
|
- rc = cifs_setup_session(0, tcon->ses,
|
|
|
+ rc = cifs_setup_session(0, tcon->ses,
|
|
|
nls_codepage);
|
|
|
if (!rc && (tcon->tidStatus == CifsNeedReconnect)) {
|
|
|
mark_open_files_invalid(tcon);
|
|
|
@@ -307,7 +306,7 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
|
|
|
/* tell server which Unix caps we support */
|
|
|
if (tcon->ses->capabilities & CAP_UNIX)
|
|
|
reset_cifs_unix_caps(0 /* no xid */,
|
|
|
- tcon,
|
|
|
+ tcon,
|
|
|
NULL /* do not know sb */,
|
|
|
NULL /* no vol info */);
|
|
|
/* BB FIXME add code to check if wsize needs
|
|
|
@@ -317,14 +316,14 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
|
|
|
atomic_inc(&tconInfoReconnectCount);
|
|
|
|
|
|
cFYI(1, ("reconnect tcon rc = %d", rc));
|
|
|
- /* Removed call to reopen open files here -
|
|
|
- it is safer (and faster) to reopen files
|
|
|
+ /* Removed call to reopen open files here.
|
|
|
+ It is safer (and faster) to reopen files
|
|
|
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
|
|
|
returning to caller to reset file handle */
|
|
|
- switch(smb_command) {
|
|
|
+ switch (smb_command) {
|
|
|
case SMB_COM_READ_ANDX:
|
|
|
case SMB_COM_WRITE_ANDX:
|
|
|
case SMB_COM_CLOSE:
|
|
|
@@ -356,7 +355,7 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
|
|
|
/* from the mid flags when the request buffer can be resent without */
|
|
|
/* having to use a second distinct buffer for the response */
|
|
|
if (response_buf)
|
|
|
- *response_buf = *request_buf;
|
|
|
+ *response_buf = *request_buf;
|
|
|
|
|
|
header_assemble((struct smb_hdr *) *request_buf, smb_command, tcon,
|
|
|
wct /*wct */ );
|
|
|
@@ -367,11 +366,11 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-static int validate_t2(struct smb_t2_rsp * pSMB)
|
|
|
+static int validate_t2(struct smb_t2_rsp *pSMB)
|
|
|
{
|
|
|
int rc = -EINVAL;
|
|
|
int total_size;
|
|
|
- char * pBCC;
|
|
|
+ char *pBCC;
|
|
|
|
|
|
/* check for plausible wct, bcc and t2 data and parm sizes */
|
|
|
/* check for parm and data offset going beyond end of smb */
|
|
|
@@ -384,19 +383,18 @@ static int validate_t2(struct smb_t2_rsp * pSMB)
|
|
|
if (total_size < 512) {
|
|
|
total_size+=le16_to_cpu(pSMB->t2_rsp.DataCount);
|
|
|
/* BCC le converted in SendReceive */
|
|
|
- pBCC = (pSMB->hdr.WordCount * 2) +
|
|
|
+ pBCC = (pSMB->hdr.WordCount * 2) +
|
|
|
sizeof(struct smb_hdr) +
|
|
|
(char *)pSMB;
|
|
|
if ((total_size <= (*(u16 *)pBCC)) &&
|
|
|
- (total_size <
|
|
|
+ (total_size <
|
|
|
CIFSMaxBufSize+MAX_CIFS_HDR_SIZE)) {
|
|
|
return 0;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- cifs_dump_mem("Invalid transact2 SMB: ",(char *)pSMB,
|
|
|
+ cifs_dump_mem("Invalid transact2 SMB: ", (char *)pSMB,
|
|
|
sizeof(struct smb_t2_rsp) + 16);
|
|
|
return rc;
|
|
|
}
|
|
|
@@ -408,7 +406,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
int rc = 0;
|
|
|
int bytes_returned;
|
|
|
int i;
|
|
|
- struct TCP_Server_Info * server;
|
|
|
+ struct TCP_Server_Info *server;
|
|
|
u16 count;
|
|
|
unsigned int secFlags;
|
|
|
u16 dialect;
|
|
|
@@ -436,9 +434,9 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
pSMB->hdr.Flags2 |= (SMBFLG2_UNICODE | SMBFLG2_ERR_STATUS);
|
|
|
if ((secFlags & CIFSSEC_MUST_KRB5) == CIFSSEC_MUST_KRB5)
|
|
|
pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC;
|
|
|
-
|
|
|
+
|
|
|
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);
|
|
|
count += strlen(protocols[i].name) + 1;
|
|
|
/* null at end of source and target buffers anyway */
|
|
|
@@ -448,7 +446,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
|
|
|
rc = SendReceive(xid, ses, (struct smb_hdr *) pSMB,
|
|
|
(struct smb_hdr *) pSMBr, &bytes_returned, 0);
|
|
|
- if (rc != 0)
|
|
|
+ if (rc != 0)
|
|
|
goto neg_err_exit;
|
|
|
|
|
|
dialect = le16_to_cpu(pSMBr->DialectIndex);
|
|
|
@@ -456,16 +454,16 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
/* Check wct = 1 error case */
|
|
|
if ((pSMBr->hdr.WordCount < 13) || (dialect == BAD_PROT)) {
|
|
|
/* core returns wct = 1, but we do not ask for core - otherwise
|
|
|
- small wct just comes when dialect index is -1 indicating we
|
|
|
+ small wct just comes when dialect index is -1 indicating we
|
|
|
could not negotiate a common dialect */
|
|
|
rc = -EOPNOTSUPP;
|
|
|
goto neg_err_exit;
|
|
|
-#ifdef CONFIG_CIFS_WEAK_PW_HASH
|
|
|
+#ifdef CONFIG_CIFS_WEAK_PW_HASH
|
|
|
} else if ((pSMBr->hdr.WordCount == 13)
|
|
|
&& ((dialect == LANMAN_PROT)
|
|
|
|| (dialect == LANMAN2_PROT))) {
|
|
|
__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) ||
|
|
|
(secFlags & CIFSSEC_MAY_PLNTXT))
|
|
|
@@ -475,7 +473,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
" in /proc/fs/cifs/SecurityFlags"));
|
|
|
rc = -EOPNOTSUPP;
|
|
|
goto neg_err_exit;
|
|
|
- }
|
|
|
+ }
|
|
|
server->secMode = (__u8)le16_to_cpu(rsp->SecurityMode);
|
|
|
server->maxReq = le16_to_cpu(rsp->MaxMpxCount);
|
|
|
server->maxBuf = min((__u32)le16_to_cpu(rsp->MaxBufSize),
|
|
|
@@ -504,8 +502,8 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
utc = CURRENT_TIME;
|
|
|
ts = cnvrtDosUnixTm(le16_to_cpu(rsp->SrvTime.Date),
|
|
|
le16_to_cpu(rsp->SrvTime.Time));
|
|
|
- cFYI(1,("SrvTime: %d sec since 1970 (utc: %d) diff: %d",
|
|
|
- (int)ts.tv_sec, (int)utc.tv_sec,
|
|
|
+ cFYI(1, ("SrvTime %d sec since 1970 (utc: %d) diff: %d",
|
|
|
+ (int)ts.tv_sec, (int)utc.tv_sec,
|
|
|
(int)(utc.tv_sec - ts.tv_sec)));
|
|
|
val = (int)(utc.tv_sec - ts.tv_sec);
|
|
|
seconds = val < 0 ? -val : val;
|
|
|
@@ -524,9 +522,9 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
|
|
|
|
|
|
/* BB get server time for time conversions and add
|
|
|
- code to use it and timezone since this is not UTC */
|
|
|
+ code to use it and timezone since this is not UTC */
|
|
|
|
|
|
- if (rsp->EncryptionKeyLength ==
|
|
|
+ if (rsp->EncryptionKeyLength ==
|
|
|
cpu_to_le16(CIFS_CRYPTO_KEY_SIZE)) {
|
|
|
memcpy(server->cryptKey, rsp->EncryptionKey,
|
|
|
CIFS_CRYPTO_KEY_SIZE);
|
|
|
@@ -541,7 +539,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
goto signing_check;
|
|
|
#else /* weak security disabled */
|
|
|
} 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"));
|
|
|
rc = -EOPNOTSUPP;
|
|
|
#endif /* WEAK_PW_HASH */
|
|
|
@@ -560,7 +558,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
#ifdef CONFIG_CIFS_WEAK_PW_HASH
|
|
|
if ((secFlags & CIFSSEC_MAY_PLNTXT) == 0)
|
|
|
#endif /* CIFS_WEAK_PW_HASH */
|
|
|
- cERROR(1,("Server requests plain text password"
|
|
|
+ cERROR(1, ("Server requests plain text password"
|
|
|
" but client support disabled"));
|
|
|
|
|
|
if ((secFlags & CIFSSEC_MUST_NTLMV2) == CIFSSEC_MUST_NTLMV2)
|
|
|
@@ -596,7 +594,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
|
|
|
/* BB might be helpful to save off the domain of server here */
|
|
|
|
|
|
- if ((pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC) &&
|
|
|
+ if ((pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC) &&
|
|
|
(server->capabilities & CAP_EXTENDED_SECURITY)) {
|
|
|
count = pSMBr->ByteCount;
|
|
|
if (count < 16)
|
|
|
@@ -641,7 +639,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
cERROR(1, ("Server requires "
|
|
|
"/proc/fs/cifs/PacketSigningEnabled "
|
|
|
"to be on"));
|
|
|
- server->secMode &=
|
|
|
+ server->secMode &=
|
|
|
~(SECMODE_SIGN_ENABLED | SECMODE_SIGN_REQUIRED);
|
|
|
} else if ((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) {
|
|
|
/* signing required */
|
|
|
@@ -656,11 +654,11 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
|
|
} else {
|
|
|
/* signing optional ie CIFSSEC_MAY_SIGN */
|
|
|
if ((server->secMode & SECMODE_SIGN_REQUIRED) == 0)
|
|
|
- server->secMode &=
|
|
|
+ server->secMode &=
|
|
|
~(SECMODE_SIGN_ENABLED | SECMODE_SIGN_REQUIRED);
|
|
|
}
|
|
|
-
|
|
|
-neg_err_exit:
|
|
|
+
|
|
|
+neg_err_exit:
|
|
|
cifs_buf_release(pSMB);
|
|
|
|
|
|
cFYI(1, ("negprot rc %d", rc));
|
|
|
@@ -680,7 +678,7 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon)
|
|
|
* If last user of the connection and
|
|
|
* connection alive - disconnect it
|
|
|
* If this is the last connection on the server session disconnect it
|
|
|
- * (and inside session disconnect we should check if tcp socket needs
|
|
|
+ * (and inside session disconnect we should check if tcp socket needs
|
|
|
* to be freed and kernel thread woken up).
|
|
|
*/
|
|
|
if (tcon)
|
|
|
@@ -694,18 +692,18 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon)
|
|
|
return -EBUSY;
|
|
|
}
|
|
|
|
|
|
- /* No need to return error on this operation if tid invalidated and
|
|
|
+ /* No need to return error on this operation if tid invalidated and
|
|
|
closed on server already e.g. due to tcp session crashing */
|
|
|
if (tcon->tidStatus == CifsNeedReconnect) {
|
|
|
up(&tcon->tconSem);
|
|
|
- return 0;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
if ((tcon->ses == NULL) || (tcon->ses->server == NULL)) {
|
|
|
up(&tcon->tconSem);
|
|
|
return -EIO;
|
|
|
}
|
|
|
- rc = small_smb_init(SMB_COM_TREE_DISCONNECT, 0, tcon,
|
|
|
+ rc = small_smb_init(SMB_COM_TREE_DISCONNECT, 0, tcon,
|
|
|
(void **)&smb_buffer);
|
|
|
if (rc) {
|
|
|
up(&tcon->tconSem);
|
|
|
@@ -722,7 +720,7 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon)
|
|
|
cifs_small_buf_release(smb_buffer);
|
|
|
up(&tcon->tconSem);
|
|
|
|
|
|
- /* No need to return error on this operation if tid invalidated and
|
|
|
+ /* No need to return error on this operation if tid invalidated and
|
|
|
closed on server already e.g. due to tcp session crashing */
|
|
|
if (rc == -EAGAIN)
|
|
|
rc = 0;
|
|
|
@@ -756,7 +754,7 @@ CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses)
|
|
|
}
|
|
|
|
|
|
smb_buffer_response = (struct smb_hdr *)pSMB; /* BB removeme BB */
|
|
|
-
|
|
|
+
|
|
|
if (ses->server) {
|
|
|
pSMB->hdr.Mid = GetNextMid(ses->server);
|
|
|
|
|
|
@@ -783,7 +781,7 @@ CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses)
|
|
|
cifs_small_buf_release(pSMB);
|
|
|
|
|
|
/* if session dead then we do not need to do ulogoff,
|
|
|
- since server closed smb session, no sense reporting
|
|
|
+ since server closed smb session, no sense reporting
|
|
|
error */
|
|
|
if (rc == -EAGAIN)
|
|
|
rc = 0;
|
|
|
@@ -808,7 +806,7 @@ CIFSSMBDelFile(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->fileName, fileName,
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->fileName, fileName,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
@@ -827,7 +825,7 @@ CIFSSMBDelFile(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
cifs_stats_inc(&tcon->num_deletes);
|
|
|
if (rc) {
|
|
|
cFYI(1, ("Error in RMFile = %d", rc));
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
cifs_buf_release(pSMB);
|
|
|
if (rc == -EAGAIN)
|
|
|
@@ -837,7 +835,7 @@ CIFSSMBDelFile(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-CIFSSMBRmDir(const int xid, struct cifsTconInfo *tcon, const char *dirName,
|
|
|
+CIFSSMBRmDir(const int xid, struct cifsTconInfo *tcon, const char *dirName,
|
|
|
const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
DELETE_DIRECTORY_REQ *pSMB = NULL;
|
|
|
@@ -898,7 +896,7 @@ CIFSSMBMkDir(const int xid, struct cifsTconInfo *tcon,
|
|
|
return rc;
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
- name_len = cifsConvertToUCS((__le16 *) pSMB->DirName, name,
|
|
|
+ name_len = cifsConvertToUCS((__le16 *) pSMB->DirName, name,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
@@ -927,7 +925,7 @@ CIFSSMBMkDir(const int xid, struct cifsTconInfo *tcon,
|
|
|
int
|
|
|
CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags,
|
|
|
__u64 mode, __u16 * netfid, FILE_UNIX_BASIC_INFO *pRetData,
|
|
|
- __u32 *pOplock, const char *name,
|
|
|
+ __u32 *pOplock, const char *name,
|
|
|
const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
TRANSACTION2_SPI_REQ *pSMB = NULL;
|
|
|
@@ -969,13 +967,13 @@ CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
param_offset = offsetof(struct smb_com_transaction2_spi_req,
|
|
|
- InformationLevel) - 4;
|
|
|
+ InformationLevel) - 4;
|
|
|
offset = param_offset + params;
|
|
|
data_offset = (char *) (&pSMB->hdr.Protocol) + offset;
|
|
|
pdata = (OPEN_PSX_REQ *)(((char *)&pSMB->hdr.Protocol) + offset);
|
|
|
pdata->Level = SMB_QUERY_FILE_UNIX_BASIC;
|
|
|
pdata->Permissions = cpu_to_le64(mode);
|
|
|
- pdata->PosixOpenFlags = cpu_to_le32(posix_flags);
|
|
|
+ pdata->PosixOpenFlags = cpu_to_le32(posix_flags);
|
|
|
pdata->OpenFlags = cpu_to_le32(*pOplock);
|
|
|
pSMB->ParameterOffset = cpu_to_le16(param_offset);
|
|
|
pSMB->DataOffset = cpu_to_le16(offset);
|
|
|
@@ -990,7 +988,7 @@ CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags,
|
|
|
pSMB->TotalParameterCount = pSMB->ParameterCount;
|
|
|
pSMB->InformationLevel = cpu_to_le16(SMB_POSIX_OPEN);
|
|
|
pSMB->Reserved4 = 0;
|
|
|
- pSMB->hdr.smb_buf_length += byte_count;
|
|
|
+ pSMB->hdr.smb_buf_length += byte_count;
|
|
|
pSMB->ByteCount = cpu_to_le16(byte_count);
|
|
|
rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
|
|
|
(struct smb_hdr *) pSMBr, &bytes_returned, 0);
|
|
|
@@ -1008,9 +1006,9 @@ CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags,
|
|
|
}
|
|
|
|
|
|
/* copy return information to pRetData */
|
|
|
- psx_rsp = (OPEN_PSX_RSP *)((char *) &pSMBr->hdr.Protocol
|
|
|
+ psx_rsp = (OPEN_PSX_RSP *)((char *) &pSMBr->hdr.Protocol
|
|
|
+ le16_to_cpu(pSMBr->t2.DataOffset));
|
|
|
-
|
|
|
+
|
|
|
*pOplock = le16_to_cpu(psx_rsp->OplockFlags);
|
|
|
if (netfid)
|
|
|
*netfid = psx_rsp->Fid; /* cifs fid stays in le */
|
|
|
@@ -1027,15 +1025,14 @@ CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags,
|
|
|
} else {
|
|
|
if (pSMBr->ByteCount < sizeof(OPEN_PSX_RSP)
|
|
|
+ sizeof(FILE_UNIX_BASIC_INFO)) {
|
|
|
- cERROR(1,("Open response data too small"));
|
|
|
+ cERROR(1, ("Open response data too small"));
|
|
|
pRetData->Type = -1;
|
|
|
goto psx_create_err;
|
|
|
}
|
|
|
- memcpy((char *) pRetData,
|
|
|
+ memcpy((char *) pRetData,
|
|
|
(char *)psx_rsp + sizeof(OPEN_PSX_RSP),
|
|
|
sizeof (FILE_UNIX_BASIC_INFO));
|
|
|
}
|
|
|
-
|
|
|
|
|
|
psx_create_err:
|
|
|
cifs_buf_release(pSMB);
|
|
|
@@ -1045,7 +1042,7 @@ CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags,
|
|
|
if (rc == -EAGAIN)
|
|
|
goto PsxCreat;
|
|
|
|
|
|
- return rc;
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
static __u16 convert_disposition(int disposition)
|
|
|
@@ -1082,7 +1079,7 @@ int
|
|
|
SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
|
|
|
const char *fileName, const int openDisposition,
|
|
|
const int access_flags, const int create_options, __u16 * netfid,
|
|
|
- int *pOplock, FILE_ALL_INFO * pfile_info,
|
|
|
+ int *pOplock, FILE_ALL_INFO * pfile_info,
|
|
|
const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
int rc = -EACCES;
|
|
|
@@ -1124,7 +1121,7 @@ SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
|
|
|
1 = write
|
|
|
2 = rw
|
|
|
3 = execute
|
|
|
- */
|
|
|
+ */
|
|
|
pSMB->Mode = cpu_to_le16(2);
|
|
|
pSMB->Mode |= cpu_to_le16(0x40); /* deny none */
|
|
|
/* set file as system file if special file such
|
|
|
@@ -1143,7 +1140,8 @@ SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
|
|
|
being created */
|
|
|
|
|
|
/* 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 */
|
|
|
|
|
|
pSMB->Sattr = cpu_to_le16(ATTR_HIDDEN | ATTR_SYSTEM | ATTR_DIRECTORY);
|
|
|
@@ -1154,7 +1152,7 @@ SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->ByteCount = cpu_to_le16(count);
|
|
|
/* long_op set to 1 to allow for oplock break timeouts */
|
|
|
rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
|
|
|
- (struct smb_hdr *) pSMBr, &bytes_returned, 1);
|
|
|
+ (struct smb_hdr *) pSMBr, &bytes_returned, 1);
|
|
|
cifs_stats_inc(&tcon->num_opens);
|
|
|
if (rc) {
|
|
|
cFYI(1, ("Error in Open = %d", rc));
|
|
|
@@ -1177,7 +1175,7 @@ SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
|
|
|
pfile_info->LastWriteTime = 0; /* BB fixme */
|
|
|
pfile_info->ChangeTime = 0; /* BB fixme */
|
|
|
pfile_info->Attributes =
|
|
|
- cpu_to_le32(le16_to_cpu(pSMBr->FileAttributes));
|
|
|
+ cpu_to_le32(le16_to_cpu(pSMBr->FileAttributes));
|
|
|
/* the file_info buf is endian converted by caller */
|
|
|
pfile_info->AllocationSize =
|
|
|
cpu_to_le64(le32_to_cpu(pSMBr->EndOfFile));
|
|
|
@@ -1196,7 +1194,7 @@ int
|
|
|
CIFSSMBOpen(const int xid, struct cifsTconInfo *tcon,
|
|
|
const char *fileName, const int openDisposition,
|
|
|
const int access_flags, const int create_options, __u16 * netfid,
|
|
|
- int *pOplock, FILE_ALL_INFO * pfile_info,
|
|
|
+ int *pOplock, FILE_ALL_INFO * pfile_info,
|
|
|
const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
int rc = -EACCES;
|
|
|
@@ -1278,9 +1276,9 @@ CIFSSMBOpen(const int xid, struct cifsTconInfo *tcon,
|
|
|
/* Let caller know file was created so we can set the mode. */
|
|
|
/* Do we care about the CreateAction in any other cases? */
|
|
|
if (cpu_to_le32(FILE_CREATE) == pSMBr->CreateAction)
|
|
|
- *pOplock |= CIFS_CREATE_ACTION;
|
|
|
+ *pOplock |= CIFS_CREATE_ACTION;
|
|
|
if (pfile_info) {
|
|
|
- memcpy((char *)pfile_info,(char *)&pSMBr->CreationTime,
|
|
|
+ memcpy((char *)pfile_info, (char *)&pSMBr->CreationTime,
|
|
|
36 /* CreationTime to Attributes */);
|
|
|
/* the file_info buf is endian converted by caller */
|
|
|
pfile_info->AllocationSize = pSMBr->AllocationSize;
|
|
|
@@ -1296,10 +1294,9 @@ CIFSSMBOpen(const int xid, struct cifsTconInfo *tcon,
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-CIFSSMBRead(const int xid, struct cifsTconInfo *tcon,
|
|
|
- const int netfid, const unsigned int count,
|
|
|
- const __u64 lseek, unsigned int *nbytes, char **buf,
|
|
|
- int * pbuf_type)
|
|
|
+CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, const int netfid,
|
|
|
+ const unsigned int count, const __u64 lseek, unsigned int *nbytes,
|
|
|
+ char **buf, int *pbuf_type)
|
|
|
{
|
|
|
int rc = -EACCES;
|
|
|
READ_REQ *pSMB = NULL;
|
|
|
@@ -1339,16 +1336,16 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->ByteCount = 0; /* no need to do le conversion since 0 */
|
|
|
else {
|
|
|
/* old style read */
|
|
|
- struct smb_com_readx_req * pSMBW =
|
|
|
+ struct smb_com_readx_req *pSMBW =
|
|
|
(struct smb_com_readx_req *)pSMB;
|
|
|
pSMBW->ByteCount = 0;
|
|
|
}
|
|
|
|
|
|
iov[0].iov_base = (char *)pSMB;
|
|
|
iov[0].iov_len = pSMB->hdr.smb_buf_length + 4;
|
|
|
- rc = SendReceive2(xid, tcon->ses, iov,
|
|
|
+ rc = SendReceive2(xid, tcon->ses, iov,
|
|
|
1 /* num iovecs */,
|
|
|
- &resp_buf_type, 0);
|
|
|
+ &resp_buf_type, 0);
|
|
|
cifs_stats_inc(&tcon->num_reads);
|
|
|
pSMBr = (READ_RSP *)iov[0].iov_base;
|
|
|
if (rc) {
|
|
|
@@ -1362,18 +1359,19 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon,
|
|
|
/*check that DataLength would not go beyond end of SMB */
|
|
|
if ((data_length > CIFSMaxBufSize)
|
|
|
|| (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;
|
|
|
*nbytes = 0;
|
|
|
} else {
|
|
|
pReadData = (char *) (&pSMBr->hdr.Protocol) +
|
|
|
le16_to_cpu(pSMBr->DataOffset);
|
|
|
/* if (rc = copy_to_user(buf, pReadData, data_length)) {
|
|
|
- cERROR(1,("Faulting on read rc = %d",rc));
|
|
|
- rc = -EFAULT;
|
|
|
+ cERROR(1,("Faulting on read rc = %d",rc));
|
|
|
+ rc = -EFAULT;
|
|
|
}*/ /* can not use copy_to_user when using page cache*/
|
|
|
if (*buf)
|
|
|
- memcpy(*buf,pReadData,data_length);
|
|
|
+ memcpy(*buf, pReadData, data_length);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1384,8 +1382,8 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon,
|
|
|
else if (resp_buf_type == CIFS_LARGE_BUFFER)
|
|
|
cifs_buf_release(iov[0].iov_base);
|
|
|
} else if (resp_buf_type != CIFS_NO_BUFFER) {
|
|
|
- /* return buffer to caller to free */
|
|
|
- *buf = iov[0].iov_base;
|
|
|
+ /* return buffer to caller to free */
|
|
|
+ *buf = iov[0].iov_base;
|
|
|
if (resp_buf_type == CIFS_SMALL_BUFFER)
|
|
|
*pbuf_type = CIFS_SMALL_BUFFER;
|
|
|
else if (resp_buf_type == CIFS_LARGE_BUFFER)
|
|
|
@@ -1402,7 +1400,7 @@ int
|
|
|
CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
|
|
|
const int netfid, const unsigned int count,
|
|
|
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;
|
|
|
WRITE_REQ *pSMB = NULL;
|
|
|
@@ -1435,12 +1433,12 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->OffsetHigh = cpu_to_le32(offset >> 32);
|
|
|
else if ((offset >> 32) > 0) /* can not handle big offset for old srv */
|
|
|
return -EIO;
|
|
|
-
|
|
|
+
|
|
|
pSMB->Reserved = 0xFFFFFFFF;
|
|
|
pSMB->WriteMode = 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
|
|
|
our buffer is big enough or if we convert to iovecs on socket writes
|
|
|
and eliminate the copy to the CIFS buffer */
|
|
|
@@ -1454,9 +1452,9 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
|
|
|
if (bytes_sent > count)
|
|
|
bytes_sent = count;
|
|
|
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)
|
|
|
- memcpy(pSMB->Data,buf,bytes_sent);
|
|
|
+ memcpy(pSMB->Data, buf, bytes_sent);
|
|
|
else if (ubuf) {
|
|
|
if (copy_from_user(pSMB->Data, ubuf, bytes_sent)) {
|
|
|
cifs_buf_release(pSMB);
|
|
|
@@ -1478,8 +1476,9 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
if (wct == 14)
|
|
|
pSMB->ByteCount = cpu_to_le16(byte_count);
|
|
|
- else { /* old style write has byte count 4 bytes earlier so 4 bytes pad */
|
|
|
- struct smb_com_writex_req * pSMBW =
|
|
|
+ else { /* old style write has byte count 4 bytes earlier
|
|
|
+ so 4 bytes pad */
|
|
|
+ struct smb_com_writex_req *pSMBW =
|
|
|
(struct smb_com_writex_req *)pSMB;
|
|
|
pSMBW->ByteCount = cpu_to_le16(byte_count);
|
|
|
}
|
|
|
@@ -1498,7 +1497,7 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
cifs_buf_release(pSMB);
|
|
|
|
|
|
- /* Note: On -EAGAIN error only caller can retry on handle based calls
|
|
|
+ /* Note: On -EAGAIN error only caller can retry on handle based calls
|
|
|
since file handle passed in no longer valid */
|
|
|
|
|
|
return rc;
|
|
|
@@ -1541,7 +1540,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->Remaining = 0;
|
|
|
|
|
|
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->DataLengthHigh = cpu_to_le16(count >> 16);
|
|
|
@@ -1553,7 +1552,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
|
|
|
if (wct == 14)
|
|
|
pSMB->ByteCount = cpu_to_le16(count + 1);
|
|
|
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;
|
|
|
pSMBW->ByteCount = cpu_to_le16(count + 5);
|
|
|
}
|
|
|
@@ -1562,7 +1561,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
|
|
|
iov[0].iov_len = smb_hdr_len + 4;
|
|
|
else /* wct == 12 pad bigger by four bytes */
|
|
|
iov[0].iov_len = smb_hdr_len + 8;
|
|
|
-
|
|
|
+
|
|
|
|
|
|
rc = SendReceive2(xid, tcon->ses, iov, n_vec + 1, &resp_buf_type,
|
|
|
long_op);
|
|
|
@@ -1579,7 +1578,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
|
|
|
*nbytes = le16_to_cpu(pSMBr->CountHigh);
|
|
|
*nbytes = (*nbytes) << 16;
|
|
|
*nbytes += le16_to_cpu(pSMBr->Count);
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
/* cifs_small_buf_release(pSMB); */ /* Freed earlier now in SendReceive2 */
|
|
|
if (resp_buf_type == CIFS_SMALL_BUFFER)
|
|
|
@@ -1587,7 +1586,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
|
|
|
else if (resp_buf_type == CIFS_LARGE_BUFFER)
|
|
|
cifs_buf_release(iov[0].iov_base);
|
|
|
|
|
|
- /* Note: On -EAGAIN error only caller can retry on handle based calls
|
|
|
+ /* Note: On -EAGAIN error only caller can retry on handle based calls
|
|
|
since file handle passed in no longer valid */
|
|
|
|
|
|
return rc;
|
|
|
@@ -1607,7 +1606,7 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
|
|
|
int timeout = 0;
|
|
|
__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);
|
|
|
|
|
|
if (rc)
|
|
|
@@ -1659,7 +1658,7 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
|
|
|
}
|
|
|
cifs_small_buf_release(pSMB);
|
|
|
|
|
|
- /* Note: On -EAGAIN error only caller can retry on handle based calls
|
|
|
+ /* Note: On -EAGAIN error only caller can retry on handle based calls
|
|
|
since file handle passed in no longer valid */
|
|
|
return rc;
|
|
|
}
|
|
|
@@ -1667,7 +1666,7 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
|
|
|
int
|
|
|
CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
|
|
|
const __u16 smb_file_id, const int get_flag, const __u64 len,
|
|
|
- struct file_lock *pLockData, const __u16 lock_type,
|
|
|
+ struct file_lock *pLockData, const __u16 lock_type,
|
|
|
const int waitFlag)
|
|
|
{
|
|
|
struct smb_com_transaction2_sfi_req *pSMB = NULL;
|
|
|
@@ -1691,7 +1690,7 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
pSMBr = (struct smb_com_transaction2_sfi_rsp *)pSMB;
|
|
|
|
|
|
- params = 6;
|
|
|
+ params = 6;
|
|
|
pSMB->MaxSetupCount = 0;
|
|
|
pSMB->Reserved = 0;
|
|
|
pSMB->Flags = 0;
|
|
|
@@ -1716,7 +1715,7 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->TotalDataCount = pSMB->DataCount;
|
|
|
pSMB->TotalParameterCount = pSMB->ParameterCount;
|
|
|
pSMB->ParameterOffset = cpu_to_le16(param_offset);
|
|
|
- parm_data = (struct cifs_posix_lock *)
|
|
|
+ parm_data = (struct cifs_posix_lock *)
|
|
|
(((char *) &pSMB->hdr.Protocol) + offset);
|
|
|
|
|
|
parm_data->lock_type = cpu_to_le16(lock_type);
|
|
|
@@ -1772,7 +1771,7 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
|
|
|
if (parm_data->lock_type == cpu_to_le16(CIFS_UNLCK))
|
|
|
pLockData->fl_type = F_UNLCK;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
plk_err_exit:
|
|
|
if (pSMB)
|
|
|
cifs_small_buf_release(pSMB);
|
|
|
@@ -1850,7 +1849,7 @@ CIFSSMBRename(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->OldFileName, fromName,
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->OldFileName, fromName,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
@@ -1862,7 +1861,7 @@ CIFSSMBRename(const int xid, struct cifsTconInfo *tcon,
|
|
|
toName, PATH_MAX, nls_codepage, remap);
|
|
|
name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ;
|
|
|
name_len2 *= 2; /* convert to bytes */
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(fromName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->OldFileName, fromName, name_len);
|
|
|
@@ -1883,7 +1882,7 @@ CIFSSMBRename(const int xid, struct cifsTconInfo *tcon,
|
|
|
cifs_stats_inc(&tcon->num_renames);
|
|
|
if (rc) {
|
|
|
cFYI(1, ("Send error in rename = %d", rc));
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
cifs_buf_release(pSMB);
|
|
|
|
|
|
@@ -1893,13 +1892,13 @@ CIFSSMBRename(const int xid, struct cifsTconInfo *tcon,
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-int CIFSSMBRenameOpenFile(const int xid,struct cifsTconInfo *pTcon,
|
|
|
- int netfid, char * target_name,
|
|
|
- const struct nls_table * nls_codepage, int remap)
|
|
|
+int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon,
|
|
|
+ int netfid, char *target_name,
|
|
|
+ const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
struct smb_com_transaction2_sfi_req *pSMB = 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 dummy_string[30];
|
|
|
int rc = 0;
|
|
|
@@ -1939,12 +1938,13 @@ int CIFSSMBRenameOpenFile(const int xid,struct cifsTconInfo *pTcon,
|
|
|
rename_info->root_fid = 0;
|
|
|
/* unicode only call */
|
|
|
if (target_name == NULL) {
|
|
|
- sprintf(dummy_string,"cifs%x",pSMB->hdr.Mid);
|
|
|
- len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name,
|
|
|
+ sprintf(dummy_string, "cifs%x", pSMB->hdr.Mid);
|
|
|
+ len_of_str = cifsConvertToUCS((__le16 *)rename_info->target_name,
|
|
|
dummy_string, 24, nls_codepage, remap);
|
|
|
} else {
|
|
|
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);
|
|
|
count = 12 /* sizeof(struct set_file_rename) */ + (2 * len_of_str) + 2;
|
|
|
@@ -1958,7 +1958,7 @@ int CIFSSMBRenameOpenFile(const int xid,struct cifsTconInfo *pTcon,
|
|
|
pSMB->hdr.smb_buf_length += byte_count;
|
|
|
pSMB->ByteCount = cpu_to_le16(byte_count);
|
|
|
rc = SendReceive(xid, pTcon->ses, (struct smb_hdr *) pSMB,
|
|
|
- (struct smb_hdr *) pSMBr, &bytes_returned, 0);
|
|
|
+ (struct smb_hdr *) pSMBr, &bytes_returned, 0);
|
|
|
cifs_stats_inc(&pTcon->num_t2renames);
|
|
|
if (rc) {
|
|
|
cFYI(1, ("Send error in Rename (by file handle) = %d", rc));
|
|
|
@@ -1973,9 +1973,9 @@ int CIFSSMBRenameOpenFile(const int xid,struct cifsTconInfo *pTcon,
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-CIFSSMBCopy(const int xid, struct cifsTconInfo *tcon, const char * fromName,
|
|
|
- const __u16 target_tid, const char *toName, const int flags,
|
|
|
- const struct nls_table *nls_codepage, int remap)
|
|
|
+CIFSSMBCopy(const int xid, struct cifsTconInfo *tcon, const char *fromName,
|
|
|
+ const __u16 target_tid, const char *toName, const int flags,
|
|
|
+ const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
COPY_REQ *pSMB = NULL;
|
|
|
@@ -1997,7 +1997,7 @@ CIFSSMBCopy(const int xid, struct cifsTconInfo *tcon, const char * fromName,
|
|
|
pSMB->Flags = cpu_to_le16(flags & COPY_TREE);
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
- name_len = cifsConvertToUCS((__le16 *) pSMB->OldFileName,
|
|
|
+ name_len = cifsConvertToUCS((__le16 *) pSMB->OldFileName,
|
|
|
fromName, PATH_MAX, nls_codepage,
|
|
|
remap);
|
|
|
name_len++; /* trailing null */
|
|
|
@@ -2005,11 +2005,12 @@ CIFSSMBCopy(const int xid, struct cifsTconInfo *tcon, const char * fromName,
|
|
|
pSMB->OldFileName[name_len] = 0x04; /* pad */
|
|
|
/* protocol requires ASCII signature byte on Unicode string */
|
|
|
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);
|
|
|
name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ;
|
|
|
name_len2 *= 2; /* convert to bytes */
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(fromName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->OldFileName, fromName, name_len);
|
|
|
@@ -2069,7 +2070,7 @@ CIFSUnixCreateSymLink(const int xid, struct cifsTconInfo *tcon,
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(fromName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->FileName, fromName, name_len);
|
|
|
@@ -2081,7 +2082,7 @@ CIFSUnixCreateSymLink(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
param_offset = offsetof(struct smb_com_transaction2_spi_req,
|
|
|
- InformationLevel) - 4;
|
|
|
+ InformationLevel) - 4;
|
|
|
offset = param_offset + params;
|
|
|
|
|
|
data_offset = (char *) (&pSMB->hdr.Protocol) + offset;
|
|
|
@@ -2092,7 +2093,7 @@ CIFSUnixCreateSymLink(const int xid, struct cifsTconInfo *tcon,
|
|
|
, nls_codepage);
|
|
|
name_len_target++; /* trailing null */
|
|
|
name_len_target *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len_target = strnlen(toName, PATH_MAX);
|
|
|
name_len_target++; /* trailing null */
|
|
|
strncpy(data_offset, toName, name_len_target);
|
|
|
@@ -2160,7 +2161,7 @@ CIFSUnixCreateHardLink(const int xid, struct cifsTconInfo *tcon,
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(toName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->FileName, toName, name_len);
|
|
|
@@ -2172,7 +2173,7 @@ CIFSUnixCreateHardLink(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
param_offset = offsetof(struct smb_com_transaction2_spi_req,
|
|
|
- InformationLevel) - 4;
|
|
|
+ InformationLevel) - 4;
|
|
|
offset = param_offset + params;
|
|
|
|
|
|
data_offset = (char *) (&pSMB->hdr.Protocol) + offset;
|
|
|
@@ -2182,7 +2183,7 @@ CIFSUnixCreateHardLink(const int xid, struct cifsTconInfo *tcon,
|
|
|
nls_codepage, remap);
|
|
|
name_len_target++; /* trailing null */
|
|
|
name_len_target *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len_target = strnlen(fromName, PATH_MAX);
|
|
|
name_len_target++; /* trailing null */
|
|
|
strncpy(data_offset, fromName, name_len_target);
|
|
|
@@ -2254,13 +2255,13 @@ CIFSCreateHardLink(const int xid, struct cifsTconInfo *tcon,
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
pSMB->OldFileName[name_len] = 0; /* pad */
|
|
|
- pSMB->OldFileName[name_len + 1] = 0x04;
|
|
|
+ pSMB->OldFileName[name_len + 1] = 0x04;
|
|
|
name_len2 =
|
|
|
- cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2],
|
|
|
+ cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2],
|
|
|
toName, PATH_MAX, nls_codepage, remap);
|
|
|
name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ;
|
|
|
name_len2 *= 2; /* convert to bytes */
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(fromName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->OldFileName, fromName, name_len);
|
|
|
@@ -2313,12 +2314,11 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifs_strtoUCS((__le16 *) pSMB->FileName, searchName, PATH_MAX
|
|
|
- /* find define for this maxpathcomponent */
|
|
|
- , nls_codepage);
|
|
|
+ cifs_strtoUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
+ PATH_MAX, nls_codepage);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(searchName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->FileName, searchName, name_len);
|
|
|
@@ -2335,7 +2335,7 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
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->DataOffset = 0;
|
|
|
pSMB->SetupCount = 1;
|
|
|
@@ -2366,16 +2366,16 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len = UniStrnlen((wchar_t *) ((char *)
|
|
|
- &pSMBr->hdr.Protocol +data_offset),
|
|
|
- min_t(const int, buflen,count) / 2);
|
|
|
+ &pSMBr->hdr.Protocol + data_offset),
|
|
|
+ min_t(const int, buflen, count) / 2);
|
|
|
/* BB FIXME investigate remapping reserved chars here */
|
|
|
cifs_strfromUCS_le(symlinkinfo,
|
|
|
- (__le16 *) ((char *)&pSMBr->hdr.Protocol +
|
|
|
- data_offset),
|
|
|
+ (__le16 *) ((char *)&pSMBr->hdr.Protocol
|
|
|
+ + data_offset),
|
|
|
name_len, nls_codepage);
|
|
|
} else {
|
|
|
strncpy(symlinkinfo,
|
|
|
- (char *) &pSMBr->hdr.Protocol +
|
|
|
+ (char *) &pSMBr->hdr.Protocol +
|
|
|
data_offset,
|
|
|
min_t(const int, buflen, count));
|
|
|
}
|
|
|
@@ -2396,14 +2396,14 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
|
|
|
Setup words themselves and ByteCount
|
|
|
MaxSetupCount (size of returned setup area) and
|
|
|
MaxParameterCount (returned parms size) must be set by caller */
|
|
|
-static int
|
|
|
+static int
|
|
|
smb_init_ntransact(const __u16 sub_command, const int setup_count,
|
|
|
const int parm_len, struct cifsTconInfo *tcon,
|
|
|
- void ** ret_buf)
|
|
|
+ void **ret_buf)
|
|
|
{
|
|
|
int rc;
|
|
|
__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,
|
|
|
(void **)&pSMB);
|
|
|
@@ -2427,12 +2427,12 @@ smb_init_ntransact(const __u16 sub_command, const int setup_count,
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-validate_ntransact(char * buf, char ** ppparm, char ** ppdata,
|
|
|
- int * pdatalen, int * pparmlen)
|
|
|
+validate_ntransact(char *buf, char **ppparm, char **ppdata,
|
|
|
+ int *pdatalen, int *pparmlen)
|
|
|
{
|
|
|
- char * end_of_smb;
|
|
|
+ char *end_of_smb;
|
|
|
__u32 data_count, data_offset, parm_count, parm_offset;
|
|
|
- struct smb_com_ntransact_rsp * pSMBr;
|
|
|
+ struct smb_com_ntransact_rsp *pSMBr;
|
|
|
|
|
|
if (buf == NULL)
|
|
|
return -EINVAL;
|
|
|
@@ -2440,13 +2440,12 @@ validate_ntransact(char * buf, char ** ppparm, char ** ppdata,
|
|
|
pSMBr = (struct smb_com_ntransact_rsp *)buf;
|
|
|
|
|
|
/* ByteCount was converted from little endian in SendReceive */
|
|
|
- end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount +
|
|
|
+ end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount +
|
|
|
(char *)&pSMBr->ByteCount;
|
|
|
|
|
|
-
|
|
|
data_offset = le32_to_cpu(pSMBr->DataOffset);
|
|
|
data_count = le32_to_cpu(pSMBr->DataCount);
|
|
|
- parm_offset = le32_to_cpu(pSMBr->ParameterOffset);
|
|
|
+ parm_offset = le32_to_cpu(pSMBr->ParameterOffset);
|
|
|
parm_count = le32_to_cpu(pSMBr->ParameterCount);
|
|
|
|
|
|
*ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset;
|
|
|
@@ -2464,7 +2463,8 @@ validate_ntransact(char * buf, char ** ppparm, char ** ppdata,
|
|
|
return -EINVAL;
|
|
|
} else if (data_count + *ppdata > end_of_smb) {
|
|
|
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;
|
|
|
} else if (parm_count + data_count > pSMBr->ByteCount) {
|
|
|
cFYI(1, ("parm count and data count larger than SMB"));
|
|
|
@@ -2476,14 +2476,14 @@ validate_ntransact(char * buf, char ** ppparm, char ** ppdata,
|
|
|
int
|
|
|
CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
const unsigned char *searchName,
|
|
|
- char *symlinkinfo, const int buflen,__u16 fid,
|
|
|
+ char *symlinkinfo, const int buflen, __u16 fid,
|
|
|
const struct nls_table *nls_codepage)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
int bytes_returned;
|
|
|
int name_len;
|
|
|
- struct smb_com_transaction_ioctl_req * pSMB;
|
|
|
- struct smb_com_transaction_ioctl_rsp * pSMBr;
|
|
|
+ struct smb_com_transaction_ioctl_req *pSMB;
|
|
|
+ struct smb_com_transaction_ioctl_rsp *pSMBr;
|
|
|
|
|
|
cFYI(1, ("In Windows reparse style QueryLink for path %s", searchName));
|
|
|
rc = smb_init(SMB_COM_NT_TRANSACT, 23, tcon, (void **) &pSMB,
|
|
|
@@ -2523,12 +2523,14 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
rc = -EIO; /* bad smb */
|
|
|
else {
|
|
|
if (data_count && (data_count < 2048)) {
|
|
|
- char * end_of_smb = 2 /* sizeof byte count */ +
|
|
|
+ char *end_of_smb = 2 /* sizeof byte count */ +
|
|
|
pSMBr->ByteCount +
|
|
|
(char *)&pSMBr->ByteCount;
|
|
|
|
|
|
- struct reparse_data * reparse_buf = (struct reparse_data *)
|
|
|
- ((char *)&pSMBr->hdr.Protocol + data_offset);
|
|
|
+ struct reparse_data *reparse_buf =
|
|
|
+ (struct reparse_data *)
|
|
|
+ ((char *)&pSMBr->hdr.Protocol
|
|
|
+ + data_offset);
|
|
|
if ((char *)reparse_buf >= end_of_smb) {
|
|
|
rc = -EIO;
|
|
|
goto qreparse_out;
|
|
|
@@ -2541,20 +2543,23 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
rc = -EIO;
|
|
|
goto qreparse_out;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len = UniStrnlen((wchar_t *)
|
|
|
- (reparse_buf->LinkNamesBuf +
|
|
|
- reparse_buf->TargetNameOffset),
|
|
|
- min(buflen/2, reparse_buf->TargetNameLen / 2));
|
|
|
+ (reparse_buf->LinkNamesBuf +
|
|
|
+ reparse_buf->TargetNameOffset),
|
|
|
+ min(buflen/2,
|
|
|
+ reparse_buf->TargetNameLen / 2));
|
|
|
cifs_strfromUCS_le(symlinkinfo,
|
|
|
- (__le16 *) (reparse_buf->LinkNamesBuf +
|
|
|
+ (__le16 *) (reparse_buf->LinkNamesBuf +
|
|
|
reparse_buf->TargetNameOffset),
|
|
|
name_len, nls_codepage);
|
|
|
} else { /* ASCII names */
|
|
|
- strncpy(symlinkinfo,reparse_buf->LinkNamesBuf +
|
|
|
- reparse_buf->TargetNameOffset,
|
|
|
- min_t(const int, buflen, reparse_buf->TargetNameLen));
|
|
|
+ strncpy(symlinkinfo,
|
|
|
+ reparse_buf->LinkNamesBuf +
|
|
|
+ reparse_buf->TargetNameOffset,
|
|
|
+ min_t(const int, buflen,
|
|
|
+ reparse_buf->TargetNameLen));
|
|
|
}
|
|
|
} else {
|
|
|
rc = -EIO;
|
|
|
@@ -2562,7 +2567,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
}
|
|
|
symlinkinfo[buflen] = 0; /* just in case so the caller
|
|
|
does not go off the end of the buffer */
|
|
|
- cFYI(1,("readlink result - %s",symlinkinfo));
|
|
|
+ cFYI(1, ("readlink result - %s", symlinkinfo));
|
|
|
}
|
|
|
}
|
|
|
qreparse_out:
|
|
|
@@ -2577,7 +2582,8 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
#ifdef CONFIG_CIFS_POSIX
|
|
|
|
|
|
/*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 */
|
|
|
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
|
|
|
}
|
|
|
|
|
|
/* 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,
|
|
|
- const int acl_type,const int size_of_data_area)
|
|
|
+static int cifs_copy_posix_acl(char *trgt, char *src, const int buflen,
|
|
|
+ const int acl_type, const int size_of_data_area)
|
|
|
{
|
|
|
int size = 0;
|
|
|
int i;
|
|
|
__u16 count;
|
|
|
- struct cifs_posix_ace * pACE;
|
|
|
- struct cifs_posix_acl * cifs_acl = (struct cifs_posix_acl *)src;
|
|
|
- posix_acl_xattr_header * local_acl = (posix_acl_xattr_header *)trgt;
|
|
|
+ struct cifs_posix_ace *pACE;
|
|
|
+ struct cifs_posix_acl *cifs_acl = (struct cifs_posix_acl *)src;
|
|
|
+ posix_acl_xattr_header *local_acl = (posix_acl_xattr_header *)trgt;
|
|
|
|
|
|
if (le16_to_cpu(cifs_acl->version) != CIFS_ACL_VERSION)
|
|
|
return -EOPNOTSUPP;
|
|
|
@@ -2609,7 +2615,8 @@ static int cifs_copy_posix_acl(char * trgt,char * src, const int buflen,
|
|
|
size += sizeof(struct cifs_posix_ace) * count;
|
|
|
/* check if we would go beyond end of SMB */
|
|
|
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;
|
|
|
}
|
|
|
} else if (acl_type & ACL_TYPE_DEFAULT) {
|
|
|
@@ -2630,21 +2637,21 @@ static int cifs_copy_posix_acl(char * trgt,char * src, const int buflen,
|
|
|
|
|
|
size = posix_acl_xattr_size(count);
|
|
|
if ((buflen == 0) || (local_acl == NULL)) {
|
|
|
- /* used to query ACL EA size */
|
|
|
+ /* used to query ACL EA size */
|
|
|
} else if (size > buflen) {
|
|
|
return -ERANGE;
|
|
|
} else /* buffer big enough */ {
|
|
|
local_acl->a_version = cpu_to_le32(POSIX_ACL_XATTR_VERSION);
|
|
|
- for(i = 0;i < count ;i++) {
|
|
|
- cifs_convert_ace(&local_acl->a_entries[i],pACE);
|
|
|
- pACE ++;
|
|
|
+ for (i = 0; i < count ; i++) {
|
|
|
+ cifs_convert_ace(&local_acl->a_entries[i], pACE);
|
|
|
+ pACE++;
|
|
|
}
|
|
|
}
|
|
|
return size;
|
|
|
}
|
|
|
|
|
|
-static __u16 convert_ace_to_cifs_ace(struct cifs_posix_ace * cifs_ace,
|
|
|
- const posix_acl_xattr_entry * local_ace)
|
|
|
+static __u16 convert_ace_to_cifs_ace(struct cifs_posix_ace *cifs_ace,
|
|
|
+ const posix_acl_xattr_entry *local_ace)
|
|
|
{
|
|
|
__u16 rc = 0; /* 0 = ACL converted ok */
|
|
|
|
|
|
@@ -2654,19 +2661,19 @@ static __u16 convert_ace_to_cifs_ace(struct cifs_posix_ace * cifs_ace,
|
|
|
if (local_ace->e_id == cpu_to_le32(-1)) {
|
|
|
/* Probably no need to le convert -1 on any arch but can not hurt */
|
|
|
cifs_ace->cifs_uid = cpu_to_le64(-1);
|
|
|
- } else
|
|
|
+ } else
|
|
|
cifs_ace->cifs_uid = cpu_to_le64(le32_to_cpu(local_ace->e_id));
|
|
|
- /*cFYI(1,("perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id));*/
|
|
|
+ /*cFYI(1,("perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id));*/
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
/* 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,
|
|
|
- const int acl_type)
|
|
|
+static __u16 ACL_to_cifs_posix(char *parm_data, const char *pACL,
|
|
|
+ const int buflen, const int acl_type)
|
|
|
{
|
|
|
__u16 rc = 0;
|
|
|
- struct cifs_posix_acl * cifs_acl = (struct cifs_posix_acl *)parm_data;
|
|
|
- posix_acl_xattr_header * local_acl = (posix_acl_xattr_header *)pACL;
|
|
|
+ struct cifs_posix_acl *cifs_acl = (struct cifs_posix_acl *)parm_data;
|
|
|
+ posix_acl_xattr_header *local_acl = (posix_acl_xattr_header *)pACL;
|
|
|
int count;
|
|
|
int i;
|
|
|
|
|
|
@@ -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",
|
|
|
count, buflen, le32_to_cpu(local_acl->a_version)));
|
|
|
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)));
|
|
|
return 0;
|
|
|
}
|
|
|
@@ -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)
|
|
|
cifs_acl->default_entry_count = cpu_to_le16(count);
|
|
|
else {
|
|
|
- cFYI(1,("unknown ACL type %d",acl_type));
|
|
|
+ cFYI(1, ("unknown ACL type %d", acl_type));
|
|
|
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],
|
|
|
&local_acl->a_entries[i]);
|
|
|
if (rc != 0) {
|
|
|
@@ -2708,9 +2715,9 @@ static __u16 ACL_to_cifs_posix(char * parm_data,const char * pACL,const int bufl
|
|
|
|
|
|
int
|
|
|
CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
- const unsigned char *searchName,
|
|
|
- char *acl_inf, const int buflen, const int acl_type,
|
|
|
- const struct nls_table *nls_codepage, int remap)
|
|
|
+ const unsigned char *searchName,
|
|
|
+ char *acl_inf, const int buflen, const int acl_type,
|
|
|
+ const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
/* SMB_QUERY_POSIX_ACL */
|
|
|
TRANSACTION2_QPI_REQ *pSMB = NULL;
|
|
|
@@ -2719,7 +2726,7 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
int bytes_returned;
|
|
|
int name_len;
|
|
|
__u16 params, byte_count;
|
|
|
-
|
|
|
+
|
|
|
cFYI(1, ("In GetPosixACL (Unix) for path %s", searchName));
|
|
|
|
|
|
queryAclRetry:
|
|
|
@@ -2727,16 +2734,16 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
(void **) &pSMBr);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
-
|
|
|
+
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
pSMB->FileName[name_len] = 0;
|
|
|
pSMB->FileName[name_len+1] = 0;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(searchName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->FileName, searchName, name_len);
|
|
|
@@ -2745,7 +2752,7 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
params = 2 /* level */ + 4 /* rsrvd */ + name_len /* incl null */ ;
|
|
|
pSMB->TotalDataCount = 0;
|
|
|
pSMB->MaxParameterCount = cpu_to_le16(2);
|
|
|
- /* BB find exact max data count below from sess structure BB */
|
|
|
+ /* BB find exact max data count below from sess structure BB */
|
|
|
pSMB->MaxDataCount = cpu_to_le16(4000);
|
|
|
pSMB->MaxSetupCount = 0;
|
|
|
pSMB->Reserved = 0;
|
|
|
@@ -2753,7 +2760,8 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
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->DataOffset = 0;
|
|
|
pSMB->SetupCount = 1;
|
|
|
@@ -2774,7 +2782,7 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
cFYI(1, ("Send error in Query POSIX ACL = %d", rc));
|
|
|
} else {
|
|
|
/* decode response */
|
|
|
-
|
|
|
+
|
|
|
rc = validate_t2((struct smb_t2_rsp *)pSMBr);
|
|
|
if (rc || (pSMBr->ByteCount < 2))
|
|
|
/* BB also check enough total bytes returned */
|
|
|
@@ -2784,7 +2792,7 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
__u16 count = le16_to_cpu(pSMBr->t2.DataCount);
|
|
|
rc = cifs_copy_posix_acl(acl_inf,
|
|
|
(char *)&pSMBr->hdr.Protocol+data_offset,
|
|
|
- buflen,acl_type,count);
|
|
|
+ buflen, acl_type, count);
|
|
|
}
|
|
|
}
|
|
|
cifs_buf_release(pSMB);
|
|
|
@@ -2795,10 +2803,10 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
int
|
|
|
CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
- const unsigned char *fileName,
|
|
|
- const char *local_acl, const int buflen,
|
|
|
- const int acl_type,
|
|
|
- const struct nls_table *nls_codepage, int remap)
|
|
|
+ const unsigned char *fileName,
|
|
|
+ const char *local_acl, const int buflen,
|
|
|
+ const int acl_type,
|
|
|
+ const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
struct smb_com_transaction2_spi_req *pSMB = NULL;
|
|
|
struct smb_com_transaction2_spi_rsp *pSMBr = NULL;
|
|
|
@@ -2811,16 +2819,16 @@ CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
cFYI(1, ("In SetPosixACL (Unix) for path %s", fileName));
|
|
|
setAclRetry:
|
|
|
rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB,
|
|
|
- (void **) &pSMBr);
|
|
|
+ (void **) &pSMBr);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->FileName, fileName,
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->FileName, fileName,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(fileName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->FileName, fileName, name_len);
|
|
|
@@ -2834,13 +2842,13 @@ CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
param_offset = offsetof(struct smb_com_transaction2_spi_req,
|
|
|
- InformationLevel) - 4;
|
|
|
+ InformationLevel) - 4;
|
|
|
offset = param_offset + params;
|
|
|
parm_data = ((char *) &pSMB->hdr.Protocol) + offset;
|
|
|
pSMB->ParameterOffset = cpu_to_le16(param_offset);
|
|
|
|
|
|
/* 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) {
|
|
|
rc = -EOPNOTSUPP;
|
|
|
@@ -2860,7 +2868,7 @@ CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->hdr.smb_buf_length += byte_count;
|
|
|
pSMB->ByteCount = cpu_to_le16(byte_count);
|
|
|
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) {
|
|
|
cFYI(1, ("Set POSIX ACL returned %d", rc));
|
|
|
}
|
|
|
@@ -2875,13 +2883,13 @@ CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
|
|
/* BB fix tabs in this function FIXME BB */
|
|
|
int
|
|
|
CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon,
|
|
|
- const int netfid, __u64 * pExtAttrBits, __u64 *pMask)
|
|
|
+ const int netfid, __u64 * pExtAttrBits, __u64 *pMask)
|
|
|
{
|
|
|
- int rc = 0;
|
|
|
- struct smb_t2_qfi_req *pSMB = NULL;
|
|
|
- struct smb_t2_qfi_rsp *pSMBr = NULL;
|
|
|
- int bytes_returned;
|
|
|
- __u16 params, byte_count;
|
|
|
+ int rc = 0;
|
|
|
+ struct smb_t2_qfi_req *pSMB = NULL;
|
|
|
+ struct smb_t2_qfi_rsp *pSMBr = NULL;
|
|
|
+ int bytes_returned;
|
|
|
+ __u16 params, byte_count;
|
|
|
|
|
|
cFYI(1, ("In GetExtAttr"));
|
|
|
if (tcon == NULL)
|
|
|
@@ -2965,7 +2973,7 @@ static const struct cifs_sid sid_user =
|
|
|
{1, 2 , {0, 0, 0, 0, 0, 5}, {32, 545, 0, 0}};
|
|
|
|
|
|
/* 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;
|
|
|
}
|
|
|
@@ -2973,7 +2981,7 @@ static int parse_sec_desc(struct cifs_sid * psec_desc, int acl_len)
|
|
|
/* Get Security Descriptor (by handle) from remote server for a file or dir */
|
|
|
int
|
|
|
CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid,
|
|
|
- /* BB fix up return info */ char *acl_inf, const int buflen,
|
|
|
+ /* BB fix up return info */ char *acl_inf, const int buflen,
|
|
|
const int acl_type /* ACCESS/DEFAULT not sure implication */)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
@@ -2983,7 +2991,7 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid,
|
|
|
|
|
|
cFYI(1, ("GetCifsACL"));
|
|
|
|
|
|
- rc = smb_init_ntransact(NT_TRANSACT_QUERY_SECURITY_DESC, 0,
|
|
|
+ rc = smb_init_ntransact(NT_TRANSACT_QUERY_SECURITY_DESC, 0,
|
|
|
8 /* parm len */, tcon, (void **) &pSMB);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
@@ -3004,23 +3012,23 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid,
|
|
|
if (rc) {
|
|
|
cFYI(1, ("Send error in QuerySecDesc = %d", rc));
|
|
|
} else { /* decode response */
|
|
|
- struct cifs_sid * psec_desc;
|
|
|
+ struct cifs_sid *psec_desc;
|
|
|
__le32 * parm;
|
|
|
int parm_len;
|
|
|
int data_len;
|
|
|
int acl_len;
|
|
|
- struct smb_com_ntransact_rsp * pSMBr;
|
|
|
+ struct smb_com_ntransact_rsp *pSMBr;
|
|
|
|
|
|
/* validate_nttransact */
|
|
|
- rc = validate_ntransact(iov[0].iov_base, (char **)&parm,
|
|
|
+ rc = validate_ntransact(iov[0].iov_base, (char **)&parm,
|
|
|
(char **)&psec_desc,
|
|
|
&parm_len, &data_len);
|
|
|
-
|
|
|
if (rc)
|
|
|
goto qsec_out;
|
|
|
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) {
|
|
|
rc = -EIO; /* bad smb */
|
|
|
@@ -3046,9 +3054,9 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid,
|
|
|
/* Legacy Query Path Information call for lookup to old servers such
|
|
|
as Win9x/WinME */
|
|
|
int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon,
|
|
|
- const unsigned char *searchName,
|
|
|
- FILE_ALL_INFO * pFinfo,
|
|
|
- const struct nls_table *nls_codepage, int remap)
|
|
|
+ const unsigned char *searchName,
|
|
|
+ FILE_ALL_INFO *pFinfo,
|
|
|
+ const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
QUERY_INFORMATION_REQ * pSMB;
|
|
|
QUERY_INFORMATION_RSP * pSMBr;
|
|
|
@@ -3056,31 +3064,31 @@ int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon,
|
|
|
int bytes_returned;
|
|
|
int name_len;
|
|
|
|
|
|
- cFYI(1, ("In SMBQPath path %s", searchName));
|
|
|
+ cFYI(1, ("In SMBQPath path %s", searchName));
|
|
|
QInfRetry:
|
|
|
rc = smb_init(SMB_COM_QUERY_INFORMATION, 0, tcon, (void **) &pSMB,
|
|
|
- (void **) &pSMBr);
|
|
|
+ (void **) &pSMBr);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
- PATH_MAX, nls_codepage, remap);
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
+ PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
- } else {
|
|
|
+ } else {
|
|
|
name_len = strnlen(searchName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->FileName, searchName, name_len);
|
|
|
}
|
|
|
pSMB->BufferFormat = 0x04;
|
|
|
- name_len++; /* account for buffer type byte */
|
|
|
+ name_len++; /* account for buffer type byte */
|
|
|
pSMB->hdr.smb_buf_length += (__u16) name_len;
|
|
|
pSMB->ByteCount = cpu_to_le16(name_len);
|
|
|
|
|
|
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) {
|
|
|
cFYI(1, ("Send error in QueryInfo = %d", rc));
|
|
|
} else if (pFinfo) { /* decode response */
|
|
|
@@ -3137,17 +3145,17 @@ CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(searchName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
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->MaxParameterCount = cpu_to_le16(2);
|
|
|
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,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
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->DataOffset = 0;
|
|
|
pSMB->SetupCount = 1;
|
|
|
@@ -3183,11 +3191,12 @@ CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
if (rc) /* BB add auto retry on EOPNOTSUPP? */
|
|
|
rc = -EIO;
|
|
|
- else if (!legacy && (pSMBr->ByteCount < 40))
|
|
|
+ else if (!legacy && (pSMBr->ByteCount < 40))
|
|
|
rc = -EIO; /* bad smb */
|
|
|
else if (legacy && (pSMBr->ByteCount < 24))
|
|
|
- rc = -EIO; /* 24 or 26 expected but we do not read last field */
|
|
|
- else if (pFindData){
|
|
|
+ rc = -EIO; /* 24 or 26 expected but we do not read
|
|
|
+ last field */
|
|
|
+ else if (pFindData) {
|
|
|
int size;
|
|
|
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
|
|
|
if (legacy) /* we do not read the last field, EAsize,
|
|
|
@@ -3237,24 +3246,24 @@ CIFSSMBUnixQPathInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(searchName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
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->MaxParameterCount = cpu_to_le16(2);
|
|
|
/* BB find exact max SMB PDU from sess structure BB */
|
|
|
- pSMB->MaxDataCount = cpu_to_le16(4000);
|
|
|
+ pSMB->MaxDataCount = cpu_to_le16(4000);
|
|
|
pSMB->MaxSetupCount = 0;
|
|
|
pSMB->Reserved = 0;
|
|
|
pSMB->Flags = 0;
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
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->DataOffset = 0;
|
|
|
pSMB->SetupCount = 1;
|
|
|
@@ -3314,12 +3323,11 @@ int CIFSFindSingle(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, PATH_MAX
|
|
|
- /* find define for this maxpathcomponent */
|
|
|
- , nls_codepage);
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
+ PATH_MAX, nls_codepage);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(searchName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->FileName, searchName, name_len);
|
|
|
@@ -3335,7 +3343,7 @@ int CIFSFindSingle(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
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->DataOffset = 0;
|
|
|
pSMB->SetupCount = 1; /* one byte, no need to le convert */
|
|
|
@@ -3375,10 +3383,10 @@ int CIFSFindSingle(const int xid, struct cifsTconInfo *tcon,
|
|
|
/* xid, tcon, searchName and codepage are input parms, rest are returned */
|
|
|
int
|
|
|
CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
|
|
|
- const char *searchName,
|
|
|
+ const char *searchName,
|
|
|
const struct nls_table *nls_codepage,
|
|
|
- __u16 * pnetfid,
|
|
|
- struct cifs_search_info * psrch_inf, int remap, const char dirsep)
|
|
|
+ __u16 *pnetfid,
|
|
|
+ struct cifs_search_info *psrch_inf, int remap, const char dirsep)
|
|
|
{
|
|
|
/* level 257 SMB_ */
|
|
|
TRANSACTION2_FFIRST_REQ *pSMB = NULL;
|
|
|
@@ -3389,7 +3397,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
|
|
|
int name_len;
|
|
|
__u16 params, byte_count;
|
|
|
|
|
|
- cFYI(1, ("In FindFirst for %s",searchName));
|
|
|
+ cFYI(1, ("In FindFirst for %s", searchName));
|
|
|
|
|
|
findFirstRetry:
|
|
|
rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB,
|
|
|
@@ -3399,7 +3407,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->FileName,searchName,
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
/* We can not add the asterik earlier in case
|
|
|
it got remapped to 0xF03A as if it were part of the
|
|
|
@@ -3449,8 +3457,8 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->SearchAttributes =
|
|
|
cpu_to_le16(ATTR_READONLY | ATTR_HIDDEN | ATTR_SYSTEM |
|
|
|
ATTR_DIRECTORY);
|
|
|
- pSMB->SearchCount= cpu_to_le16(CIFSMaxBufSize/sizeof(FILE_UNIX_INFO));
|
|
|
- pSMB->SearchFlags = cpu_to_le16(CIFS_SEARCH_CLOSE_AT_END |
|
|
|
+ pSMB->SearchCount = cpu_to_le16(CIFSMaxBufSize/sizeof(FILE_UNIX_INFO));
|
|
|
+ pSMB->SearchFlags = cpu_to_le16(CIFS_SEARCH_CLOSE_AT_END |
|
|
|
CIFS_SEARCH_RETURN_RESUME);
|
|
|
pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level);
|
|
|
|
|
|
@@ -3485,8 +3493,8 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
psrch_inf->ntwrk_buf_start = (char *)pSMBr;
|
|
|
psrch_inf->smallBuf = 0;
|
|
|
- psrch_inf->srch_entries_start =
|
|
|
- (char *) &pSMBr->hdr.Protocol +
|
|
|
+ psrch_inf->srch_entries_start =
|
|
|
+ (char *) &pSMBr->hdr.Protocol +
|
|
|
le16_to_cpu(pSMBr->t2.DataOffset);
|
|
|
parms = (T2_FFIRST_RSP_PARMS *)((char *) &pSMBr->hdr.Protocol +
|
|
|
le16_to_cpu(pSMBr->t2.ParameterOffset));
|
|
|
@@ -3496,7 +3504,8 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
|
|
|
else
|
|
|
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->entries_in_buffer;
|
|
|
*pnetfid = parms->SearchHandle;
|
|
|
@@ -3509,7 +3518,7 @@ CIFSFindFirst(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_RSP *pSMBr = NULL;
|
|
|
@@ -3529,12 +3538,13 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
|
|
|
if (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;
|
|
|
pSMB->TotalDataCount = 0; /* no EAs */
|
|
|
pSMB->MaxParameterCount = cpu_to_le16(8);
|
|
|
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->Reserved = 0;
|
|
|
pSMB->Flags = 0;
|
|
|
@@ -3581,19 +3591,19 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->ParameterCount = pSMB->TotalParameterCount;
|
|
|
pSMB->hdr.smb_buf_length += byte_count;
|
|
|
pSMB->ByteCount = cpu_to_le16(byte_count);
|
|
|
-
|
|
|
+
|
|
|
rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
|
|
|
(struct smb_hdr *) pSMBr, &bytes_returned, 0);
|
|
|
cifs_stats_inc(&tcon->num_fnext);
|
|
|
if (rc) {
|
|
|
if (rc == -EBADF) {
|
|
|
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
|
|
|
cFYI(1, ("FindNext returned = %d", rc));
|
|
|
} else { /* decode response */
|
|
|
rc = validate_t2((struct smb_t2_rsp *)pSMBr);
|
|
|
-
|
|
|
+
|
|
|
if (rc == 0) {
|
|
|
/* BB fixme add lock for file (srch_info) struct here */
|
|
|
if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE)
|
|
|
@@ -3617,11 +3627,12 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
|
|
|
psrch_inf->endOfSearch = TRUE;
|
|
|
else
|
|
|
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 +=
|
|
|
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 */
|
|
|
}
|
|
|
@@ -3636,12 +3647,12 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
|
|
|
FNext2_err_exit:
|
|
|
if (rc != 0)
|
|
|
cifs_buf_release(pSMB);
|
|
|
-
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-CIFSFindClose(const int xid, struct cifsTconInfo *tcon, const __u16 searchHandle)
|
|
|
+CIFSFindClose(const int xid, struct cifsTconInfo *tcon,
|
|
|
+ const __u16 searchHandle)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
FINDCLOSE_REQ *pSMB = NULL;
|
|
|
@@ -3678,9 +3689,9 @@ CIFSFindClose(const int xid, struct cifsTconInfo *tcon, const __u16 searchHandle
|
|
|
|
|
|
int
|
|
|
CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
|
|
|
- const unsigned char *searchName,
|
|
|
- __u64 * inode_number,
|
|
|
- const struct nls_table *nls_codepage, int remap)
|
|
|
+ const unsigned char *searchName,
|
|
|
+ __u64 * inode_number,
|
|
|
+ const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
TRANSACTION2_QPI_REQ *pSMB = NULL;
|
|
|
@@ -3688,24 +3699,23 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
|
|
|
int name_len, bytes_returned;
|
|
|
__u16 params, byte_count;
|
|
|
|
|
|
- cFYI(1,("In GetSrvInodeNum for %s",searchName));
|
|
|
+ cFYI(1, ("In GetSrvInodeNum for %s", searchName));
|
|
|
if (tcon == NULL)
|
|
|
- return -ENODEV;
|
|
|
+ return -ENODEV;
|
|
|
|
|
|
GetInodeNumberRetry:
|
|
|
rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB,
|
|
|
- (void **) &pSMBr);
|
|
|
+ (void **) &pSMBr);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|
|
|
-
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
- PATH_MAX,nls_codepage, remap);
|
|
|
+ PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(searchName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->FileName, searchName, name_len);
|
|
|
@@ -3722,7 +3732,7 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
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->DataOffset = 0;
|
|
|
pSMB->SetupCount = 1;
|
|
|
@@ -3748,10 +3758,10 @@ CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
|
|
|
/* If rc should we check for EOPNOSUPP and
|
|
|
disable the srvino flag? or in caller? */
|
|
|
rc = -EIO; /* bad smb */
|
|
|
- else {
|
|
|
+ else {
|
|
|
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
|
|
|
__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 ? */
|
|
|
if (count < 8) {
|
|
|
cFYI(1, ("Illegal size ret in QryIntrnlInf"));
|
|
|
@@ -3780,12 +3790,12 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
|
|
|
/* TRANS2_GET_DFS_REFERRAL */
|
|
|
TRANSACTION2_GET_DFS_REFER_REQ *pSMB = 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 bytes_returned;
|
|
|
int name_len;
|
|
|
unsigned int i;
|
|
|
- char * temp;
|
|
|
+ char *temp;
|
|
|
__u16 params, byte_count;
|
|
|
*number_of_UNC_in_array = 0;
|
|
|
*targetUNCs = NULL;
|
|
|
@@ -3798,8 +3808,8 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
|
|
|
(void **) &pSMBr);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
-
|
|
|
- /* server pointer checked in called function,
|
|
|
+
|
|
|
+ /* server pointer checked in called function,
|
|
|
but should never be null here anyway */
|
|
|
pSMB->hdr.Mid = GetNextMid(ses->server);
|
|
|
pSMB->hdr.Tid = ses->ipc_tid;
|
|
|
@@ -3818,7 +3828,7 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
|
|
|
searchName, PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(searchName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->RequestFileName, searchName, name_len);
|
|
|
@@ -3830,7 +3840,7 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
|
|
|
pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
|
|
|
}
|
|
|
|
|
|
- pSMB->hdr.Uid = ses->Suid;
|
|
|
+ pSMB->hdr.Uid = ses->Suid;
|
|
|
|
|
|
params = 2 /* level */ + name_len /*includes null */ ;
|
|
|
pSMB->TotalDataCount = 0;
|
|
|
@@ -3844,7 +3854,7 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
pSMB->ParameterOffset = cpu_to_le16(offsetof(
|
|
|
- struct smb_com_transaction2_get_dfs_refer_req, MaxReferralLevel) - 4);
|
|
|
+ struct smb_com_transaction2_get_dfs_refer_req, MaxReferralLevel) - 4);
|
|
|
pSMB->SetupCount = 1;
|
|
|
pSMB->Reserved3 = 0;
|
|
|
pSMB->SubCommand = cpu_to_le16(TRANS2_GET_DFS_REFERRAL);
|
|
|
@@ -3863,26 +3873,33 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
|
|
|
/* BB Add logic to parse referrals here */
|
|
|
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 */
|
|
|
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);
|
|
|
|
|
|
cFYI(1,
|
|
|
- ("Decoding GetDFSRefer response. BCC: %d Offset %d",
|
|
|
+ ("Decoding GetDFSRefer response BCC: %d Offset %d",
|
|
|
pSMBr->ByteCount, data_offset));
|
|
|
- referrals =
|
|
|
- (struct dfs_referral_level_3 *)
|
|
|
+ referrals =
|
|
|
+ (struct dfs_referral_level_3 *)
|
|
|
(8 /* sizeof start of data block */ +
|
|
|
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",
|
|
|
- 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
|
|
|
data block so we could do safety check that DataBlock
|
|
|
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 */
|
|
|
if (*number_of_UNC_in_array > 1)
|
|
|
@@ -3890,47 +3907,51 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
|
|
|
|
|
|
/* get the length of the strings describing refs */
|
|
|
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 */
|
|
|
- __u16 offset = le16_to_cpu(referrals->DfsPathOffset);
|
|
|
+ __u16 offset =
|
|
|
+ le16_to_cpu(referrals->DfsPathOffset);
|
|
|
if (offset > data_count) {
|
|
|
- /* if invalid referral, stop here and do
|
|
|
+ /* if invalid referral, stop here and do
|
|
|
not try to copy any more */
|
|
|
*number_of_UNC_in_array = i;
|
|
|
break;
|
|
|
- }
|
|
|
+ }
|
|
|
temp = ((char *)referrals) + offset;
|
|
|
|
|
|
if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
- name_len += UniStrnlen((wchar_t *)temp,data_count);
|
|
|
+ name_len += UniStrnlen((wchar_t *)temp,
|
|
|
+ data_count);
|
|
|
} else {
|
|
|
- name_len += strnlen(temp,data_count);
|
|
|
+ name_len += strnlen(temp, data_count);
|
|
|
}
|
|
|
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 */
|
|
|
- *targetUNCs =
|
|
|
- kmalloc(name_len+1+ (*number_of_UNC_in_array),GFP_KERNEL);
|
|
|
+ *targetUNCs =
|
|
|
+ kmalloc(name_len+1+(*number_of_UNC_in_array),
|
|
|
+ GFP_KERNEL);
|
|
|
if (*targetUNCs == NULL) {
|
|
|
rc = -ENOMEM;
|
|
|
goto GetDFSRefExit;
|
|
|
}
|
|
|
/* copy the ref strings */
|
|
|
- referrals =
|
|
|
- (struct dfs_referral_level_3 *)
|
|
|
- (8 /* sizeof data hdr */ +
|
|
|
- data_offset +
|
|
|
+ referrals = (struct dfs_referral_level_3 *)
|
|
|
+ (8 /* sizeof data hdr */ + data_offset +
|
|
|
(char *) &pSMBr->hdr.Protocol);
|
|
|
|
|
|
- for(i=0;i<*number_of_UNC_in_array;i++) {
|
|
|
- temp = ((char *)referrals) + le16_to_cpu(referrals->DfsPathOffset);
|
|
|
+ for (i = 0; i < *number_of_UNC_in_array; i++) {
|
|
|
+ temp = ((char *)referrals) +
|
|
|
+ le16_to_cpu(referrals->DfsPathOffset);
|
|
|
if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
cifs_strfromUCS_le(*targetUNCs,
|
|
|
- (__le16 *) temp, name_len, nls_codepage);
|
|
|
+ (__le16 *) temp,
|
|
|
+ name_len,
|
|
|
+ nls_codepage);
|
|
|
} else {
|
|
|
- strncpy(*targetUNCs,temp,name_len);
|
|
|
+ strncpy(*targetUNCs, temp, name_len);
|
|
|
}
|
|
|
/* BB update target_uncs pointers */
|
|
|
referrals++;
|
|
|
@@ -4007,18 +4028,17 @@ SMBOldQFSInfo(const int xid, struct cifsTconInfo *tcon, struct kstatfs *FSData)
|
|
|
rc = -EIO; /* bad smb */
|
|
|
else {
|
|
|
__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));
|
|
|
|
|
|
- response_data =
|
|
|
- (FILE_SYSTEM_ALLOC_INFO *)
|
|
|
+ response_data = (FILE_SYSTEM_ALLOC_INFO *)
|
|
|
(((char *) &pSMBr->hdr.Protocol) + data_offset);
|
|
|
FSData->f_bsize =
|
|
|
le16_to_cpu(response_data->BytesPerSector) *
|
|
|
le32_to_cpu(response_data->
|
|
|
SectorsPerAllocationUnit);
|
|
|
FSData->f_blocks =
|
|
|
- le32_to_cpu(response_data->TotalAllocationUnits);
|
|
|
+ le32_to_cpu(response_data->TotalAllocationUnits);
|
|
|
FSData->f_bfree = FSData->f_bavail =
|
|
|
le32_to_cpu(response_data->FreeAllocationUnits);
|
|
|
cFYI(1,
|
|
|
@@ -4067,7 +4087,7 @@ CIFSSMBQFSInfo(const int xid, struct cifsTconInfo *tcon, struct kstatfs *FSData)
|
|
|
pSMB->TotalParameterCount = cpu_to_le16(params);
|
|
|
pSMB->ParameterCount = pSMB->TotalParameterCount;
|
|
|
pSMB->ParameterOffset = cpu_to_le16(offsetof(
|
|
|
- struct smb_com_transaction2_qfsi_req, InformationLevel) - 4);
|
|
|
+ struct smb_com_transaction2_qfsi_req, InformationLevel) - 4);
|
|
|
pSMB->DataCount = 0;
|
|
|
pSMB->DataOffset = 0;
|
|
|
pSMB->SetupCount = 1;
|
|
|
@@ -4082,7 +4102,7 @@ CIFSSMBQFSInfo(const int xid, struct cifsTconInfo *tcon, struct kstatfs *FSData)
|
|
|
if (rc) {
|
|
|
cFYI(1, ("Send error in QFSInfo = %d", rc));
|
|
|
} else { /* decode response */
|
|
|
- rc = validate_t2((struct smb_t2_rsp *)pSMBr);
|
|
|
+ rc = validate_t2((struct smb_t2_rsp *)pSMBr);
|
|
|
|
|
|
if (rc || (pSMBr->ByteCount < 24))
|
|
|
rc = -EIO; /* bad smb */
|
|
|
@@ -4147,7 +4167,7 @@ CIFSSMBQFSAttributeInfo(const int xid, struct cifsTconInfo *tcon)
|
|
|
pSMB->TotalParameterCount = cpu_to_le16(params);
|
|
|
pSMB->ParameterCount = pSMB->TotalParameterCount;
|
|
|
pSMB->ParameterOffset = cpu_to_le16(offsetof(
|
|
|
- struct smb_com_transaction2_qfsi_req, InformationLevel) - 4);
|
|
|
+ struct smb_com_transaction2_qfsi_req, InformationLevel) - 4);
|
|
|
pSMB->DataCount = 0;
|
|
|
pSMB->DataOffset = 0;
|
|
|
pSMB->SetupCount = 1;
|
|
|
@@ -4164,7 +4184,8 @@ CIFSSMBQFSAttributeInfo(const int xid, struct cifsTconInfo *tcon)
|
|
|
} else { /* decode response */
|
|
|
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 */
|
|
|
} else {
|
|
|
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
|
|
|
@@ -4215,7 +4236,7 @@ CIFSSMBQFSDeviceInfo(const int xid, struct cifsTconInfo *tcon)
|
|
|
pSMB->TotalParameterCount = cpu_to_le16(params);
|
|
|
pSMB->ParameterCount = pSMB->TotalParameterCount;
|
|
|
pSMB->ParameterOffset = cpu_to_le16(offsetof(
|
|
|
- struct smb_com_transaction2_qfsi_req, InformationLevel) - 4);
|
|
|
+ struct smb_com_transaction2_qfsi_req, InformationLevel) - 4);
|
|
|
|
|
|
pSMB->DataCount = 0;
|
|
|
pSMB->DataOffset = 0;
|
|
|
@@ -4285,8 +4306,8 @@ CIFSSMBQFSUnixInfo(const int xid, struct cifsTconInfo *tcon)
|
|
|
byte_count = params + 1 /* pad */ ;
|
|
|
pSMB->ParameterCount = cpu_to_le16(params);
|
|
|
pSMB->TotalParameterCount = pSMB->ParameterCount;
|
|
|
- pSMB->ParameterOffset = cpu_to_le16(offsetof(struct
|
|
|
- smb_com_transaction2_qfsi_req, InformationLevel) - 4);
|
|
|
+ pSMB->ParameterOffset = cpu_to_le16(offsetof(struct
|
|
|
+ smb_com_transaction2_qfsi_req, InformationLevel) - 4);
|
|
|
pSMB->SetupCount = 1;
|
|
|
pSMB->Reserved3 = 0;
|
|
|
pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION);
|
|
|
@@ -4346,7 +4367,8 @@ CIFSSMBSetFSUnixInfo(const int xid, struct cifsTconInfo *tcon, __u64 cap)
|
|
|
pSMB->Flags = 0;
|
|
|
pSMB->Timeout = 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;
|
|
|
|
|
|
pSMB->MaxParameterCount = cpu_to_le16(4);
|
|
|
@@ -4428,8 +4450,8 @@ CIFSSMBQFSPosixInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
byte_count = params + 1 /* pad */ ;
|
|
|
pSMB->ParameterCount = cpu_to_le16(params);
|
|
|
pSMB->TotalParameterCount = pSMB->ParameterCount;
|
|
|
- pSMB->ParameterOffset = cpu_to_le16(offsetof(struct
|
|
|
- smb_com_transaction2_qfsi_req, InformationLevel) - 4);
|
|
|
+ pSMB->ParameterOffset = cpu_to_le16(offsetof(struct
|
|
|
+ smb_com_transaction2_qfsi_req, InformationLevel) - 4);
|
|
|
pSMB->SetupCount = 1;
|
|
|
pSMB->Reserved3 = 0;
|
|
|
pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION);
|
|
|
@@ -4462,14 +4484,14 @@ CIFSSMBQFSPosixInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
FSData->f_bavail = FSData->f_bfree;
|
|
|
} else {
|
|
|
FSData->f_bavail =
|
|
|
- le64_to_cpu(response_data->UserBlocksAvail);
|
|
|
+ le64_to_cpu(response_data->UserBlocksAvail);
|
|
|
}
|
|
|
if (response_data->TotalFileNodes != cpu_to_le64(-1))
|
|
|
FSData->f_files =
|
|
|
- le64_to_cpu(response_data->TotalFileNodes);
|
|
|
+ le64_to_cpu(response_data->TotalFileNodes);
|
|
|
if (response_data->FreeFileNodes != cpu_to_le64(-1))
|
|
|
FSData->f_ffree =
|
|
|
- le64_to_cpu(response_data->FreeFileNodes);
|
|
|
+ le64_to_cpu(response_data->FreeFileNodes);
|
|
|
}
|
|
|
}
|
|
|
cifs_buf_release(pSMB);
|
|
|
@@ -4481,15 +4503,15 @@ CIFSSMBQFSPosixInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
}
|
|
|
|
|
|
|
|
|
-/* We can not use write of zero bytes trick to
|
|
|
- set file size due to need for large file support. Also note that
|
|
|
- this SetPathInfo is preferred to SetFileInfo based method in next
|
|
|
+/* We can not use write of zero bytes trick to
|
|
|
+ set file size due to need for large file support. Also note that
|
|
|
+ this SetPathInfo is preferred to SetFileInfo based method in next
|
|
|
routine which is only needed to work around a sharing violation bug
|
|
|
in Samba which this routine can run into */
|
|
|
|
|
|
int
|
|
|
CIFSSMBSetEOF(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
- __u64 size, int SetAllocation,
|
|
|
+ __u64 size, int SetAllocation,
|
|
|
const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
struct smb_com_transaction2_spi_req *pSMB = NULL;
|
|
|
@@ -4528,22 +4550,22 @@ CIFSSMBSetEOF(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
param_offset = offsetof(struct smb_com_transaction2_spi_req,
|
|
|
- InformationLevel) - 4;
|
|
|
+ InformationLevel) - 4;
|
|
|
offset = param_offset + params;
|
|
|
if (SetAllocation) {
|
|
|
- if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)
|
|
|
- pSMB->InformationLevel =
|
|
|
- cpu_to_le16(SMB_SET_FILE_ALLOCATION_INFO2);
|
|
|
- else
|
|
|
- pSMB->InformationLevel =
|
|
|
- cpu_to_le16(SMB_SET_FILE_ALLOCATION_INFO);
|
|
|
- } else /* Set File Size */ {
|
|
|
+ if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)
|
|
|
+ pSMB->InformationLevel =
|
|
|
+ cpu_to_le16(SMB_SET_FILE_ALLOCATION_INFO2);
|
|
|
+ else
|
|
|
+ pSMB->InformationLevel =
|
|
|
+ cpu_to_le16(SMB_SET_FILE_ALLOCATION_INFO);
|
|
|
+ } else /* Set File Size */ {
|
|
|
if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)
|
|
|
pSMB->InformationLevel =
|
|
|
- cpu_to_le16(SMB_SET_FILE_END_OF_FILE_INFO2);
|
|
|
+ cpu_to_le16(SMB_SET_FILE_END_OF_FILE_INFO2);
|
|
|
else
|
|
|
pSMB->InformationLevel =
|
|
|
- cpu_to_le16(SMB_SET_FILE_END_OF_FILE_INFO);
|
|
|
+ cpu_to_le16(SMB_SET_FILE_END_OF_FILE_INFO);
|
|
|
}
|
|
|
|
|
|
parm_data =
|
|
|
@@ -4578,8 +4600,8 @@ CIFSSMBSetEOF(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
|
|
|
- __u16 fid, __u32 pid_of_opener, int SetAllocation)
|
|
|
+CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
|
|
|
+ __u16 fid, __u32 pid_of_opener, int SetAllocation)
|
|
|
{
|
|
|
struct smb_com_transaction2_sfi_req *pSMB = NULL;
|
|
|
struct smb_com_transaction2_sfi_rsp *pSMBr = NULL;
|
|
|
@@ -4600,7 +4622,7 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
|
|
|
|
|
|
pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener);
|
|
|
pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16));
|
|
|
-
|
|
|
+
|
|
|
params = 6;
|
|
|
pSMB->MaxSetupCount = 0;
|
|
|
pSMB->Reserved = 0;
|
|
|
@@ -4610,7 +4632,7 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
|
|
|
param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4;
|
|
|
offset = param_offset + params;
|
|
|
|
|
|
- data_offset = (char *) (&pSMB->hdr.Protocol) + offset;
|
|
|
+ data_offset = (char *) (&pSMB->hdr.Protocol) + offset;
|
|
|
|
|
|
count = sizeof(struct file_end_of_file_info);
|
|
|
pSMB->MaxParameterCount = cpu_to_le16(2);
|
|
|
@@ -4625,8 +4647,8 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
|
|
|
pSMB->TotalParameterCount = pSMB->ParameterCount;
|
|
|
pSMB->ParameterOffset = cpu_to_le16(param_offset);
|
|
|
parm_data =
|
|
|
- (struct file_end_of_file_info *) (((char *) &pSMB->hdr.Protocol) +
|
|
|
- offset);
|
|
|
+ (struct file_end_of_file_info *) (((char *) &pSMB->hdr.Protocol)
|
|
|
+ + offset);
|
|
|
pSMB->DataOffset = cpu_to_le16(offset);
|
|
|
parm_data->FileSize = cpu_to_le64(size);
|
|
|
pSMB->Fid = fid;
|
|
|
@@ -4637,13 +4659,13 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
|
|
|
else
|
|
|
pSMB->InformationLevel =
|
|
|
cpu_to_le16(SMB_SET_FILE_ALLOCATION_INFO);
|
|
|
- } else /* Set File Size */ {
|
|
|
+ } else /* Set File Size */ {
|
|
|
if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)
|
|
|
pSMB->InformationLevel =
|
|
|
- cpu_to_le16(SMB_SET_FILE_END_OF_FILE_INFO2);
|
|
|
+ cpu_to_le16(SMB_SET_FILE_END_OF_FILE_INFO2);
|
|
|
else
|
|
|
pSMB->InformationLevel =
|
|
|
- cpu_to_le16(SMB_SET_FILE_END_OF_FILE_INFO);
|
|
|
+ cpu_to_le16(SMB_SET_FILE_END_OF_FILE_INFO);
|
|
|
}
|
|
|
pSMB->Reserved4 = 0;
|
|
|
pSMB->hdr.smb_buf_length += byte_count;
|
|
|
@@ -4659,21 +4681,21 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
|
|
|
if (pSMB)
|
|
|
cifs_small_buf_release(pSMB);
|
|
|
|
|
|
- /* Note: On -EAGAIN error only caller can retry on handle based calls
|
|
|
+ /* Note: On -EAGAIN error only caller can retry on handle based calls
|
|
|
since file handle passed in no longer valid */
|
|
|
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-/* Some legacy servers such as NT4 require that the file times be set on
|
|
|
+/* Some legacy servers such as NT4 require that the file times be set on
|
|
|
an open handle, rather than by pathname - this is awkward due to
|
|
|
potential access conflicts on the open, but it is unavoidable for these
|
|
|
old servers since the only other choice is to go from 100 nanosecond DCE
|
|
|
time and resort to the original setpathinfo level which takes the ancient
|
|
|
DOS time format with 2 second granularity */
|
|
|
int
|
|
|
-CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_INFO * data,
|
|
|
- __u16 fid)
|
|
|
+CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon,
|
|
|
+ const FILE_BASIC_INFO *data, __u16 fid)
|
|
|
{
|
|
|
struct smb_com_transaction2_sfi_req *pSMB = NULL;
|
|
|
struct smb_com_transaction2_sfi_rsp *pSMBr = NULL;
|
|
|
@@ -4695,7 +4717,7 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_I
|
|
|
use an existing handle (rather than opening one on the fly) */
|
|
|
/* pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener);
|
|
|
pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16));*/
|
|
|
-
|
|
|
+
|
|
|
params = 6;
|
|
|
pSMB->MaxSetupCount = 0;
|
|
|
pSMB->Reserved = 0;
|
|
|
@@ -4705,7 +4727,7 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_I
|
|
|
param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4;
|
|
|
offset = param_offset + params;
|
|
|
|
|
|
- data_offset = (char *) (&pSMB->hdr.Protocol) + offset;
|
|
|
+ data_offset = (char *) (&pSMB->hdr.Protocol) + offset;
|
|
|
|
|
|
count = sizeof (FILE_BASIC_INFO);
|
|
|
pSMB->MaxParameterCount = cpu_to_le16(2);
|
|
|
@@ -4728,16 +4750,16 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_I
|
|
|
pSMB->Reserved4 = 0;
|
|
|
pSMB->hdr.smb_buf_length += 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,
|
|
|
(struct smb_hdr *) pSMBr, &bytes_returned, 0);
|
|
|
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);
|
|
|
|
|
|
- /* Note: On -EAGAIN error only caller can retry on handle based calls
|
|
|
+ /* Note: On -EAGAIN error only caller can retry on handle based calls
|
|
|
since file handle passed in no longer valid */
|
|
|
|
|
|
return rc;
|
|
|
@@ -4746,7 +4768,7 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_I
|
|
|
|
|
|
int
|
|
|
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)
|
|
|
{
|
|
|
TRANSACTION2_SPI_REQ *pSMB = NULL;
|
|
|
@@ -4771,7 +4793,7 @@ CIFSSMBSetTimes(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(fileName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->FileName, fileName, name_len);
|
|
|
@@ -4787,7 +4809,7 @@ CIFSSMBSetTimes(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
param_offset = offsetof(struct smb_com_transaction2_spi_req,
|
|
|
- InformationLevel) - 4;
|
|
|
+ InformationLevel) - 4;
|
|
|
offset = param_offset + params;
|
|
|
data_offset = (char *) (&pSMB->hdr.Protocol) + offset;
|
|
|
pSMB->ParameterOffset = cpu_to_le16(param_offset);
|
|
|
@@ -4848,11 +4870,11 @@ CIFSSMBSetAttrLegacy(int xid, struct cifsTconInfo *tcon, char *fileName,
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- ConvertToUCS((__le16 *) pSMB->fileName, fileName,
|
|
|
+ ConvertToUCS((__le16 *) pSMB->fileName, fileName,
|
|
|
PATH_MAX, nls_codepage);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(fileName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->fileName, fileName, name_len);
|
|
|
@@ -4878,8 +4900,8 @@ CIFSSMBSetAttrLegacy(int xid, struct cifsTconInfo *tcon, char *fileName,
|
|
|
|
|
|
int
|
|
|
CIFSSMBUnixSetPerms(const int xid, struct cifsTconInfo *tcon,
|
|
|
- char *fileName, __u64 mode, __u64 uid, __u64 gid,
|
|
|
- dev_t device, const struct nls_table *nls_codepage,
|
|
|
+ char *fileName, __u64 mode, __u64 uid, __u64 gid,
|
|
|
+ dev_t device, const struct nls_table *nls_codepage,
|
|
|
int remap)
|
|
|
{
|
|
|
TRANSACTION2_SPI_REQ *pSMB = NULL;
|
|
|
@@ -4899,7 +4921,7 @@ CIFSSMBUnixSetPerms(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->FileName, fileName,
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->FileName, fileName,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
@@ -4919,7 +4941,7 @@ CIFSSMBUnixSetPerms(const int xid, struct cifsTconInfo *tcon,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
param_offset = offsetof(struct smb_com_transaction2_spi_req,
|
|
|
- InformationLevel) - 4;
|
|
|
+ InformationLevel) - 4;
|
|
|
offset = param_offset + params;
|
|
|
data_offset =
|
|
|
(FILE_UNIX_BASIC_INFO *) ((char *) &pSMB->hdr.Protocol +
|
|
|
@@ -4942,7 +4964,7 @@ CIFSSMBUnixSetPerms(const int xid, struct cifsTconInfo *tcon,
|
|
|
older clients, but we should be precise - we use SetFileSize to
|
|
|
set file size and do not want to truncate file size to zero
|
|
|
accidently as happened on one Samba server beta by putting
|
|
|
- zero instead of -1 here */
|
|
|
+ zero instead of -1 here */
|
|
|
data_offset->EndOfFile = NO_CHANGE_64;
|
|
|
data_offset->NumOfBytes = NO_CHANGE_64;
|
|
|
data_offset->LastStatusChange = NO_CHANGE_64;
|
|
|
@@ -4954,7 +4976,7 @@ CIFSSMBUnixSetPerms(const int xid, struct cifsTconInfo *tcon,
|
|
|
data_offset->DevMajor = cpu_to_le64(MAJOR(device));
|
|
|
data_offset->DevMinor = cpu_to_le64(MINOR(device));
|
|
|
data_offset->Permissions = cpu_to_le64(mode);
|
|
|
-
|
|
|
+
|
|
|
if (S_ISREG(mode))
|
|
|
data_offset->Type = cpu_to_le32(UNIX_FILE);
|
|
|
else if (S_ISDIR(mode))
|
|
|
@@ -4985,20 +5007,20 @@ CIFSSMBUnixSetPerms(const int xid, struct cifsTconInfo *tcon,
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
|
|
|
+int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
|
|
|
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)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
- struct smb_com_transaction_change_notify_req * pSMB = NULL;
|
|
|
- struct smb_com_ntransaction_change_notify_rsp * pSMBr = NULL;
|
|
|
+ struct smb_com_transaction_change_notify_req *pSMB = NULL;
|
|
|
+ struct smb_com_ntransaction_change_notify_rsp *pSMBr = NULL;
|
|
|
struct dir_notify_req *dnotify_req;
|
|
|
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,
|
|
|
- (void **) &pSMBr);
|
|
|
+ (void **) &pSMBr);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|
|
|
@@ -5032,7 +5054,7 @@ int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
|
|
|
cFYI(1, ("Error in Notify = %d", rc));
|
|
|
} else {
|
|
|
/* Add file to outstanding requests */
|
|
|
- /* BB change to kmem cache alloc */
|
|
|
+ /* BB change to kmem cache alloc */
|
|
|
dnotify_req = kmalloc(
|
|
|
sizeof(struct dir_notify_req),
|
|
|
GFP_KERNEL);
|
|
|
@@ -5047,20 +5069,20 @@ int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
|
|
|
dnotify_req->filter = filter;
|
|
|
dnotify_req->multishot = multishot;
|
|
|
spin_lock(&GlobalMid_Lock);
|
|
|
- list_add_tail(&dnotify_req->lhead,
|
|
|
+ list_add_tail(&dnotify_req->lhead,
|
|
|
&GlobalDnotifyReqList);
|
|
|
spin_unlock(&GlobalMid_Lock);
|
|
|
- } else
|
|
|
+ } else
|
|
|
rc = -ENOMEM;
|
|
|
}
|
|
|
cifs_buf_release(pSMB);
|
|
|
- return rc;
|
|
|
+ return rc;
|
|
|
}
|
|
|
#ifdef CONFIG_CIFS_XATTR
|
|
|
ssize_t
|
|
|
CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
|
|
const unsigned char *searchName,
|
|
|
- char * EAData, size_t buf_size,
|
|
|
+ char *EAData, size_t buf_size,
|
|
|
const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
/* BB assumes one setup word */
|
|
|
@@ -5069,8 +5091,8 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
|
|
int rc = 0;
|
|
|
int bytes_returned;
|
|
|
int name_len;
|
|
|
- struct fea * temp_fea;
|
|
|
- char * temp_ptr;
|
|
|
+ struct fea *temp_fea;
|
|
|
+ char *temp_ptr;
|
|
|
__u16 params, byte_count;
|
|
|
|
|
|
cFYI(1, ("In Query All EAs path %s", searchName));
|
|
|
@@ -5082,7 +5104,7 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
@@ -5092,7 +5114,7 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
|
|
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->MaxParameterCount = cpu_to_le16(2);
|
|
|
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,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
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->DataOffset = 0;
|
|
|
pSMB->SetupCount = 1;
|
|
|
@@ -5126,7 +5148,7 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
|
|
/* BB also check enough total bytes returned */
|
|
|
/* BB we need to improve the validity checking
|
|
|
of these trans2 responses */
|
|
|
- if (rc || (pSMBr->ByteCount < 4))
|
|
|
+ if (rc || (pSMBr->ByteCount < 4))
|
|
|
rc = -EIO; /* bad smb */
|
|
|
/* else if (pFindData){
|
|
|
memcpy((char *) pFindData,
|
|
|
@@ -5139,7 +5161,7 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
|
|
/* check that each element of each entry does not
|
|
|
go beyond end of list */
|
|
|
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
|
|
|
- struct fealist * ea_response_data;
|
|
|
+ struct fealist *ea_response_data;
|
|
|
rc = 0;
|
|
|
/* validate_trans2_offsets() */
|
|
|
/* BB check if start of smb + data_offset > &bcc+ bcc */
|
|
|
@@ -5147,16 +5169,16 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
|
|
(((char *) &pSMBr->hdr.Protocol) +
|
|
|
data_offset);
|
|
|
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) {
|
|
|
/* 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 {
|
|
|
/* account for ea list len */
|
|
|
name_len -= 4;
|
|
|
temp_fea = ea_response_data->list;
|
|
|
temp_ptr = (char *)temp_fea;
|
|
|
- while(name_len > 0) {
|
|
|
+ while (name_len > 0) {
|
|
|
__u16 value_len;
|
|
|
name_len -= 4;
|
|
|
temp_ptr += 4;
|
|
|
@@ -5164,10 +5186,11 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
|
|
/* account for prefix user. and trailing null */
|
|
|
rc = rc + 5 + 1;
|
|
|
if (rc < (int)buf_size) {
|
|
|
- memcpy(EAData,"user.",5);
|
|
|
- EAData+=5;
|
|
|
- memcpy(EAData,temp_ptr,temp_fea->name_len);
|
|
|
- EAData+=temp_fea->name_len;
|
|
|
+ memcpy(EAData, "user.", 5);
|
|
|
+ EAData += 5;
|
|
|
+ memcpy(EAData, temp_ptr,
|
|
|
+ temp_fea->name_len);
|
|
|
+ EAData += temp_fea->name_len;
|
|
|
/* null terminate name */
|
|
|
*EAData = 0;
|
|
|
EAData = EAData + 1;
|
|
|
@@ -5183,11 +5206,15 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
|
|
/* account for trailing null */
|
|
|
name_len--;
|
|
|
temp_ptr++;
|
|
|
- value_len = le16_to_cpu(temp_fea->value_len);
|
|
|
+ value_len =
|
|
|
+ le16_to_cpu(temp_fea->value_len);
|
|
|
name_len -= value_len;
|
|
|
temp_ptr += value_len;
|
|
|
- /* BB check that temp_ptr is still within smb BB*/
|
|
|
- /* no trailing null to account for in value len */
|
|
|
+ /* BB check that temp_ptr is still
|
|
|
+ within the SMB BB*/
|
|
|
+
|
|
|
+ /* no trailing null to account for
|
|
|
+ in value len */
|
|
|
/* go on to next EA */
|
|
|
temp_fea = (struct fea *)temp_ptr;
|
|
|
}
|
|
|
@@ -5202,9 +5229,9 @@ CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
|
|
return (ssize_t)rc;
|
|
|
}
|
|
|
|
|
|
-ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
|
|
|
- const unsigned char * searchName,const unsigned char * ea_name,
|
|
|
- unsigned char * ea_value, size_t buf_size,
|
|
|
+ssize_t CIFSSMBQueryEA(const int xid, struct cifsTconInfo *tcon,
|
|
|
+ const unsigned char *searchName, const unsigned char *ea_name,
|
|
|
+ unsigned char *ea_value, size_t buf_size,
|
|
|
const struct nls_table *nls_codepage, int remap)
|
|
|
{
|
|
|
TRANSACTION2_QPI_REQ *pSMB = NULL;
|
|
|
@@ -5212,8 +5239,8 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
|
|
|
int rc = 0;
|
|
|
int bytes_returned;
|
|
|
int name_len;
|
|
|
- struct fea * temp_fea;
|
|
|
- char * temp_ptr;
|
|
|
+ struct fea *temp_fea;
|
|
|
+ char *temp_ptr;
|
|
|
__u16 params, byte_count;
|
|
|
|
|
|
cFYI(1, ("In Query EA path %s", searchName));
|
|
|
@@ -5225,7 +5252,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->FileName, searchName,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
@@ -5235,7 +5262,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
|
|
|
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->MaxParameterCount = cpu_to_le16(2);
|
|
|
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,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
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->DataOffset = 0;
|
|
|
pSMB->SetupCount = 1;
|
|
|
@@ -5269,7 +5296,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
|
|
|
/* BB also check enough total bytes returned */
|
|
|
/* BB we need to improve the validity checking
|
|
|
of these trans2 responses */
|
|
|
- if (rc || (pSMBr->ByteCount < 4))
|
|
|
+ if (rc || (pSMBr->ByteCount < 4))
|
|
|
rc = -EIO; /* bad smb */
|
|
|
/* else if (pFindData){
|
|
|
memcpy((char *) pFindData,
|
|
|
@@ -5282,7 +5309,7 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
|
|
|
/* check that each element of each entry does not
|
|
|
go beyond end of list */
|
|
|
__u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
|
|
|
- struct fealist * ea_response_data;
|
|
|
+ struct fealist *ea_response_data;
|
|
|
rc = -ENODATA;
|
|
|
/* validate_trans2_offsets() */
|
|
|
/* BB check if start of smb + data_offset > &bcc+ bcc*/
|
|
|
@@ -5290,10 +5317,10 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
|
|
|
(((char *) &pSMBr->hdr.Protocol) +
|
|
|
data_offset);
|
|
|
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) {
|
|
|
/* 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 {
|
|
|
/* account for ea list len */
|
|
|
name_len -= 4;
|
|
|
@@ -5301,13 +5328,14 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
|
|
|
temp_ptr = (char *)temp_fea;
|
|
|
/* loop through checking if we have a matching
|
|
|
name and then return the associated value */
|
|
|
- while(name_len > 0) {
|
|
|
+ while (name_len > 0) {
|
|
|
__u16 value_len;
|
|
|
name_len -= 4;
|
|
|
temp_ptr += 4;
|
|
|
- value_len = le16_to_cpu(temp_fea->value_len);
|
|
|
- /* BB validate that value_len falls within SMB,
|
|
|
- even though maximum for name_len is 255 */
|
|
|
+ value_len =
|
|
|
+ le16_to_cpu(temp_fea->value_len);
|
|
|
+ /* BB validate that value_len falls within SMB,
|
|
|
+ even though maximum for name_len is 255 */
|
|
|
if (memcmp(temp_fea->name, ea_name,
|
|
|
temp_fea->name_len) == 0) {
|
|
|
/* found a match */
|
|
|
@@ -5317,12 +5345,13 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
|
|
|
memcpy(ea_value,
|
|
|
temp_fea->name+temp_fea->name_len+1,
|
|
|
rc);
|
|
|
- /* ea values, unlike ea names,
|
|
|
- are not null terminated */
|
|
|
+ /* ea values, unlike ea
|
|
|
+ names, are not null
|
|
|
+ terminated */
|
|
|
} else if (buf_size == 0) {
|
|
|
/* skip copy - calc size only */
|
|
|
} else {
|
|
|
- /* stop before overrun buffer */
|
|
|
+ /* stop before overrun buffer */
|
|
|
rc = -ERANGE;
|
|
|
}
|
|
|
break;
|
|
|
@@ -5334,11 +5363,11 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
|
|
|
temp_ptr++;
|
|
|
name_len -= value_len;
|
|
|
temp_ptr += value_len;
|
|
|
- /* no trailing null to account for in value len */
|
|
|
- /* go on to next EA */
|
|
|
+ /* No trailing null to account for in
|
|
|
+ value_len. Go on to next EA */
|
|
|
temp_fea = (struct fea *)temp_ptr;
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
if (pSMB)
|
|
|
@@ -5351,9 +5380,9 @@ ssize_t CIFSSMBQueryEA(const int xid,struct cifsTconInfo * tcon,
|
|
|
|
|
|
int
|
|
|
CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
- const char * ea_name, const void * ea_value,
|
|
|
- const __u16 ea_value_len, const struct nls_table *nls_codepage,
|
|
|
- int remap)
|
|
|
+ const char *ea_name, const void *ea_value,
|
|
|
+ const __u16 ea_value_len, const struct nls_table *nls_codepage,
|
|
|
+ int remap)
|
|
|
{
|
|
|
struct smb_com_transaction2_spi_req *pSMB = NULL;
|
|
|
struct smb_com_transaction2_spi_rsp *pSMBr = NULL;
|
|
|
@@ -5372,11 +5401,11 @@ CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
|
|
|
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
|
|
name_len =
|
|
|
- cifsConvertToUCS((__le16 *) pSMB->FileName, fileName,
|
|
|
+ cifsConvertToUCS((__le16 *) pSMB->FileName, fileName,
|
|
|
PATH_MAX, nls_codepage, remap);
|
|
|
name_len++; /* trailing null */
|
|
|
name_len *= 2;
|
|
|
- } else { /* BB improve the check for buffer overruns BB */
|
|
|
+ } else { /* BB improve the check for buffer overruns BB */
|
|
|
name_len = strnlen(fileName, PATH_MAX);
|
|
|
name_len++; /* trailing null */
|
|
|
strncpy(pSMB->FileName, fileName, name_len);
|
|
|
@@ -5390,7 +5419,7 @@ CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
if (ea_name == NULL)
|
|
|
name_len = 0;
|
|
|
else
|
|
|
- name_len = strnlen(ea_name,255);
|
|
|
+ name_len = strnlen(ea_name, 255);
|
|
|
|
|
|
count = sizeof(*parm_data) + ea_value_len + name_len + 1;
|
|
|
pSMB->MaxParameterCount = cpu_to_le16(2);
|
|
|
@@ -5401,7 +5430,7 @@ CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
pSMB->Timeout = 0;
|
|
|
pSMB->Reserved2 = 0;
|
|
|
param_offset = offsetof(struct smb_com_transaction2_spi_req,
|
|
|
- InformationLevel) - 4;
|
|
|
+ InformationLevel) - 4;
|
|
|
offset = param_offset + params;
|
|
|
pSMB->InformationLevel =
|
|
|
cpu_to_le16(SMB_SET_FILE_EA);
|
|
|
@@ -5422,16 +5451,18 @@ CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, const char *fileName,
|
|
|
parm_data->list[0].name_len = (__u8)name_len;
|
|
|
/* EA names are always ASCII */
|
|
|
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].value_len = cpu_to_le16(ea_value_len);
|
|
|
/* caller ensures that ea_value_len is less than 64K but
|
|
|
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)
|
|
|
- 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->ParameterCount = cpu_to_le16(params);
|