diff options
author | Andrew Tridgell <tridge@samba.org> | 2014-04-28 10:51:12 +1000 |
---|---|---|
committer | Lorenz Meier <lm@inf.ethz.ch> | 2014-04-28 11:40:11 +0200 |
commit | 099b2017ccfa0fc7696f168db2a0c2e13fe5edbc (patch) | |
tree | 2816cad351d0bae08f2f12f604928441308d6d22 | |
parent | ed45e813aff84f5646ea7ad1d7ab50f597bdebb9 (diff) | |
download | px4-nuttx-099b2017ccfa0fc7696f168db2a0c2e13fe5edbc.tar.gz px4-nuttx-099b2017ccfa0fc7696f168db2a0c2e13fe5edbc.tar.bz2 px4-nuttx-099b2017ccfa0fc7696f168db2a0c2e13fe5edbc.zip |
stm32_i2c: ensure that unexpected ISR can't overwrite stale data
if we get an ISR leftover from a previous read transfer it could use
stale values for priv->dcnt and priv->ptr to overwrite stack that is
no longer in scope. This resets dcnt and ptr on each new
stm32_i2c_process() call to ensure that any unexpected data bytes are
discarded
-rw-r--r-- | nuttx/arch/arm/src/stm32/stm32_i2c.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/nuttx/arch/arm/src/stm32/stm32_i2c.c b/nuttx/arch/arm/src/stm32/stm32_i2c.c index c02bf4543..996e8af39 100644 --- a/nuttx/arch/arm/src/stm32/stm32_i2c.c +++ b/nuttx/arch/arm/src/stm32/stm32_i2c.c @@ -1600,7 +1600,12 @@ static int stm32_i2c_process(FAR struct i2c_dev_s *dev, FAR struct i2c_msg_s *ms stm32_i2c_clrstart(priv); /* Old transfers are done */ - + + /* reset ptr and dcnt to ensure an unexpected data + interrupt doesn't overwrite stale data */ + priv->dcnt = 0; + priv->ptr = NULL; + priv->msgv = msgs; priv->msgc = count; @@ -1751,6 +1756,10 @@ static int stm32_i2c_process(FAR struct i2c_dev_s *dev, FAR struct i2c_msg_s *ms stm32_i2c_enablefsmc(ahbenr); stm32_i2c_sem_post(dev); + + /* ensure that any ISR happening after we finish can't overwrite any user data */ + priv->dcnt = 0; + priv->ptr = NULL; return -errval; } |