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

Commit 4d94bd21 authored by Ivan T. Ivanov's avatar Ivan T. Ivanov Committed by Mark Brown
Browse files

spi: core: Validate length of the transfers in message



SPI transfer length should be multiple of SPI word size,
where SPI word size should be power-of-two multiple

Signed-off-by: default avatarIvan T. Ivanov <iivanov@mm-sol.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent aec35f4e
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -1617,6 +1617,7 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
{
	struct spi_master *master = spi->master;
	struct spi_transfer *xfer;
	int w_size, n_words;

	if (list_empty(&message->transfers))
		return -EINVAL;
@@ -1668,6 +1669,22 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
				return -EINVAL;
		}

		/*
		 * SPI transfer length should be multiple of SPI word size
		 * where SPI word size should be power-of-two multiple
		 */
		if (xfer->bits_per_word <= 8)
			w_size = 1;
		else if (xfer->bits_per_word <= 16)
			w_size = 2;
		else
			w_size = 4;

		n_words = xfer->len / w_size;
		/* No partial transfers accepted */
		if (!n_words || xfer->len % w_size)
			return -EINVAL;

		if (xfer->speed_hz && master->min_speed_hz &&
		    xfer->speed_hz < master->min_speed_hz)
			return -EINVAL;