diff options
| -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 */ |
