cifs: use get/put_unaligned functions to access ByteCount
It's possible that when we access the ByteCount that the alignment will be off. Most CPUs deal with that transparently, but there's usually some performance impact. Some CPUs raise an exception on unaligned accesses. Fix this by accessing the byte count using the get_unaligned and put_unaligned inlined functions. While we're at it, fix the types of some of the variables that end up getting returns from these functions. Acked-by: Pavel Shilovsky <piastryyy@gmail.com> Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:

committed by
Steve French

parent
aae62fdb6b
commit
690c522fa5
@@ -333,7 +333,6 @@ static int validate_t2(struct smb_t2_rsp *pSMB)
|
||||
{
|
||||
int rc = -EINVAL;
|
||||
int total_size;
|
||||
char *pBCC;
|
||||
|
||||
/* check for plausible wct, bcc and t2 data and parm sizes */
|
||||
/* check for parm and data offset going beyond end of smb */
|
||||
@@ -346,13 +345,9 @@ 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) +
|
||||
sizeof(struct smb_hdr) +
|
||||
(char *)pSMB;
|
||||
if ((total_size <= (*(u16 *)pBCC)) &&
|
||||
(total_size <
|
||||
CIFSMaxBufSize+MAX_CIFS_HDR_SIZE)) {
|
||||
if (total_size <= get_bcc(&pSMB->hdr) &&
|
||||
total_size <
|
||||
CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -362,6 +357,7 @@ static int validate_t2(struct smb_t2_rsp *pSMB)
|
||||
sizeof(struct smb_t2_rsp) + 16);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
|
||||
{
|
||||
@@ -5609,7 +5605,7 @@ QAllEAsRetry:
|
||||
}
|
||||
|
||||
/* make sure list_len doesn't go past end of SMB */
|
||||
end_of_smb = (char *)pByteArea(&pSMBr->hdr) + BCC(&pSMBr->hdr);
|
||||
end_of_smb = (char *)pByteArea(&pSMBr->hdr) + get_bcc(&pSMBr->hdr);
|
||||
if ((char *)ea_response_data + list_len > end_of_smb) {
|
||||
cFYI(1, "EA list appears to go beyond SMB");
|
||||
rc = -EIO;
|
||||
|
Reference in New Issue
Block a user