Patch "media: dvb-frontends: fix i2c access helpers for KASAN" has been added to the 4.15-stable tree
Subsystems (6)
This is a note to let you know that I've just added the patch titled
media: dvb-frontends: fix i2c access helpers for KASAN
to the 4.15-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
media-dvb-frontends-fix-i2c-access-helpers-for-kasan.patch
and it can be found in the queue-4.15 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
3cd890dbe2a4f14cc44c85bb6cf37e5e22d4dd0eMon Sep 17 00:00:00 2001
From: Arnd Bergmann <[email protected]>
Date: Thu, 30 Nov 2017 11:55:46 -0500
Subject: media: dvb-frontends: fix i2c access helpers for KASAN
From: Arnd Bergmann <[email protected]>
commit 3cd890dbe2a4f14cc44c85bb6cf37e5e22d4dd0e upstream.
A typical code fragment was copied across many dvb-frontend drivers and causes large stack frames when built with with CONFIG_KASAN on gcc-5/6/7:
drivers/media/dvb-frontends/cxd2841er.c:3225:1: error: the frame size of 3992 bytes is larger than 3072 bytes [-Werror=frame-larger-than=] drivers/media/dvb-frontends/cxd2841er.c:3404:1: error: the frame size of 3136 bytes is larger than 3072 bytes [-Werror=frame-larger-than=] drivers/media/dvb-frontends/stv0367.c:3143:1: error: the frame size of 4016 bytes is larger than 3072 bytes [-Werror=frame-larger-than=] drivers/media/dvb-frontends/stv090x.c:3430:1: error: the frame size of 5312 bytes is larger than 3072 bytes [-Werror=frame-larger-than=] drivers/media/dvb-frontends/stv090x.c:4248:1: error: the frame size of 4872 bytes is larger than 3072 bytes [-Werror=frame-larger-than=]
gcc-8 now solves this by consolidating the stack slots for the argument variables, but on older compilers we can get the same behavior by taking the pointer of a local variable rather than the inline function argument.
--- drivers/media/dvb-frontends/ascot2e.c | 4 +++- drivers/media/dvb-frontends/cxd2841er.c | 4 +++- drivers/media/dvb-frontends/helene.c | 4 +++- drivers/media/dvb-frontends/horus3a.c | 4 +++- drivers/media/dvb-frontends/itd1000.c | 5 +++-- drivers/media/dvb-frontends/mt312.c | 5 ++++- drivers/media/dvb-frontends/stb0899_drv.c | 3 ++- drivers/media/dvb-frontends/stb6100.c | 6 ++++-- drivers/media/dvb-frontends/stv0367.c | 4 +++- drivers/media/dvb-frontends/stv090x.c | 4 +++- drivers/media/dvb-frontends/stv6110x.c | 4 +++- drivers/media/dvb-frontends/zl10039.c | 4 +++- 12 files changed, 37 insertions(+), 14 deletions(-)
drivers/media/dvb-frontends/ascot2e.c +3 -1
@@ -155,7 +155,9 @@ static int ascot2e_write_regs(struct ascstatic int ascot2e_write_reg (struct ascot2e_priv *priv,u8 reg,u8 val) { -return ascot2e_write_regs (priv, reg, &val,1 ); +u8 tmp = val;/* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ + +return ascot2e_write_regs (priv, reg, &tmp,1 ); } static int ascot2e_read_regs(struct ascot2e_priv *priv,
drivers/media/dvb-frontends/cxd2841er.c +3 -1
@@ -257,7 +257,9 @@ static int cxd2841er_write_regs(struct cstatic int cxd2841er_write_reg (struct cxd2841er_priv *priv,u8 addr,u8 reg,u8 val) { -return cxd2841er_write_regs (priv, addr, reg, &val,1 ); +u8 tmp = val;/* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ + +return cxd2841er_write_regs (priv, addr, reg, &tmp,1 ); } static int cxd2841er_read_regs(struct cxd2841er_priv *priv,
drivers/media/dvb-frontends/helene.c +3 -1
@@ -331,7 +331,9 @@ static int helene_write_regs(struct helestatic int helene_write_reg (struct helene_priv *priv,u8 reg,u8 val) { -return helene_write_regs (priv, reg, &val,1 ); +u8 tmp = val;/* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ + +return helene_write_regs (priv, reg, &tmp,1 ); } static int helene_read_regs(struct helene_priv *priv,
drivers/media/dvb-frontends/horus3a.c +3 -1
@@ -89,7 +89,9 @@ static int horus3a_write_regs(struct horstatic int horus3a_write_reg (struct horus3a_priv *priv,u8 reg,u8 val) { -return horus3a_write_regs (priv, reg, &val,1 ); +u8 tmp = val;/* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ + +return horus3a_write_regs (priv, reg, &tmp,1 ); }static int horus3a_enter_power_save (struct horus3a_priv *priv)
drivers/media/dvb-frontends/itd1000.c +3 -2
@@ -95,8 +95,9 @@ static int itd1000_read_reg(struct itd10static inline int itd1000_write_reg (struct itd1000_state *state,u8 r,u8 v) { -int ret =itd1000_write_regs (state, r, &v,1 ); - state->shadow[r] = v; +u8 tmp = v;/* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ +int ret =itd1000_write_regs (state, r, &tmp,1 ); + state->shadow[r] = tmp;return ret; }
drivers/media/dvb-frontends/mt312.c +4 -1
@@ -142,7 +142,10 @@ static inline int mt312_readreg(struct mstatic inline int mt312_writereg (struct mt312_state *state,const enum mt312_reg_addr reg,const u8 val) { -return mt312_write (state, reg, &val,1 ); +u8 tmp = val;/* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ + + +return mt312_write (state, reg, &tmp,1 ); }static inline u32 mt312_div (u32 a,u32 b)
drivers/media/dvb-frontends/stb0899_drv.c +2 -1
@@ -539,7 +539,8 @@ int stb0899_write_regs(struct stb0899_stint stb0899_write_reg (struct stb0899_state *state,unsigned int reg,u8 data) { -return stb0899_write_regs (state, reg, &data,1 ); +u8 tmp = data; +return stb0899_write_regs (state, reg, &tmp,1 ); }/*
drivers/media/dvb-frontends/stb6100.c +4 -2
@@ -226,12 +226,14 @@ static int stb6100_write_reg_range(strucstatic int stb6100_write_reg (struct stb6100_state *state,u8 reg,u8 data) { +u8 tmp = data;/* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ +if (unlikely (reg >=STB6100_NUMREGS )) {dprintk (verbose,FE_ERROR ,1 ,"Invalid register offset 0x%x" , reg);return -EREMOTEIO ; } - data = (data & stb6100_template[reg].mask) | stb6100_template[reg].set; -return stb6100_write_reg_range (state, &data, reg,1 ); + tmp = (tmp & stb6100_template[reg].mask) | stb6100_template[reg].set; +return stb6100_write_reg_range (state, &tmp, reg,1 ); }
drivers/media/dvb-frontends/stv0367.c +3 -1
@@ -166,7 +166,9 @@ int stv0367_writeregs(struct stv0367_stastatic int stv0367_writereg (struct stv0367_state *state,u16 reg,u8 data) { -return stv0367_writeregs (state, reg, &data,1 ); +u8 tmp = data;/* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ + +return stv0367_writeregs (state, reg, &tmp,1 ); }static u8 stv0367_readreg (struct stv0367_state *state,u16 reg)
drivers/media/dvb-frontends/stv090x.c +3 -1
@@ -755,7 +755,9 @@ static int stv090x_write_regs(struct stvstatic int stv090x_write_reg (struct stv090x_state *state,unsigned int reg,u8 data) { -return stv090x_write_regs (state, reg, &data,1 ); +u8 tmp = data;/* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ + +return stv090x_write_regs (state, reg, &tmp,1 ); }static int stv090x_i2c_gate_ctrl (struct stv090x_state *state,int enable)
drivers/media/dvb-frontends/stv6110x.c +3 -1
@@ -97,7 +97,9 @@ static int stv6110x_write_regs(struct ststatic int stv6110x_write_reg (struct stv6110x_state *stv6110x,u8 reg,u8 data) { -return stv6110x_write_regs (stv6110x, reg, &data,1 ); +u8 tmp = data;/* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ + +return stv6110x_write_regs (stv6110x, reg, &tmp,1 ); }static int stv6110x_init (struct dvb_frontend *fe)
drivers/media/dvb-frontends/zl10039.c +3 -1
@@ -134,7 +134,9 @@ static inline int zl10039_writereg(strucconst enum zl10039_reg_addr reg, const u8 val) { - return zl10039_write(state, reg, &val, 1); + const u8 tmp = val; /* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */ + +return zl10039_write (state, reg, &tmp,1 ); }static int zl10039_init (struct dvb_frontend *fe)
Patches currently in stable-queue which might be from [email protected] are
queue-4.15/kasan-rework-kconfig-settings.patch queue-4.15/mtd-cfi-convert-inline-functions-to-macros.patch queue-4.15/signal-openrisc-fix-do_unaligned_access-to-send-the-proper-signal.patch queue-4.15/media-dvb-frontends-fix-i2c-access-helpers-for-kasan.patch queue-4.15/alpha-osf_sys.c-fix-put_tv32-regression.patch