aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/cifs/misc.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
index 24f0a9d97ad8..2a930a752a78 100644
--- a/fs/cifs/misc.c
+++ b/fs/cifs/misc.c
@@ -478,25 +478,26 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length)
478 if (((4 + len) & 0xFFFF) == (clc_len & 0xFFFF)) 478 if (((4 + len) & 0xFFFF) == (clc_len & 0xFFFF))
479 return 0; /* bcc wrapped */ 479 return 0; /* bcc wrapped */
480 } 480 }
481 cFYI(1, "Calculated size %d vs length %d mismatch for mid %d", 481 cFYI(1, "Calculated size %u vs length %u mismatch for mid=%u",
482 clc_len, 4 + len, smb->Mid); 482 clc_len, 4 + len, smb->Mid);
483 /* Windows XP can return a few bytes too much, presumably 483
484 an illegal pad, at the end of byte range lock responses 484 if (4 + len < clc_len) {
485 so we allow for that three byte pad, as long as actual 485 cERROR(1, "RFC1001 size %u smaller than SMB for mid=%u",
486 received length is as long or longer than calculated length */
487 /* We have now had to extend this more, since there is a
488 case in which it needs to be bigger still to handle a
489 malformed response to transact2 findfirst from WinXP when
490 access denied is returned and thus bcc and wct are zero
491 but server says length is 0x21 bytes too long as if the server
492 forget to reset the smb rfc1001 length when it reset the
493 wct and bcc to minimum size and drop the t2 parms and data */
494 if ((4+len > clc_len) && (len <= clc_len + 512))
495 return 0;
496 else {
497 cERROR(1, "RFC1001 size %d bigger than SMB for Mid=%d",
498 len, smb->Mid); 486 len, smb->Mid);
499 return 1; 487 return 1;
488 } else if (len > clc_len + 512) {
489 /*
490 * Some servers (Windows XP in particular) send more
491 * data than the lengths in the SMB packet would
492 * indicate on certain calls (byte range locks and
493 * trans2 find first calls in particular). While the
494 * client can handle such a frame by ignoring the
495 * trailing data, we choose limit the amount of extra
496 * data to 512 bytes.
497 */
498 cERROR(1, "RFC1001 size %u more than 512 bytes larger "
499 "than SMB for mid=%u", len, smb->Mid);
500 return 1;
500 } 501 }
501 } 502 }
502 return 0; 503 return 0;