Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 12054
b: refs/heads/master
c: 70ca734
h: refs/heads/master
v: v3
  • Loading branch information
Steve French committed Sep 22, 2005
1 parent 173c14c commit b5204c5
Show file tree
Hide file tree
Showing 9 changed files with 61 additions and 34 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2096243885ee34b78cb57ce835e07c8536a67d2a
refs/heads/master: 70ca734a14366b634224a1e4586d43b36b65ab67
3 changes: 2 additions & 1 deletion trunk/fs/cifs/CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -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.
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
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
------------
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/cifs/cifspdu.h
Original file line number Diff line number Diff line change
Expand Up @@ -697,7 +697,7 @@ typedef struct smb_com_openx_req {
__le32 EndOfFile;
__le32 Timeout;
__le32 Reserved;
__u16 ByteCount; /* file name follows */
__le16 ByteCount; /* file name follows */
char fileName[1];
} OPENX_REQ;

Expand Down
1 change: 1 addition & 0 deletions trunk/fs/cifs/cifsproto.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_size_safe_to_change(struct cifsInodeInfo *);
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,
enum securityEnum *secType);
extern int cifs_inet_pton(int, char * source, void *dst);
Expand Down
24 changes: 14 additions & 10 deletions trunk/fs/cifs/cifssmb.c
Original file line number Diff line number Diff line change
Expand Up @@ -779,7 +779,7 @@ SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
/* BB FIXME END BB */

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;
pSMB->hdr.smb_buf_length += count;

Expand Down Expand Up @@ -808,10 +808,12 @@ SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
pfile_info->LastAccessTime = 0; /* BB fixme */
pfile_info->LastWriteTime = 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 */
pfile_info->AllocationSize = pSMBr->EndOfFile;
pfile_info->EndOfFile = pSMBr->EndOfFile;
pfile_info->AllocationSize =
cpu_to_le64(le32_to_cpu(pSMBr->EndOfFile));
pfile_info->EndOfFile = pfile_info->AllocationSize;
pfile_info->NumberOfLinks = cpu_to_le32(1);
}
}
Expand Down Expand Up @@ -2390,9 +2392,11 @@ int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon,
cFYI(1, ("Send error in QueryInfo = %d", rc));
} else if (pFinfo) { /* decode response */
memset(pFinfo, 0, sizeof(FILE_ALL_INFO));
pFinfo->AllocationSize = (__le64) pSMBr->size;
pFinfo->EndOfFile = (__le64) pSMBr->size;
pFinfo->Attributes = (__le32) pSMBr->attr;
pFinfo->AllocationSize =
cpu_to_le64(le32_to_cpu(pSMBr->size));
pFinfo->EndOfFile = pFinfo->AllocationSize;
pFinfo->Attributes =
cpu_to_le32(le16_to_cpu(pSMBr->attr));
} else
rc = -EIO; /* bad buffer passed in */

Expand Down Expand Up @@ -3722,16 +3726,16 @@ CIFSSMBQFSPosixInfo(const int xid, struct cifsTconInfo *tcon,
le64_to_cpu(response_data->TotalBlocks);
FSData->f_bfree =
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;
} else {
FSData->f_bavail =
le64_to_cpu(response_data->UserBlocksAvail);
}
if(response_data->TotalFileNodes != -1)
if(response_data->TotalFileNodes != cpu_to_le64(-1))
FSData->f_files =
le64_to_cpu(response_data->TotalFileNodes);
if(response_data->FreeFileNodes != -1)
if(response_data->FreeFileNodes != cpu_to_le64(-1))
FSData->f_ffree =
le64_to_cpu(response_data->FreeFileNodes);
}
Expand Down
38 changes: 25 additions & 13 deletions trunk/fs/cifs/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,12 +303,12 @@ static int coalesce_t2(struct smb_hdr * psecond, struct smb_hdr *pTargetSMB)
byte_count += total_in_buf2;
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;

