]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
md/raid10: fix divide-by-zero in setup_geo() with zero far_copies
authorJunrui Luo <moonafterrain@outlook.com>
Thu, 16 Apr 2026 03:39:56 +0000 (11:39 +0800)
committerYu Kuai <yukuai@fnnas.com>
Tue, 28 Apr 2026 12:44:37 +0000 (20:44 +0800)
setup_geo() extracts near_copies (nc) and far_copies (fc) from the
user-provided layout parameter without checking for zero. When fc=0
with the "improved" far set layout selected, 'geo->far_set_size =
disks / fc' triggers a divide-by-zero.

Validate nc and fc immediately after extraction, returning -1 if
either is zero.

Fixes: 475901aff158 ("MD RAID10: Improve redundancy for 'far' and 'offset' algorithms (part 1)")
Cc: stable@vger.kernel.org
Signed-off-by: Junrui Luo <moonafterrain@outlook.com>
Link: https://lore.kernel.org/linux-raid/SYBPR01MB7881A5E2556806CC1D318582AF232@SYBPR01MB7881.ausprd01.prod.outlook.com
Signed-off-by: Yu Kuai <yukuai@fnnas.com>
drivers/md/raid10.c

index 4901ebe45c87556fe12e39412374823acb8e6916..39085e7dd6d26d540a61e821f888eaf67e29ce8d 100644 (file)
@@ -3791,6 +3791,8 @@ static int setup_geo(struct geom *geo, struct mddev *mddev, enum geo_type new)
        nc = layout & 255;
        fc = (layout >> 8) & 255;
        fo = layout & (1<<16);
+       if (!nc || !fc)
+               return -1;
        geo->raid_disks = disks;
        geo->near_copies = nc;
        geo->far_copies = fc;