From 3a638caf0172c2a1025348c2f4f78e2166215b6d Mon Sep 17 00:00:00 2001 From: Alex Tereschenko Date: Thu, 18 Aug 2016 16:23:07 +0200 Subject: [PATCH] spi.c: added context validity checks Signed-off-by: Alex Tereschenko Signed-off-by: Brendan Le Foll --- src/spi/spi.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/spi/spi.c b/src/spi/spi.c index e7a6b47..88cab1b 100644 --- a/src/spi/spi.c +++ b/src/spi/spi.c @@ -181,6 +181,11 @@ mraa_spi_init_raw(unsigned int bus, unsigned int cs) mraa_result_t mraa_spi_mode(mraa_spi_context dev, mraa_spi_mode_t mode) { + if (dev == NULL) { + syslog(LOG_ERR, "spi: mode: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + uint8_t spi_mode = 0; switch (mode) { case MRAA_SPI_MODE0: @@ -212,6 +217,11 @@ mraa_spi_mode(mraa_spi_context dev, mraa_spi_mode_t mode) mraa_result_t mraa_spi_frequency(mraa_spi_context dev, int hz) { + if (dev == NULL) { + syslog(LOG_ERR, "spi: frequency: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + int speed = 0; dev->clock = hz; if (ioctl(dev->devfd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) != -1) { @@ -226,6 +236,11 @@ mraa_spi_frequency(mraa_spi_context dev, int hz) mraa_result_t mraa_spi_lsbmode(mraa_spi_context dev, mraa_boolean_t lsb) { + if (dev == NULL) { + syslog(LOG_ERR, "spi: lsbmode: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + if (IS_FUNC_DEFINED(dev, spi_lsbmode_replace)) { return dev->advance_func->spi_lsbmode_replace(dev, lsb); } @@ -246,6 +261,11 @@ mraa_spi_lsbmode(mraa_spi_context dev, mraa_boolean_t lsb) mraa_result_t mraa_spi_bit_per_word(mraa_spi_context dev, unsigned int bits) { + if (dev == NULL) { + syslog(LOG_ERR, "spi: bit_per_word: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + if (ioctl(dev->devfd, SPI_IOC_WR_BITS_PER_WORD, &bits) < 0) { syslog(LOG_ERR, "spi: Failed to set bit per word"); return MRAA_ERROR_INVALID_RESOURCE; @@ -257,6 +277,11 @@ mraa_spi_bit_per_word(mraa_spi_context dev, unsigned int bits) int mraa_spi_write(mraa_spi_context dev, uint8_t data) { + if (dev == NULL) { + syslog(LOG_ERR, "spi: write: context is invalid"); + return -1; + } + struct spi_ioc_transfer msg; memset(&msg, 0, sizeof(msg)); @@ -279,6 +304,11 @@ mraa_spi_write(mraa_spi_context dev, uint8_t data) int mraa_spi_write_word(mraa_spi_context dev, uint16_t data) { + if (dev == NULL) { + syslog(LOG_ERR, "spi: write_word: context is invalid"); + return -1; + } + struct spi_ioc_transfer msg; memset(&msg, 0, sizeof(msg)); @@ -301,6 +331,11 @@ mraa_spi_write_word(mraa_spi_context dev, uint16_t data) mraa_result_t mraa_spi_transfer_buf(mraa_spi_context dev, uint8_t* data, uint8_t* rxbuf, int length) { + if (dev == NULL) { + syslog(LOG_ERR, "spi: transfer_buf: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + struct spi_ioc_transfer msg; memset(&msg, 0, sizeof(msg)); @@ -320,6 +355,11 @@ mraa_spi_transfer_buf(mraa_spi_context dev, uint8_t* data, uint8_t* rxbuf, int l mraa_result_t mraa_spi_transfer_buf_word(mraa_spi_context dev, uint16_t* data, uint16_t* rxbuf, int length) { + if (dev == NULL) { + syslog(LOG_ERR, "spi: transfer_buf_word: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + struct spi_ioc_transfer msg; memset(&msg, 0, sizeof(msg)); @@ -339,6 +379,11 @@ mraa_spi_transfer_buf_word(mraa_spi_context dev, uint16_t* data, uint16_t* rxbuf uint8_t* mraa_spi_write_buf(mraa_spi_context dev, uint8_t* data, int length) { + if (dev == NULL) { + syslog(LOG_ERR, "spi: write_buf: context is invalid"); + return NULL; + } + uint8_t* recv = malloc(sizeof(uint8_t) * length); if (mraa_spi_transfer_buf(dev, data, recv, length) != MRAA_SUCCESS) { @@ -351,6 +396,11 @@ mraa_spi_write_buf(mraa_spi_context dev, uint8_t* data, int length) uint16_t* mraa_spi_write_buf_word(mraa_spi_context dev, uint16_t* data, int length) { + if (dev == NULL) { + syslog(LOG_ERR, "spi: write_buf_word: context is invalid"); + return NULL; + } + uint16_t* recv = malloc(sizeof(uint16_t) * length); if (mraa_spi_transfer_buf_word(dev, data, recv, length) != MRAA_SUCCESS) { @@ -363,6 +413,11 @@ mraa_spi_write_buf_word(mraa_spi_context dev, uint16_t* data, int length) mraa_result_t mraa_spi_stop(mraa_spi_context dev) { + if (dev == NULL) { + syslog(LOG_ERR, "spi: stop: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + close(dev->devfd); free(dev); return MRAA_SUCCESS;