cifs: fix length checks in checkSMB
The cERROR message in checkSMB when the calculated length doesn't match the RFC1001 length is incorrect in many cases. It always says that the RFC1001 length is bigger than the SMB, even when it's actually the reverse. Fix the error message to say the reverse of what it does now when the SMB length goes beyond the end of the received data. Also, clarify the error message when the RFC length is too big. Finally, clarify the comments to show that the 512 byte limit on extra data at the end of the packet is arbitrary. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
cab6958da0
commit
6284644e8d
@ -478,25 +478,26 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length)
|
||||
if (((4 + len) & 0xFFFF) == (clc_len & 0xFFFF))
|
||||
return 0; /* bcc wrapped */
|
||||
}
|
||||
cFYI(1, "Calculated size %d vs length %d mismatch for mid %d",
|
||||
cFYI(1, "Calculated size %u vs length %u mismatch for mid=%u",
|
||||
clc_len, 4 + len, smb->Mid);
|
||||
/* Windows XP can return a few bytes too much, presumably
|
||||
an illegal pad, at the end of byte range lock responses
|
||||
so we allow for that three byte pad, as long as actual
|
||||
received length is as long or longer than calculated length */
|
||||
/* We have now had to extend this more, since there is a
|
||||
case in which it needs to be bigger still to handle a
|
||||
malformed response to transact2 findfirst from WinXP when
|
||||
access denied is returned and thus bcc and wct are zero
|
||||
but server says length is 0x21 bytes too long as if the server
|
||||
forget to reset the smb rfc1001 length when it reset the
|
||||
wct and bcc to minimum size and drop the t2 parms and data */
|
||||
if ((4+len > clc_len) && (len <= clc_len + 512))
|
||||
return 0;
|
||||
else {
|
||||
cERROR(1, "RFC1001 size %d bigger than SMB for Mid=%d",
|
||||
|
||||
if (4 + len < clc_len) {
|
||||
cERROR(1, "RFC1001 size %u smaller than SMB for mid=%u",
|
||||
len, smb->Mid);
|
||||
return 1;
|
||||
} else if (len > clc_len + 512) {
|
||||
/*
|
||||
* Some servers (Windows XP in particular) send more
|
||||
* data than the lengths in the SMB packet would
|
||||
* indicate on certain calls (byte range locks and
|
||||
* trans2 find first calls in particular). While the
|
||||
* client can handle such a frame by ignoring the
|
||||
* trailing data, we choose limit the amount of extra
|
||||
* data to 512 bytes.
|
||||
*/
|
||||
cERROR(1, "RFC1001 size %u more than 512 bytes larger "
|
||||
"than SMB for mid=%u", len, smb->Mid);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user