xfs
[Top] [All Lists]

[PATCH v2] xfs: check for possible overflow in xfs_ioc_trim

To: linux-xfs@xxxxxxxxxxxxxxx
Subject: [PATCH v2] xfs: check for possible overflow in xfs_ioc_trim
From: Tomas Racek <tracek@xxxxxxxxxx>
Date: Wed, 1 Aug 2012 15:45:37 +0200
Cc: lczerner@xxxxxxxxxx, Tomas Racek <tracek@xxxxxxxxxx>, Ben Myers <bpm@xxxxxxx> (supporter:XFS FILESYSTEM), Alex Elder <elder@xxxxxxxxxx> (supporter:XFS FILESYSTEM), xfs@xxxxxxxxxxx (supporter:XFS FILESYSTEM), linux-kernel@xxxxxxxxxxxxxxx (open list)
If range.start points behind the filesystem, return invalid value error.
This fixes possible overflow in

start = BTOBB(range.start)

when range.start is nearly ULLONG_MAX.

Signed-off-by: Tomas Racek <tracek@xxxxxxxxxx>
---
 fs/xfs/xfs_discard.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c
index f9c3fe3..33d367f 100644
--- a/fs/xfs/xfs_discard.c
+++ b/fs/xfs/xfs_discard.c
@@ -179,12 +179,13 @@ xfs_ioc_trim(
         * used by the fstrim application.  In the end it really doesn't
         * matter as trimming blocks is an advisory interface.
         */
+       if (range.start >= XFS_FSB_TO_B(mp, mp->m_sb.sb_dblocks))
+               return -XFS_ERROR(EINVAL);
+
        start = BTOBB(range.start);
        end = start + BTOBBT(range.len) - 1;
        minlen = BTOBB(max_t(u64, granularity, range.minlen));
 
-       if (XFS_BB_TO_FSB(mp, start) >= mp->m_sb.sb_dblocks)
-               return -XFS_ERROR(EINVAL);
        if (end > XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) - 1)
                end = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)- 1;
 
-- 
1.7.7.6

<Prev in Thread] Current Thread [Next in Thread>