]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
repair: refactor the BLKMAP_NEXTS_MAX check
authorChristoph Hellwig <hch@lst.de>
Thu, 15 Feb 2024 06:54:01 +0000 (07:54 +0100)
committerCarlos Maiolino <cem@kernel.org>
Wed, 13 Mar 2024 07:48:37 +0000 (08:48 +0100)
Check the 32-bit limits using sizeof instead of cpp ifdefs so that we
can get rid of BITS_PER_LONG.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
repair/bmap.c
repair/bmap.h

index cd1a8b07b301ae095a9553071e3f96e06d110143..7e32fff335942686c39dbb94b794b606105da836 100644 (file)
 pthread_key_t  dblkmap_key;
 pthread_key_t  ablkmap_key;
 
+/*
+ * For 32 bit platforms, we are limited to extent arrays of 2^31 bytes, which
+ * limits the number of extents in an inode we can check. If we don't limit the
+ * valid range, we can overflow the BLKMAP_SIZE() calculation and allocate less
+ * memory than we think we needed, and hence walk off the end of the array and
+ * corrupt memory.
+ */
+#define BLKMAP_NEXTS32_MAX     ((INT_MAX / sizeof(bmap_ext_t)) - 1)
+
 blkmap_t *
 blkmap_alloc(
        xfs_extnum_t    nex,
@@ -35,8 +44,7 @@ blkmap_alloc(
        if (nex < 1)
                nex = 1;
 
-#if (BITS_PER_LONG == 32)      /* on 64-bit platforms this is never true */
-       if (nex > BLKMAP_NEXTS_MAX) {
+       if (sizeof(long) == 4 && nex > BLKMAP_NEXTS32_MAX) {
                do_warn(
        _("Number of extents requested in blkmap_alloc (%llu) overflows 32 bits.\n"
          "If this is not a corruption, then you will need a 64 bit system\n"
@@ -44,7 +52,6 @@ blkmap_alloc(
                        (unsigned long long)nex);
                return NULL;
        }
-#endif
 
        key = whichfork ? ablkmap_key : dblkmap_key;
        blkmap = pthread_getspecific(key);
@@ -278,20 +285,20 @@ blkmap_grow(
                ASSERT(pthread_getspecific(key) == blkmap);
        }
 
-#if (BITS_PER_LONG == 32)      /* on 64-bit platforms this is never true */
-       if (new_naexts > BLKMAP_NEXTS_MAX) {
+       if (sizeof(long) == 4 && new_naexts > BLKMAP_NEXTS32_MAX) {
                do_error(
        _("Number of extents requested in blkmap_grow (%d) overflows 32 bits.\n"
          "You need a 64 bit system to repair this filesystem.\n"),
                        new_naexts);
                return NULL;
        }
-#endif
+
        if (new_naexts <= 0) {
                do_error(
        _("Number of extents requested in blkmap_grow (%d) overflowed the\n"
-         "maximum number of supported extents (%d).\n"),
-                       new_naexts, BLKMAP_NEXTS_MAX);
+         "maximum number of supported extents (%ld).\n"),
+                       new_naexts,
+                       sizeof(long) == 4 ? BLKMAP_NEXTS32_MAX : INT_MAX);
                return NULL;
        }
 
index 4b588df8c86fe812377f42fceafd8e2c29e18964..df9602b31e483ec48f2a38aff3ed29608349b894 100644 (file)
@@ -28,19 +28,6 @@ typedef      struct blkmap {
 #define        BLKMAP_SIZE(n)  \
        (offsetof(blkmap_t, exts) + (sizeof(bmap_ext_t) * (n)))
 
-/*
- * For 32 bit platforms, we are limited to extent arrays of 2^31 bytes, which
- * limits the number of extents in an inode we can check. If we don't limit the
- * valid range, we can overflow the BLKMAP_SIZE() calculation and allocate less
- * memory than we think we needed, and hence walk off the end of the array and
- * corrupt memory.
- */
-#if BITS_PER_LONG == 32
-#define BLKMAP_NEXTS_MAX       ((INT_MAX / sizeof(bmap_ext_t)) - 1)
-#else
-#define BLKMAP_NEXTS_MAX       INT_MAX
-#endif
-
 extern pthread_key_t dblkmap_key;
 extern pthread_key_t ablkmap_key;