spi: Always check complete callback before calling it
authorAxel Lin <axel.lin@ingics.com>
Wed, 2 Apr 2014 14:21:04 +0000 (22:21 +0800)
committerMark Brown <broonie@linaro.org>
Thu, 3 Apr 2014 10:13:38 +0000 (11:13 +0100)
Since commit 1e25cd4729bd "spi: Do not require a completion", this checking is
required to prevent NULL pointer dereference.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
drivers/spi/spi-fsl-espi.c
drivers/spi/spi-fsl-spi.c
drivers/spi/spi-mpc512x-psc.c
drivers/spi/spi-mpc52xx-psc.c
drivers/spi/spi-mpc52xx.c
drivers/spi/spi-sh.c
drivers/spi/spi-txx9.c

index 428dc7a..e8e3d34 100644 (file)
@@ -446,7 +446,8 @@ static void fsl_espi_do_one_msg(struct spi_message *m)
 
        m->actual_length = espi_trans.actual_length;
        m->status = espi_trans.status;
-       m->complete(m->context);
+       if (m->complete)
+               m->complete(m->context);
 }
 
 static int fsl_espi_setup(struct spi_device *spi)
index 119f7af..f2af3eb 100644 (file)
@@ -404,7 +404,8 @@ static void fsl_spi_do_one_msg(struct spi_message *m)
        }
 
        m->status = status;
-       m->complete(m->context);
+       if (m->complete)
+               m->complete(m->context);
 
        if (status || !cs_change) {
                ndelay(nsecs);
index 5032141..8eee745 100644 (file)
@@ -301,7 +301,8 @@ static int mpc512x_psc_spi_msg_xfer(struct spi_master *master,
        }
 
        m->status = status;
-       m->complete(m->context);
+       if (m->complete)
+               m->complete(m->context);
 
        if (status || !cs_change)
                mpc512x_psc_spi_deactivate_cs(spi);
index 00ba910..d761bc0 100644 (file)
@@ -248,7 +248,8 @@ static void mpc52xx_psc_spi_work(struct work_struct *work)
                }
 
                m->status = status;
-               m->complete(m->context);
+               if (m->complete)
+                       m->complete(m->context);
 
                if (status || !cs_change)
                        mpc52xx_psc_spi_deactivate_cs(spi);
index 7c675fe..a0de12a 100644 (file)
@@ -235,7 +235,8 @@ static int mpc52xx_spi_fsmstate_transfer(int irq, struct mpc52xx_spi *ms,
                dev_err(&ms->master->dev, "mode fault\n");
                mpc52xx_spi_chipsel(ms, 0);
                ms->message->status = -EIO;
-               ms->message->complete(ms->message->context);
+               if (ms->message->complete)
+                       ms->message->complete(ms->message->context);
                ms->state = mpc52xx_spi_fsmstate_idle;
                return FSM_CONTINUE;
        }
@@ -289,7 +290,8 @@ mpc52xx_spi_fsmstate_wait(int irq, struct mpc52xx_spi *ms, u8 status, u8 data)
                ms->msg_count++;
                mpc52xx_spi_chipsel(ms, 0);
                ms->message->status = 0;
-               ms->message->complete(ms->message->context);
+               if (ms->message->complete)
+                       ms->message->complete(ms->message->context);
                ms->state = mpc52xx_spi_fsmstate_idle;
                return FSM_CONTINUE;
        }
index f6f2c70..03edf5e 100644 (file)
@@ -322,7 +322,8 @@ static void spi_sh_work(struct work_struct *work)
                spin_lock_irqsave(&ss->lock, flags);
 
                mesg->status = 0;
-               mesg->complete(mesg->context);
+               if (mesg->complete)
+                       mesg->complete(mesg->context);
        }
 
        clear_fifo(ss);
@@ -340,7 +341,8 @@ static void spi_sh_work(struct work_struct *work)
 
  error:
        mesg->status = ret;
-       mesg->complete(mesg->context);
+       if (mesg->complete)
+               mesg->complete(mesg->context);
 
        spi_sh_clear_bit(ss, SPI_SH_SSA | SPI_SH_SSDB | SPI_SH_SSD,
                         SPI_SH_CR1);
index 6191ced..57a1497 100644 (file)
@@ -265,7 +265,8 @@ static void txx9spi_work_one(struct txx9spi *c, struct spi_message *m)
 
 exit:
        m->status = status;
-       m->complete(m->context);
+       if (m->complete)
+               m->complete(m->context);
 
        /* normally deactivate chipselect ... unless no error and
         * cs_change has hinted that the next message will probably