diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-10-12 12:54:26 +0200 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-10-12 12:54:26 +0200 | 
| commit | a291ab2d40e97a5ae0c07bf62f04ad7c438f66d0 (patch) | |
| tree | 4a56ee2340eefb14f8d2508538e2879b1964f893 /lib/bch.c | |
| parent | 62d2e531d7f353a77356c461bac12a0dc23aff7c (diff) | |
| parent | f0fe77f601c3d6a821198f88f7adb0a05b8fe03e (diff) | |
Merge tag 'mtd/fixes-for-4.19-rc8' of git://git.infradead.org/linux-mtd
Boris writes:
  "mdt: fix for 4.19-rc8
   * Fix a stack overflow in lib/bch.c"
* tag 'mtd/fixes-for-4.19-rc8' of git://git.infradead.org/linux-mtd:
  lib/bch: fix possible stack overrun
Diffstat (limited to 'lib/bch.c')
| -rw-r--r-- | lib/bch.c | 17 | 
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/bch.c b/lib/bch.c index 7b0f2006698b..5db6d3a4c8a6 100644 --- a/lib/bch.c +++ b/lib/bch.c @@ -79,20 +79,19 @@  #define GF_T(_p)               (CONFIG_BCH_CONST_T)  #define GF_N(_p)               ((1 << (CONFIG_BCH_CONST_M))-1)  #define BCH_MAX_M              (CONFIG_BCH_CONST_M) +#define BCH_MAX_T	       (CONFIG_BCH_CONST_T)  #else  #define GF_M(_p)               ((_p)->m)  #define GF_T(_p)               ((_p)->t)  #define GF_N(_p)               ((_p)->n) -#define BCH_MAX_M              15 +#define BCH_MAX_M              15 /* 2KB */ +#define BCH_MAX_T              64 /* 64 bit correction */  #endif -#define BCH_MAX_T              (((1 << BCH_MAX_M) - 1) / BCH_MAX_M) -  #define BCH_ECC_WORDS(_p)      DIV_ROUND_UP(GF_M(_p)*GF_T(_p), 32)  #define BCH_ECC_BYTES(_p)      DIV_ROUND_UP(GF_M(_p)*GF_T(_p), 8)  #define BCH_ECC_MAX_WORDS      DIV_ROUND_UP(BCH_MAX_M * BCH_MAX_T, 32) -#define BCH_ECC_MAX_BYTES      DIV_ROUND_UP(BCH_MAX_M * BCH_MAX_T, 8)  #ifndef dbg  #define dbg(_fmt, args...)     do {} while (0) @@ -202,6 +201,9 @@ void encode_bch(struct bch_control *bch, const uint8_t *data,  	const uint32_t * const tab3 = tab2 + 256*(l+1);  	const uint32_t *pdata, *p0, *p1, *p2, *p3; +	if (WARN_ON(r_bytes > sizeof(r))) +		return; +  	if (ecc) {  		/* load ecc parity bytes into internal 32-bit buffer */  		load_ecc8(bch, bch->ecc_buf, ecc); @@ -1285,6 +1287,13 @@ struct bch_control *init_bch(int m, int t, unsigned int prim_poly)  		 */  		goto fail; +	if (t > BCH_MAX_T) +		/* +		 * we can support larger than 64 bits if necessary, at the +		 * cost of higher stack usage. +		 */ +		goto fail; +  	/* sanity checks */  	if ((t < 1) || (m*t >= ((1 << m)-1)))  		/* invalid t value */  | 
