mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-03-01 13:33:34 +07:00
[CIFS] Various minor bigendian fixes and sparse level 2 warning message fixes
Most important of these fixes mapchars on bigendian and a few statfs fields Signed-off-by: Shaggy (shaggy@austin.ibm.com) Signed-off-by: Steve French (sfrench@us.ibm.com)
This commit is contained in:
parent
2096243885
commit
70ca734a14
@ -4,7 +4,8 @@ Fix readdir caching when unlink removes file in current search buffer,
|
|||||||
and this is followed by a rewind search to just before the deleted entry.
|
and this is followed by a rewind search to just before the deleted entry.
|
||||||
Do not attempt to set ctime unless atime and/or mtime change requested
|
Do not attempt to set ctime unless atime and/or mtime change requested
|
||||||
(most servers throw it away anyway). Fix length check of received smbs
|
(most servers throw it away anyway). Fix length check of received smbs
|
||||||
to be more accurate.
|
to be more accurate. Fix big endian problem with mapchars mount option,
|
||||||
|
and with a field returned by statfs.
|
||||||
|
|
||||||
Version 1.36
|
Version 1.36
|
||||||
------------
|
------------
|
||||||
|
@ -697,7 +697,7 @@ typedef struct smb_com_openx_req {
|
|||||||
__le32 EndOfFile;
|
__le32 EndOfFile;
|
||||||
__le32 Timeout;
|
__le32 Timeout;
|
||||||
__le32 Reserved;
|
__le32 Reserved;
|
||||||
__u16 ByteCount; /* file name follows */
|
__le16 ByteCount; /* file name follows */
|
||||||
char fileName[1];
|
char fileName[1];
|
||||||
} OPENX_REQ;
|
} OPENX_REQ;
|
||||||
|
|
||||||
|
@ -56,6 +56,7 @@ extern int checkSMB(struct smb_hdr *smb, __u16 mid, int length);
|
|||||||
extern int is_valid_oplock_break(struct smb_hdr *smb);
|
extern int is_valid_oplock_break(struct smb_hdr *smb);
|
||||||
extern int is_size_safe_to_change(struct cifsInodeInfo *);
|
extern int is_size_safe_to_change(struct cifsInodeInfo *);
|
||||||
extern unsigned int smbCalcSize(struct smb_hdr *ptr);
|
extern unsigned int smbCalcSize(struct smb_hdr *ptr);
|
||||||
|
extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr);
|
||||||
extern int decode_negTokenInit(unsigned char *security_blob, int length,
|
extern int decode_negTokenInit(unsigned char *security_blob, int length,
|
||||||
enum securityEnum *secType);
|
enum securityEnum *secType);
|
||||||
extern int cifs_inet_pton(int, char * source, void *dst);
|
extern int cifs_inet_pton(int, char * source, void *dst);
|
||||||
|
@ -779,7 +779,7 @@ SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
|
|||||||
/* BB FIXME END BB */
|
/* BB FIXME END BB */
|
||||||
|
|
||||||
pSMB->Sattr = cpu_to_le16(ATTR_HIDDEN | ATTR_SYSTEM | ATTR_DIRECTORY);
|
pSMB->Sattr = cpu_to_le16(ATTR_HIDDEN | ATTR_SYSTEM | ATTR_DIRECTORY);
|
||||||
pSMB->OpenFunction = convert_disposition(openDisposition);
|
pSMB->OpenFunction = cpu_to_le16(convert_disposition(openDisposition));
|
||||||
count += name_len;
|
count += name_len;
|
||||||
pSMB->hdr.smb_buf_length += count;
|
pSMB->hdr.smb_buf_length += count;
|
||||||
|
|
||||||
@ -808,10 +808,12 @@ SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
|
|||||||
pfile_info->LastAccessTime = 0; /* BB fixme */
|
pfile_info->LastAccessTime = 0; /* BB fixme */
|
||||||
pfile_info->LastWriteTime = 0; /* BB fixme */
|
pfile_info->LastWriteTime = 0; /* BB fixme */
|
||||||
pfile_info->ChangeTime = 0; /* BB fixme */
|
pfile_info->ChangeTime = 0; /* BB fixme */
|
||||||
pfile_info->Attributes = pSMBr->FileAttributes;
|
pfile_info->Attributes =
|
||||||
|
cpu_to_le32(le16_to_cpu(pSMBr->FileAttributes));
|
||||||
/* the file_info buf is endian converted by caller */
|
/* the file_info buf is endian converted by caller */
|
||||||
pfile_info->AllocationSize = pSMBr->EndOfFile;
|
pfile_info->AllocationSize =
|
||||||
pfile_info->EndOfFile = pSMBr->EndOfFile;
|
cpu_to_le64(le32_to_cpu(pSMBr->EndOfFile));
|
||||||
|
pfile_info->EndOfFile = pfile_info->AllocationSize;
|
||||||
pfile_info->NumberOfLinks = cpu_to_le32(1);
|
pfile_info->NumberOfLinks = cpu_to_le32(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2390,9 +2392,11 @@ int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon,
|
|||||||
cFYI(1, ("Send error in QueryInfo = %d", rc));
|
cFYI(1, ("Send error in QueryInfo = %d", rc));
|
||||||
} else if (pFinfo) { /* decode response */
|
} else if (pFinfo) { /* decode response */
|
||||||
memset(pFinfo, 0, sizeof(FILE_ALL_INFO));
|
memset(pFinfo, 0, sizeof(FILE_ALL_INFO));
|
||||||
pFinfo->AllocationSize = (__le64) pSMBr->size;
|
pFinfo->AllocationSize =
|
||||||
pFinfo->EndOfFile = (__le64) pSMBr->size;
|
cpu_to_le64(le32_to_cpu(pSMBr->size));
|
||||||
pFinfo->Attributes = (__le32) pSMBr->attr;
|
pFinfo->EndOfFile = pFinfo->AllocationSize;
|
||||||
|
pFinfo->Attributes =
|
||||||
|
cpu_to_le32(le16_to_cpu(pSMBr->attr));
|
||||||
} else
|
} else
|
||||||
rc = -EIO; /* bad buffer passed in */
|
rc = -EIO; /* bad buffer passed in */
|
||||||
|
|
||||||
@ -3722,16 +3726,16 @@ CIFSSMBQFSPosixInfo(const int xid, struct cifsTconInfo *tcon,
|
|||||||
le64_to_cpu(response_data->TotalBlocks);
|
le64_to_cpu(response_data->TotalBlocks);
|
||||||
FSData->f_bfree =
|
FSData->f_bfree =
|
||||||
le64_to_cpu(response_data->BlocksAvail);
|
le64_to_cpu(response_data->BlocksAvail);
|
||||||
if(response_data->UserBlocksAvail == -1) {
|
if(response_data->UserBlocksAvail == cpu_to_le64(-1)) {
|
||||||
FSData->f_bavail = FSData->f_bfree;
|
FSData->f_bavail = FSData->f_bfree;
|
||||||
} else {
|
} else {
|
||||||
FSData->f_bavail =
|
FSData->f_bavail =
|
||||||
le64_to_cpu(response_data->UserBlocksAvail);
|
le64_to_cpu(response_data->UserBlocksAvail);
|
||||||
}
|
}
|
||||||
if(response_data->TotalFileNodes != -1)
|
if(response_data->TotalFileNodes != cpu_to_le64(-1))
|
||||||
FSData->f_files =
|
FSData->f_files =
|
||||||
le64_to_cpu(response_data->TotalFileNodes);
|
le64_to_cpu(response_data->TotalFileNodes);
|
||||||
if(response_data->FreeFileNodes != -1)
|
if(response_data->FreeFileNodes != cpu_to_le64(-1))
|
||||||
FSData->f_ffree =
|
FSData->f_ffree =
|
||||||
le64_to_cpu(response_data->FreeFileNodes);
|
le64_to_cpu(response_data->FreeFileNodes);
|
||||||
}
|
}
|
||||||
|
@ -303,12 +303,12 @@ static int coalesce_t2(struct smb_hdr * psecond, struct smb_hdr *pTargetSMB)
|
|||||||
byte_count += total_in_buf2;
|
byte_count += total_in_buf2;
|
||||||
BCC_LE(pTargetSMB) = cpu_to_le16(byte_count);
|
BCC_LE(pTargetSMB) = cpu_to_le16(byte_count);
|
||||||
|
|
||||||
byte_count = be32_to_cpu(pTargetSMB->smb_buf_length);
|
byte_count = pTargetSMB->smb_buf_length;
|
||||||
byte_count += total_in_buf2;
|
byte_count += total_in_buf2;
|
||||||
|
|
||||||
/* BB also add check that we are not beyond maximum buffer size */
|
/* BB also add check that we are not beyond maximum buffer size */
|
||||||
|
|
||||||
pTargetSMB->smb_buf_length = cpu_to_be32(byte_count);
|
pTargetSMB->smb_buf_length = byte_count;
|
||||||
|
|
||||||
if(remaining == total_in_buf2) {
|
if(remaining == total_in_buf2) {
|
||||||
cFYI(1,("found the last secondary response"));
|
cFYI(1,("found the last secondary response"));
|
||||||
@ -333,7 +333,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
|
|||||||
struct cifsSesInfo *ses;
|
struct cifsSesInfo *ses;
|
||||||
struct task_struct *task_to_wake = NULL;
|
struct task_struct *task_to_wake = NULL;
|
||||||
struct mid_q_entry *mid_entry;
|
struct mid_q_entry *mid_entry;
|
||||||
char *temp;
|
char temp;
|
||||||
int isLargeBuf = FALSE;
|
int isLargeBuf = FALSE;
|
||||||
int isMultiRsp;
|
int isMultiRsp;
|
||||||
int reconnect;
|
int reconnect;
|
||||||
@ -435,22 +435,32 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the right amount was read from socket - 4 bytes */
|
/* The right amount was read from socket - 4 bytes */
|
||||||
|
/* so we can now interpret the length field */
|
||||||
|
|
||||||
|
/* the first byte big endian of the length field,
|
||||||
|
is actually not part of the length but the type
|
||||||
|
with the most common, zero, as regular data */
|
||||||
|
temp = *((char *) smb_buffer);
|
||||||
|
|
||||||
|
/* Note that FC 1001 length is big endian on the wire,
|
||||||
|
but we convert it here so it is always manipulated
|
||||||
|
as host byte order */
|
||||||
pdu_length = ntohl(smb_buffer->smb_buf_length);
|
pdu_length = ntohl(smb_buffer->smb_buf_length);
|
||||||
cFYI(1,("rfc1002 length(big endian)0x%x)", pdu_length+4));
|
smb_buffer->smb_buf_length = pdu_length;
|
||||||
|
|
||||||
temp = (char *) smb_buffer;
|
cFYI(1,("rfc1002 length 0x%x)", pdu_length+4));
|
||||||
if (temp[0] == (char) RFC1002_SESSION_KEEP_ALIVE) {
|
|
||||||
|
if (temp == (char) RFC1002_SESSION_KEEP_ALIVE) {
|
||||||
continue;
|
continue;
|
||||||
} else if (temp[0] == (char)RFC1002_POSITIVE_SESSION_RESPONSE) {
|
} else if (temp == (char)RFC1002_POSITIVE_SESSION_RESPONSE) {
|
||||||
cFYI(1,("Good RFC 1002 session rsp"));
|
cFYI(1,("Good RFC 1002 session rsp"));
|
||||||
continue;
|
continue;
|
||||||
} else if (temp[0] == (char)RFC1002_NEGATIVE_SESSION_RESPONSE) {
|
} else if (temp == (char)RFC1002_NEGATIVE_SESSION_RESPONSE) {
|
||||||
/* we get this from Windows 98 instead of
|
/* we get this from Windows 98 instead of
|
||||||
an error on SMB negprot response */
|
an error on SMB negprot response */
|
||||||
cFYI(1,("Negative RFC1002 Session Response Error 0x%x)",
|
cFYI(1,("Negative RFC1002 Session Response Error 0x%x)",
|
||||||
temp[4]));
|
pdu_length));
|
||||||
if(server->tcpStatus == CifsNew) {
|
if(server->tcpStatus == CifsNew) {
|
||||||
/* if nack on negprot (rather than
|
/* if nack on negprot (rather than
|
||||||
ret of smb negprot error) reconnecting
|
ret of smb negprot error) reconnecting
|
||||||
@ -472,9 +482,10 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
|
|||||||
wake_up(&server->response_q);
|
wake_up(&server->response_q);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if (temp[0] != (char) 0) {
|
} else if (temp != (char) 0) {
|
||||||
cERROR(1,("Unknown RFC 1002 frame"));
|
cERROR(1,("Unknown RFC 1002 frame"));
|
||||||
cifs_dump_mem(" Received Data: ", temp, length);
|
cifs_dump_mem(" Received Data: ", (char *)smb_buffer,
|
||||||
|
length);
|
||||||
cifs_reconnect(server);
|
cifs_reconnect(server);
|
||||||
csocket = server->ssocket;
|
csocket = server->ssocket;
|
||||||
continue;
|
continue;
|
||||||
@ -609,7 +620,8 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
|
|||||||
} else if ((is_valid_oplock_break(smb_buffer) == FALSE)
|
} else if ((is_valid_oplock_break(smb_buffer) == FALSE)
|
||||||
&& (isMultiRsp == FALSE)) {
|
&& (isMultiRsp == FALSE)) {
|
||||||
cERROR(1, ("No task to wake, unknown frame rcvd!"));
|
cERROR(1, ("No task to wake, unknown frame rcvd!"));
|
||||||
cifs_dump_mem("Received Data is: ",temp,sizeof(struct smb_hdr));
|
cifs_dump_mem("Received Data is: ",(char *)smb_buffer,
|
||||||
|
sizeof(struct smb_hdr));
|
||||||
}
|
}
|
||||||
} /* end while !EXITING */
|
} /* end while !EXITING */
|
||||||
|
|
||||||
|
@ -419,7 +419,7 @@ checkSMBhdr(struct smb_hdr *smb, __u16 mid)
|
|||||||
int
|
int
|
||||||
checkSMB(struct smb_hdr *smb, __u16 mid, int length)
|
checkSMB(struct smb_hdr *smb, __u16 mid, int length)
|
||||||
{
|
{
|
||||||
__u32 len = be32_to_cpu(smb->smb_buf_length);
|
__u32 len = smb->smb_buf_length;
|
||||||
cFYI(0,
|
cFYI(0,
|
||||||
("Entering checkSMB with Length: %x, smb_buf_length: %x ",
|
("Entering checkSMB with Length: %x, smb_buf_length: %x ",
|
||||||
length, len));
|
length, len));
|
||||||
@ -448,9 +448,9 @@ checkSMB(struct smb_hdr *smb, __u16 mid, int length)
|
|||||||
if (checkSMBhdr(smb, mid))
|
if (checkSMBhdr(smb, mid))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if ((4 + len != smbCalcSize(smb))
|
if ((4 + len != smbCalcSize_LE(smb))
|
||||||
|| (4 + len != (unsigned int)length)) {
|
|| (4 + len != (unsigned int)length)) {
|
||||||
cERROR(1, ("smbCalcSize %x ", smbCalcSize(smb)));
|
cERROR(1, ("smbCalcSize %x ", smbCalcSize_LE(smb)));
|
||||||
cERROR(1,
|
cERROR(1,
|
||||||
("bad smb size detected. The Mid=%d", smb->Mid));
|
("bad smb size detected. The Mid=%d", smb->Mid));
|
||||||
return 1;
|
return 1;
|
||||||
@ -672,6 +672,7 @@ cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
|
|||||||
int i,j,charlen;
|
int i,j,charlen;
|
||||||
int len_remaining = maxlen;
|
int len_remaining = maxlen;
|
||||||
char src_char;
|
char src_char;
|
||||||
|
__u16 temp;
|
||||||
|
|
||||||
if(!mapChars)
|
if(!mapChars)
|
||||||
return cifs_strtoUCS((wchar_t *) target, source, PATH_MAX, cp);
|
return cifs_strtoUCS((wchar_t *) target, source, PATH_MAX, cp);
|
||||||
@ -708,13 +709,14 @@ cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
|
|||||||
break;*/
|
break;*/
|
||||||
default:
|
default:
|
||||||
charlen = cp->char2uni(source+i,
|
charlen = cp->char2uni(source+i,
|
||||||
len_remaining, target+j);
|
len_remaining, &temp);
|
||||||
/* if no match, use question mark, which
|
/* if no match, use question mark, which
|
||||||
at least in some cases servers as wild card */
|
at least in some cases servers as wild card */
|
||||||
if(charlen < 1) {
|
if(charlen < 1) {
|
||||||
target[j] = cpu_to_le16(0x003f);
|
target[j] = cpu_to_le16(0x003f);
|
||||||
charlen = 1;
|
charlen = 1;
|
||||||
}
|
} else
|
||||||
|
target[j] = cpu_to_le16(temp);
|
||||||
len_remaining -= charlen;
|
len_remaining -= charlen;
|
||||||
/* character may take more than one byte in the
|
/* character may take more than one byte in the
|
||||||
the source string, but will take exactly two
|
the source string, but will take exactly two
|
||||||
|
@ -868,7 +868,14 @@ unsigned int
|
|||||||
smbCalcSize(struct smb_hdr *ptr)
|
smbCalcSize(struct smb_hdr *ptr)
|
||||||
{
|
{
|
||||||
return (sizeof (struct smb_hdr) + (2 * ptr->WordCount) +
|
return (sizeof (struct smb_hdr) + (2 * ptr->WordCount) +
|
||||||
2 /* size of the bcc field itself */ + BCC(ptr));
|
2 /* size of the bcc field */ + BCC(ptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
smbCalcSize_LE(struct smb_hdr *ptr)
|
||||||
|
{
|
||||||
|
return (sizeof (struct smb_hdr) + (2 * ptr->WordCount) +
|
||||||
|
2 /* size of the bcc field */ + le16_to_cpu(BCC_LE(ptr)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The following are taken from fs/ntfs/util.c */
|
/* The following are taken from fs/ntfs/util.c */
|
||||||
|
@ -414,7 +414,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
|
|||||||
spin_lock(&GlobalMid_Lock);
|
spin_lock(&GlobalMid_Lock);
|
||||||
if (midQ->resp_buf) {
|
if (midQ->resp_buf) {
|
||||||
spin_unlock(&GlobalMid_Lock);
|
spin_unlock(&GlobalMid_Lock);
|
||||||
receive_len = be32_to_cpu(*(__be32 *)midQ->resp_buf);
|
receive_len = midQ->resp_buf->smb_buf_length;
|
||||||
} else {
|
} else {
|
||||||
cERROR(1,("No response buffer"));
|
cERROR(1,("No response buffer"));
|
||||||
if(midQ->midState == MID_REQUEST_SUBMITTED) {
|
if(midQ->midState == MID_REQUEST_SUBMITTED) {
|
||||||
@ -665,7 +665,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
|
|||||||
spin_lock(&GlobalMid_Lock);
|
spin_lock(&GlobalMid_Lock);
|
||||||
if (midQ->resp_buf) {
|
if (midQ->resp_buf) {
|
||||||
spin_unlock(&GlobalMid_Lock);
|
spin_unlock(&GlobalMid_Lock);
|
||||||
receive_len = be32_to_cpu(*(__be32 *)midQ->resp_buf);
|
receive_len = midQ->resp_buf->smb_buf_length;
|
||||||
} else {
|
} else {
|
||||||
cERROR(1,("No response buffer"));
|
cERROR(1,("No response buffer"));
|
||||||
if(midQ->midState == MID_REQUEST_SUBMITTED) {
|
if(midQ->midState == MID_REQUEST_SUBMITTED) {
|
||||||
|
Loading…
Reference in New Issue
Block a user