Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit bdf3a3b5 authored by Boris Brezillon's avatar Boris Brezillon Committed by Mark Brown
Browse files

spi: Check presence the of ->transfer[_xxx]() before registering a controller



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: default avatarBoris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 0d7412ed
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -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)