mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-03 18:20:25 +02:00 
			
		
		
		
	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: Ivan T. Ivanov <iivanov@mm-sol.com> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
		
							parent
							
								
									aec35f4ee6
								
							
						
					
					
						commit
						4d94bd21b3
					
				
					 1 changed files with 17 additions and 0 deletions
				
			
		| 
						 | 
					@ -1617,6 +1617,7 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct spi_master *master = spi->master;
 | 
						struct spi_master *master = spi->master;
 | 
				
			||||||
	struct spi_transfer *xfer;
 | 
						struct spi_transfer *xfer;
 | 
				
			||||||
 | 
						int w_size, n_words;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (list_empty(&message->transfers))
 | 
						if (list_empty(&message->transfers))
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
| 
						 | 
					@ -1668,6 +1669,22 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
 | 
				
			||||||
				return -EINVAL;
 | 
									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 &&
 | 
							if (xfer->speed_hz && master->min_speed_hz &&
 | 
				
			||||||
		    xfer->speed_hz < master->min_speed_hz)
 | 
							    xfer->speed_hz < master->min_speed_hz)
 | 
				
			||||||
			return -EINVAL;
 | 
								return -EINVAL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue