diff options
Diffstat (limited to 'fs/cifs/cifssmb.c')
-rw-r--r-- | fs/cifs/cifssmb.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index e1f90a3a0162..f213b8ae43c1 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -1518,6 +1518,14 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon, | |||
1518 | *nbytes = le16_to_cpu(pSMBr->CountHigh); | 1518 | *nbytes = le16_to_cpu(pSMBr->CountHigh); |
1519 | *nbytes = (*nbytes) << 16; | 1519 | *nbytes = (*nbytes) << 16; |
1520 | *nbytes += le16_to_cpu(pSMBr->Count); | 1520 | *nbytes += le16_to_cpu(pSMBr->Count); |
1521 | |||
1522 | /* | ||
1523 | * Mask off high 16 bits when bytes written as returned by the | ||
1524 | * server is greater than bytes requested by the client. Some | ||
1525 | * OS/2 servers are known to set incorrect CountHigh values. | ||
1526 | */ | ||
1527 | if (*nbytes > count) | ||
1528 | *nbytes &= 0xFFFF; | ||
1521 | } | 1529 | } |
1522 | 1530 | ||
1523 | cifs_buf_release(pSMB); | 1531 | cifs_buf_release(pSMB); |
@@ -1606,6 +1614,14 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon, | |||
1606 | *nbytes = le16_to_cpu(pSMBr->CountHigh); | 1614 | *nbytes = le16_to_cpu(pSMBr->CountHigh); |
1607 | *nbytes = (*nbytes) << 16; | 1615 | *nbytes = (*nbytes) << 16; |
1608 | *nbytes += le16_to_cpu(pSMBr->Count); | 1616 | *nbytes += le16_to_cpu(pSMBr->Count); |
1617 | |||
1618 | /* | ||
1619 | * Mask off high 16 bits when bytes written as returned by the | ||
1620 | * server is greater than bytes requested by the client. OS/2 | ||
1621 | * servers are known to set incorrect CountHigh values. | ||
1622 | */ | ||
1623 | if (*nbytes > count) | ||
1624 | *nbytes &= 0xFFFF; | ||
1609 | } | 1625 | } |
1610 | 1626 | ||
1611 | /* cifs_small_buf_release(pSMB); */ /* Freed earlier now in SendReceive2 */ | 1627 | /* cifs_small_buf_release(pSMB); */ /* Freed earlier now in SendReceive2 */ |