]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
spi: Check presence the of ->transfer[_xxx]() before registering a controller
authorBoris Brezillon <boris.brezillon@bootlin.com>
Tue, 10 Apr 2018 22:44:30 +0000 (00:44 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 26 Apr 2018 12:53:29 +0000 (13:53 +0100)
Right now, no checks are done on the presence of a ->transfer[_xxx]()
method, which can lead to a NULL pointer dereference when someone
starts sending something on the bus.

Do the check at registration time and refuse to add the controller if
all ->transfer[_xxx]() pointers are NULL.

Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi.c

index 3f46663656789823b8e769edbb440fa7c9d1dc04..9ab65fb2738e6cc0d7d5378f076010239f939ab0 100644 (file)
@@ -2068,6 +2068,19 @@ static int of_spi_register_master(struct spi_controller *ctlr)
 }
 #endif
 
+static int spi_controller_check_ops(struct spi_controller *ctlr)
+{
+       /*
+        * The controller must at least implement one of the ->transfer()
+        * hooks.
+        */
+       if (!ctlr->transfer && !ctlr->transfer_one &&
+           !ctlr->transfer_one_message)
+               return -EINVAL;
+
+       return 0;
+}
+
 /**
  * spi_register_controller - register SPI master or slave controller
  * @ctlr: initialized master, originally from spi_alloc_master() or
@@ -2101,6 +2114,14 @@ int spi_register_controller(struct spi_controller *ctlr)
        if (!dev)
                return -ENODEV;
 
+       /*
+        * Make sure all necessary hooks are implemented before registering
+        * the SPI controller.
+        */
+       status = spi_controller_check_ops(ctlr);
+       if (status)
+               return status;
+
        if (!spi_controller_is_slave(ctlr)) {
                status = of_spi_register_master(ctlr);
                if (status)