diff options
| author | Christoph Hellwig <hch@infradead.org> | 2011-05-11 11:04:06 -0400 |
|---|---|---|
| committer | Alex Elder <aelder@sgi.com> | 2011-05-25 11:48:37 -0400 |
| commit | 2f2b3220b0566692da14e06ea5fc0d697a78dc7c (patch) | |
| tree | 714a8ac9b2bf41f4253eb340b550023f47d5d593 | |
| parent | ec90c5563413ba6d29607397c54958d49c3461a3 (diff) | |
xfs: do not use unchecked extent indices in xfs_bmap_add_extent_*
Make sure to only call xfs_iext_get_ext after we've validate the
extent index in the various xfs_bmap_add_extent_* helpers.
Based on an earlier patch from Lachlan McIlroy.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Lachlan McIlroy <lmcilroy@redhat.com>
Signed-off-by: Alex Elder <aelder@sgi.com>
| -rw-r--r-- | fs/xfs/xfs_bmap.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 8f586df8ff8..130ec4fa5ea 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
| @@ -1629,7 +1629,6 @@ xfs_bmap_add_extent_hole_delay( | |||
| 1629 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ | 1629 | xfs_bmbt_irec_t *new, /* new data to add to file extents */ |
| 1630 | int *logflagsp) /* inode logging flags */ | 1630 | int *logflagsp) /* inode logging flags */ |
| 1631 | { | 1631 | { |
| 1632 | xfs_bmbt_rec_host_t *ep; /* extent record for idx */ | ||
| 1633 | xfs_ifork_t *ifp; /* inode fork pointer */ | 1632 | xfs_ifork_t *ifp; /* inode fork pointer */ |
| 1634 | xfs_bmbt_irec_t left; /* left neighbor extent entry */ | 1633 | xfs_bmbt_irec_t left; /* left neighbor extent entry */ |
| 1635 | xfs_filblks_t newlen=0; /* new indirect size */ | 1634 | xfs_filblks_t newlen=0; /* new indirect size */ |
| @@ -1639,7 +1638,6 @@ xfs_bmap_add_extent_hole_delay( | |||
| 1639 | xfs_filblks_t temp=0; /* temp for indirect calculations */ | 1638 | xfs_filblks_t temp=0; /* temp for indirect calculations */ |
| 1640 | 1639 | ||
| 1641 | ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); | 1640 | ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); |
| 1642 | ep = xfs_iext_get_ext(ifp, *idx); | ||
| 1643 | state = 0; | 1641 | state = 0; |
| 1644 | ASSERT(isnullstartblock(new->br_startblock)); | 1642 | ASSERT(isnullstartblock(new->br_startblock)); |
| 1645 | 1643 | ||
| @@ -1660,7 +1658,7 @@ xfs_bmap_add_extent_hole_delay( | |||
| 1660 | */ | 1658 | */ |
| 1661 | if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { | 1659 | if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { |
| 1662 | state |= BMAP_RIGHT_VALID; | 1660 | state |= BMAP_RIGHT_VALID; |
| 1663 | xfs_bmbt_get_all(ep, &right); | 1661 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx), &right); |
| 1664 | 1662 | ||
| 1665 | if (isnullstartblock(right.br_startblock)) | 1663 | if (isnullstartblock(right.br_startblock)) |
| 1666 | state |= BMAP_RIGHT_DELAY; | 1664 | state |= BMAP_RIGHT_DELAY; |
| @@ -1740,7 +1738,8 @@ xfs_bmap_add_extent_hole_delay( | |||
| 1740 | oldlen = startblockval(new->br_startblock) + | 1738 | oldlen = startblockval(new->br_startblock) + |
| 1741 | startblockval(right.br_startblock); | 1739 | startblockval(right.br_startblock); |
| 1742 | newlen = xfs_bmap_worst_indlen(ip, temp); | 1740 | newlen = xfs_bmap_worst_indlen(ip, temp); |
| 1743 | xfs_bmbt_set_allf(ep, new->br_startoff, | 1741 | xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, *idx), |
| 1742 | new->br_startoff, | ||
| 1744 | nullstartblock((int)newlen), temp, right.br_state); | 1743 | nullstartblock((int)newlen), temp, right.br_state); |
| 1745 | trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); | 1744 | trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); |
| 1746 | break; | 1745 | break; |
| @@ -1780,7 +1779,6 @@ xfs_bmap_add_extent_hole_real( | |||
| 1780 | int *logflagsp, /* inode logging flags */ | 1779 | int *logflagsp, /* inode logging flags */ |
| 1781 | int whichfork) /* data or attr fork */ | 1780 | int whichfork) /* data or attr fork */ |
| 1782 | { | 1781 | { |
| 1783 | xfs_bmbt_rec_host_t *ep; /* pointer to extent entry ins. point */ | ||
| 1784 | int error; /* error return value */ | 1782 | int error; /* error return value */ |
| 1785 | int i; /* temp state */ | 1783 | int i; /* temp state */ |
| 1786 | xfs_ifork_t *ifp; /* inode fork pointer */ | 1784 | xfs_ifork_t *ifp; /* inode fork pointer */ |
| @@ -1791,7 +1789,6 @@ xfs_bmap_add_extent_hole_real( | |||
| 1791 | 1789 | ||
| 1792 | ifp = XFS_IFORK_PTR(ip, whichfork); | 1790 | ifp = XFS_IFORK_PTR(ip, whichfork); |
| 1793 | ASSERT(*idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); | 1791 | ASSERT(*idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); |
| 1794 | ep = xfs_iext_get_ext(ifp, *idx); | ||
| 1795 | state = 0; | 1792 | state = 0; |
| 1796 | 1793 | ||
| 1797 | if (whichfork == XFS_ATTR_FORK) | 1794 | if (whichfork == XFS_ATTR_FORK) |
| @@ -1813,7 +1810,7 @@ xfs_bmap_add_extent_hole_real( | |||
| 1813 | */ | 1810 | */ |
| 1814 | if (*idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { | 1811 | if (*idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { |
| 1815 | state |= BMAP_RIGHT_VALID; | 1812 | state |= BMAP_RIGHT_VALID; |
| 1816 | xfs_bmbt_get_all(ep, &right); | 1813 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx), &right); |
| 1817 | if (isnullstartblock(right.br_startblock)) | 1814 | if (isnullstartblock(right.br_startblock)) |
| 1818 | state |= BMAP_RIGHT_DELAY; | 1815 | state |= BMAP_RIGHT_DELAY; |
| 1819 | } | 1816 | } |
| @@ -1925,7 +1922,8 @@ xfs_bmap_add_extent_hole_real( | |||
| 1925 | * Merge the new allocation with the right neighbor. | 1922 | * Merge the new allocation with the right neighbor. |
| 1926 | */ | 1923 | */ |
| 1927 | trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); | 1924 | trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); |
| 1928 | xfs_bmbt_set_allf(ep, new->br_startoff, new->br_startblock, | 1925 | xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, *idx), |
| 1926 | new->br_startoff, new->br_startblock, | ||
| 1929 | new->br_blockcount + right.br_blockcount, | 1927 | new->br_blockcount + right.br_blockcount, |
| 1930 | right.br_state); | 1928 | right.br_state); |
| 1931 | trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); | 1929 | trace_xfs_bmap_post_update(ip, *idx, state, _THIS_IP_); |
