From 11bf37d61bde5a3992b0f55e51aafbc631f27dfc Mon Sep 17 00:00:00 2001 From: Andrea Mazzoleni Date: Thu, 20 Aug 2026 01:22:31 +0200 Subject: [PATCH] Enforce mode parity limits --- raid/check.c | 2 +- raid/internal.h | 1 + raid/module.c | 16 +++++++++++----- raid/raid.c | 3 +++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/raid/check.c b/raid/check.c index 5f11008c..6cc11b82 100644 --- a/raid/check.c +++ b/raid/check.c @@ -115,7 +115,7 @@ int raid_check(int nr, int *ir, int nd, int np, size_t size, void **v) /* enforce limit on number of failures */ BUG_ON(nr >= np); /* >= because we check with extra parity */ - BUG_ON(np > RAID_PARITY_MAX); + BUG_ON(np > RAID_PARITY_MAX || (raid_mode_active == RAID_MODE_VANDERMONDE_RAID && np > 3)); /* enforce order in index vector */ BUG_ON(nr >= 2 && ir[0] >= ir[1]); diff --git a/raid/internal.h b/raid/internal.h index 255e67c4..3851435c 100644 --- a/raid/internal.h +++ b/raid/internal.h @@ -373,6 +373,7 @@ extern uint32_t raid_poly_32; extern uint64_t raid_poly_64; extern uint32_t raid_inv2_32; extern uint64_t raid_inv2_64; +extern int raid_mode_active; #include "gf.h" diff --git a/raid/module.c b/raid/module.c index 9a8da20e..de5e6256 100644 --- a/raid/module.c +++ b/raid/module.c @@ -37,7 +37,7 @@ static struct raid_rec_algo raid_rec_algo_aes[RAID_PARITY_MAX]; static struct raid_gen_algo *raid_gen_algo; static struct raid_rec_algo *raid_rec_algo; -static int raid_mode_active = RAID_MODE_GET; +int raid_mode_active = RAID_MODE_GET; const uint8_t(*raid_gfmul)[256]; const uint8_t *raid_gfexp; @@ -80,8 +80,9 @@ void raid_gen(int nd, int np, size_t size, void **v) /* enforce limit on number of failures */ BUG_ON(np < 1); - BUG_ON(np > RAID_PARITY_MAX); + BUG_ON(np > RAID_PARITY_MAX || (raid_mode_active == RAID_MODE_VANDERMONDE_RAID && np > 3)); + BUG_ON(raid_gen_ptr[np - 1] == 0); raid_gen_ptr[np - 1](nd, size, v); } @@ -104,7 +105,7 @@ void raid_rec(int nr, int *ir, int nd, int np, size_t size, void **v) /* enforce limit on number of failures */ BUG_ON(nr > np); - BUG_ON(np > RAID_PARITY_MAX); + BUG_ON(np > RAID_PARITY_MAX || (raid_mode_active == RAID_MODE_VANDERMONDE_RAID && np > 3)); /* enforce order in index vector */ BUG_ON(nr >= 2 && ir[0] >= ir[1]); @@ -183,9 +184,14 @@ void raid_data(int nr, int *id, int *ip, int nd, size_t size, void **v) BUG_ON(nr >= 5 && ip[3] >= ip[4]); BUG_ON(nr >= 6 && ip[4] >= ip[5]); + /* enforce limit on index vector for parity */ + BUG_ON(nr > 0 && (ip[nr - 1] >= RAID_PARITY_MAX || (raid_mode_active == RAID_MODE_VANDERMONDE_RAID && ip[nr - 1] >= 3))); + /* if failed data is present */ - if (nr != 0) - raid_rec_algo[nr - 1].rec(nr, id, ip, nd, size, v); + if (nr != 0) { + BUG_ON(raid_rec_ptr[nr - 1] == 0); + raid_rec_ptr[nr - 1](nr, id, ip, nd, size, v); + } } const char * raid_gen_tag(int na) diff --git a/raid/raid.c b/raid/raid.c index f752518c..b5d07407 100644 --- a/raid/raid.c +++ b/raid/raid.c @@ -295,6 +295,9 @@ void raid_delta_gen(int nr, int *id, int *ip, int nd, size_t size, void **v) int np; void *latest; + /* zero buffer must be initialized prior to delta recovery */ + BUG_ON(raid_zero_block == 0); + /* * Total number of parities we are going to process * they are both the used and the unused ones