]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
libceph: Amend checking to fix `make W=1` build breakage
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 10 Nov 2025 14:46:53 +0000 (15:46 +0100)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 10 Dec 2025 10:50:54 +0000 (11:50 +0100)
In a few cases the code compares 32-bit value to a SIZE_MAX derived
constant which is much higher than that value on 64-bit platforms,
Clang, in particular, is not happy about this

net/ceph/osdmap.c:1441:10: error: result of comparison of constant 4611686018427387891 with expression of type 'u32' (aka 'unsigned int') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
 1441 |         if (len > (SIZE_MAX - sizeof(*pg)) / sizeof(u32))
      |             ~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
net/ceph/osdmap.c:1624:10: error: result of comparison of constant 2305843009213693945 with expression of type 'u32' (aka 'unsigned int') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
 1624 |         if (len > (SIZE_MAX - sizeof(*pg)) / (2 * sizeof(u32)))
      |             ~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Fix this by casting to size_t. Note, that possible replacement of SIZE_MAX
by U32_MAX may lead to the behaviour changes on the corner cases.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
net/ceph/osdmap.c

index d245fa508e1cc9e9646312307707649ea9a97eff..329eeea2f9229e4ec6e1894546f7966a32e42cf5 100644 (file)
@@ -1438,7 +1438,7 @@ static struct ceph_pg_mapping *__decode_pg_temp(void **p, void *end,
        ceph_decode_32_safe(p, end, len, e_inval);
        if (len == 0 && incremental)
                return NULL;    /* new_pg_temp: [] to remove */
-       if (len > (SIZE_MAX - sizeof(*pg)) / sizeof(u32))
+       if ((size_t)len > (SIZE_MAX - sizeof(*pg)) / sizeof(u32))
                return ERR_PTR(-EINVAL);
 
        ceph_decode_need(p, end, len * sizeof(u32), e_inval);
@@ -1619,7 +1619,7 @@ static struct ceph_pg_mapping *__decode_pg_upmap_items(void **p, void *end,
        u32 len, i;
 
        ceph_decode_32_safe(p, end, len, e_inval);
-       if (len > (SIZE_MAX - sizeof(*pg)) / (2 * sizeof(u32)))
+       if ((size_t)len > (SIZE_MAX - sizeof(*pg)) / (2 * sizeof(u32)))
                return ERR_PTR(-EINVAL);
 
        ceph_decode_need(p, end, 2 * len * sizeof(u32), e_inval);