diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/cifs/cifssmb.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index ef9786b6bea4..824df142f288 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -1414,8 +1414,13 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, const int netfid, | |||
1414 | cFYI(1, ("Reading %d bytes on fid %d", count, netfid)); | 1414 | cFYI(1, ("Reading %d bytes on fid %d", count, netfid)); |
1415 | if (tcon->ses->capabilities & CAP_LARGE_FILES) | 1415 | if (tcon->ses->capabilities & CAP_LARGE_FILES) |
1416 | wct = 12; | 1416 | wct = 12; |
1417 | else | 1417 | else { |
1418 | wct = 10; /* old style read */ | 1418 | wct = 10; /* old style read */ |
1419 | if ((lseek >> 32) > 0) { | ||
1420 | /* can not handle this big offset for old */ | ||
1421 | return -EIO; | ||
1422 | } | ||
1423 | } | ||
1419 | 1424 | ||
1420 | *nbytes = 0; | 1425 | *nbytes = 0; |
1421 | rc = small_smb_init(SMB_COM_READ_ANDX, wct, tcon, (void **) &pSMB); | 1426 | rc = small_smb_init(SMB_COM_READ_ANDX, wct, tcon, (void **) &pSMB); |
@@ -1431,8 +1436,6 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, const int netfid, | |||
1431 | pSMB->OffsetLow = cpu_to_le32(lseek & 0xFFFFFFFF); | 1436 | pSMB->OffsetLow = cpu_to_le32(lseek & 0xFFFFFFFF); |
1432 | if (wct == 12) | 1437 | if (wct == 12) |
1433 | pSMB->OffsetHigh = cpu_to_le32(lseek >> 32); | 1438 | pSMB->OffsetHigh = cpu_to_le32(lseek >> 32); |
1434 | else if ((lseek >> 32) > 0) /* can not handle this big offset for old */ | ||
1435 | return -EIO; | ||
1436 | 1439 | ||
1437 | pSMB->Remaining = 0; | 1440 | pSMB->Remaining = 0; |
1438 | pSMB->MaxCount = cpu_to_le16(count & 0xFFFF); | 1441 | pSMB->MaxCount = cpu_to_le16(count & 0xFFFF); |
@@ -1519,8 +1522,13 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon, | |||
1519 | 1522 | ||
1520 | if (tcon->ses->capabilities & CAP_LARGE_FILES) | 1523 | if (tcon->ses->capabilities & CAP_LARGE_FILES) |
1521 | wct = 14; | 1524 | wct = 14; |
1522 | else | 1525 | else { |
1523 | wct = 12; | 1526 | wct = 12; |
1527 | if ((offset >> 32) > 0) { | ||
1528 | /* can not handle big offset for old srv */ | ||
1529 | return -EIO; | ||
1530 | } | ||
1531 | } | ||
1524 | 1532 | ||
1525 | rc = smb_init(SMB_COM_WRITE_ANDX, wct, tcon, (void **) &pSMB, | 1533 | rc = smb_init(SMB_COM_WRITE_ANDX, wct, tcon, (void **) &pSMB, |
1526 | (void **) &pSMBr); | 1534 | (void **) &pSMBr); |
@@ -1535,8 +1543,6 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon, | |||
1535 | pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); | 1543 | pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); |
1536 | if (wct == 14) | 1544 | if (wct == 14) |
1537 | pSMB->OffsetHigh = cpu_to_le32(offset >> 32); | 1545 | pSMB->OffsetHigh = cpu_to_le32(offset >> 32); |
1538 | else if ((offset >> 32) > 0) /* can not handle big offset for old srv */ | ||
1539 | return -EIO; | ||
1540 | 1546 | ||
1541 | pSMB->Reserved = 0xFFFFFFFF; | 1547 | pSMB->Reserved = 0xFFFFFFFF; |
1542 | pSMB->WriteMode = 0; | 1548 | pSMB->WriteMode = 0; |
@@ -1621,10 +1627,15 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon, | |||
1621 | 1627 | ||
1622 | cFYI(1, ("write2 at %lld %d bytes", (long long)offset, count)); | 1628 | cFYI(1, ("write2 at %lld %d bytes", (long long)offset, count)); |
1623 | 1629 | ||
1624 | if (tcon->ses->capabilities & CAP_LARGE_FILES) | 1630 | if (tcon->ses->capabilities & CAP_LARGE_FILES) { |
1625 | wct = 14; | 1631 | wct = 14; |
1626 | else | 1632 | } else { |
1627 | wct = 12; | 1633 | wct = 12; |
1634 | if ((offset >> 32) > 0) { | ||
1635 | /* can not handle big offset for old srv */ | ||
1636 | return -EIO; | ||
1637 | } | ||
1638 | } | ||
1628 | rc = small_smb_init(SMB_COM_WRITE_ANDX, wct, tcon, (void **) &pSMB); | 1639 | rc = small_smb_init(SMB_COM_WRITE_ANDX, wct, tcon, (void **) &pSMB); |
1629 | if (rc) | 1640 | if (rc) |
1630 | return rc; | 1641 | return rc; |
@@ -1637,8 +1648,6 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon, | |||
1637 | pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); | 1648 | pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); |
1638 | if (wct == 14) | 1649 | if (wct == 14) |
1639 | pSMB->OffsetHigh = cpu_to_le32(offset >> 32); | 1650 | pSMB->OffsetHigh = cpu_to_le32(offset >> 32); |
1640 | else if ((offset >> 32) > 0) /* can not handle big offset for old srv */ | ||
1641 | return -EIO; | ||
1642 | pSMB->Reserved = 0xFFFFFFFF; | 1651 | pSMB->Reserved = 0xFFFFFFFF; |
1643 | pSMB->WriteMode = 0; | 1652 | pSMB->WriteMode = 0; |
1644 | pSMB->Remaining = 0; | 1653 | pSMB->Remaining = 0; |