]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: add bounds checking to xfs_rt{bitmap,summary}_read_buf
authorChristoph Hellwig <hch@lst.de>
Mon, 29 Jul 2024 21:15:54 +0000 (14:15 -0700)
committerChristoph Hellwig <hch@lst.de>
Tue, 30 Jul 2024 01:07:30 +0000 (18:07 -0700)
Source kernel commit: 62e01705d7eab570947effb123c56d64ba173c90

Add a corruption check for passing an invalid block number, which is a
lot easier to understand than the xfs_bmapi_read failure later on.

Signed-off-by: Christoph Hellwig <hch@lst.de>
libxfs/xfs_rtbitmap.c
libxfs/xfs_rtbitmap.h

index f578b0d34b36d3425b56c42b2c476431f91c6a8b..fc904547147e9327d3d5eca22d453752dfcfc82c 100644 (file)
@@ -67,7 +67,7 @@ xfs_rtbuf_cache_relse(
  * Get a buffer for the bitmap or summary file block specified.
  * The buffer is returned read and locked.
  */
-int
+static int
 xfs_rtbuf_get(
        struct xfs_rtalloc_args *args,
        xfs_fileoff_t           block,  /* block number in bitmap or summary */
@@ -136,6 +136,35 @@ xfs_rtbuf_get(
        return 0;
 }
 
+int
+xfs_rtbitmap_read_buf(
+       struct xfs_rtalloc_args         *args,
+       xfs_fileoff_t                   block)
+{
+       struct xfs_mount                *mp = args->mp;
+
+       if (XFS_IS_CORRUPT(mp, block >= mp->m_sb.sb_rbmblocks)) {
+               xfs_rt_mark_sick(mp, XFS_SICK_RT_BITMAP);
+               return -EFSCORRUPTED;
+       }
+
+       return xfs_rtbuf_get(args, block, 0);
+}
+
+int
+xfs_rtsummary_read_buf(
+       struct xfs_rtalloc_args         *args,
+       xfs_fileoff_t                   block)
+{
+       struct xfs_mount                *mp = args->mp;
+
+       if (XFS_IS_CORRUPT(mp, block >= XFS_B_TO_FSB(mp, mp->m_rsumsize))) {
+               xfs_rt_mark_sick(args->mp, XFS_SICK_RT_SUMMARY);
+               return -EFSCORRUPTED;
+       }
+       return xfs_rtbuf_get(args, block, 1);
+}
+
 /*
  * Searching backward from start find the first block whose allocated/free state
  * is different from start's.
index 1e04f0954a0fa7dd2d7852b62763d7355f55cfd6..e87e2099cff5e083553bc2d8dd89fdb7e38f6033 100644 (file)
@@ -293,26 +293,8 @@ typedef int (*xfs_rtalloc_query_range_fn)(
 
 #ifdef CONFIG_XFS_RT
 void xfs_rtbuf_cache_relse(struct xfs_rtalloc_args *args);
-
-int xfs_rtbuf_get(struct xfs_rtalloc_args *args, xfs_fileoff_t block,
-               int issum);
-
-static inline int
-xfs_rtbitmap_read_buf(
-       struct xfs_rtalloc_args         *args,
-       xfs_fileoff_t                   block)
-{
-       return xfs_rtbuf_get(args, block, 0);
-}
-
-static inline int
-xfs_rtsummary_read_buf(
-       struct xfs_rtalloc_args         *args,
-       xfs_fileoff_t                   block)
-{
-       return xfs_rtbuf_get(args, block, 1);
-}
-
+int xfs_rtbitmap_read_buf(struct xfs_rtalloc_args *args, xfs_fileoff_t block);
+int xfs_rtsummary_read_buf(struct xfs_rtalloc_args *args, xfs_fileoff_t block);
 int xfs_rtcheck_range(struct xfs_rtalloc_args *args, xfs_rtxnum_t start,
                xfs_rtxlen_t len, int val, xfs_rtxnum_t *new, int *stat);
 int xfs_rtfind_back(struct xfs_rtalloc_args *args, xfs_rtxnum_t start,