summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2014-04-28 10:51:12 +1000
committerLorenz Meier <lm@inf.ethz.ch>2014-04-28 11:40:11 +0200
commit099b2017ccfa0fc7696f168db2a0c2e13fe5edbc (patch)
tree2816cad351d0bae08f2f12f604928441308d6d22
parented45e813aff84f5646ea7ad1d7ab50f597bdebb9 (diff)
downloadpx4-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.c11
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;
}