/* 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) {
cFYI(1,("found the last secondary response"));
Expand All @@ -333,7 +333,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
struct cifsSesInfo *ses;
struct task_struct *task_to_wake = NULL;
struct mid_q_entry *mid_entry;
char *temp;
char temp;
int isLargeBuf = FALSE;
int isMultiRsp;
int reconnect;
Expand Down Expand Up @@ -435,22 +435,32 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
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);
cFYI(1,("rfc1002 length(big endian)0x%x)", pdu_length+4));
smb_buffer->smb_buf_length = pdu_length;

cFYI(1,("rfc1002 length 0x%x)", pdu_length+4));

temp = (char *) smb_buffer;
if (temp[0] == (char) RFC1002_SESSION_KEEP_ALIVE) {
if (temp == (char) RFC1002_SESSION_KEEP_ALIVE) {
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"));
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
an error on SMB negprot response */
cFYI(1,("Negative RFC1002 Session Response Error 0x%x)",
temp[4]));
pdu_length));
if(server->tcpStatus == CifsNew) {
/* if nack on negprot (rather than
ret of smb negprot error) reconnecting
Expand All @@ -472,9 +482,10 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
wake_up(&server->response_q);
continue;
}
} else if (temp[0] != (char) 0) {
} else if (temp != (char) 0) {
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);
csocket = server->ssocket;
continue;
Expand Down Expand Up @@ -609,7 +620,8 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
} else if ((is_valid_oplock_break(smb_buffer) == FALSE)
&& (isMultiRsp == FALSE)) {
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 */

Expand Down
12 changes: 7 additions & 5 deletions trunk/fs/cifs/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ checkSMBhdr(struct smb_hdr *smb, __u16 mid)
int
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,
("Entering checkSMB with Length: %x, smb_buf_length: %x ",
length, len));
Expand Down Expand Up @@ -448,9 +448,9 @@ checkSMB(struct smb_hdr *smb, __u16 mid, int length)
if (checkSMBhdr(smb, mid))
return 1;

if ((4 + len != smbCalcSize(smb))
if ((4 + len != smbCalcSize_LE(smb))
|| (4 + len != (unsigned int)length)) {
cERROR(1, ("smbCalcSize %x ", smbCalcSize(smb)));
cERROR(1, ("smbCalcSize %x ", smbCalcSize_LE(smb)));
cERROR(1,
("bad smb size detected. The Mid=%d", smb->Mid));
return 1;
Expand Down Expand Up @@ -672,6 +672,7 @@ cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
int i,j,charlen;
int len_remaining = maxlen;
char src_char;
__u16 temp;

if(!mapChars)
return cifs_strtoUCS((wchar_t *) target, source, PATH_MAX, cp);
Expand Down Expand Up @@ -708,13 +709,14 @@ cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
break;*/
default:
charlen = cp->char2uni(source+i,
len_remaining, target+j);
len_remaining, &temp);
/* if no match, use question mark, which
at least in some cases servers as wild card */
if(charlen < 1) {
target[j] = cpu_to_le16(0x003f);
charlen = 1;
}
} else
target[j] = cpu_to_le16(temp);
len_remaining -= charlen;
/* character may take more than one byte in the
the source string, but will take exactly two
Expand Down
9 changes: 8 additions & 1 deletion trunk/fs/cifs/netmisc.c
Original file line number Diff line number Diff line change
Expand Up @@ -868,7 +868,14 @@ unsigned int
smbCalcSize(struct smb_hdr *ptr)
{
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 */
Expand Down
4 changes: 2 additions & 2 deletions trunk/fs/cifs/transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
spin_lock(&GlobalMid_Lock);
if (midQ->resp_buf) {
spin_unlock(&GlobalMid_Lock);
receive_len = be32_to_cpu(*(__be32 *)midQ->resp_buf);
receive_len = midQ->resp_buf->smb_buf_length;
} else {
cERROR(1,("No response buffer"));
if(midQ->midState == MID_REQUEST_SUBMITTED) {
Expand Down Expand Up @@ -665,7 +665,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
spin_lock(&GlobalMid_Lock);
if (midQ->resp_buf) {
spin_unlock(&GlobalMid_Lock);
receive_len = be32_to_cpu(*(__be32 *)midQ->resp_buf);
receive_len = midQ->resp_buf->smb_buf_length;
} else {
cERROR(1,("No response buffer"));
if(midQ->midState == MID_REQUEST_SUBMITTED) {
Expand Down

0 comments on commit b5204c5

Please sign in to comment.