From da3efdc4b93065fad03013d03f056fe5e4f11971 Mon Sep 17 00:00:00 2001 From: Alex Tereschenko Date: Thu, 21 Jul 2016 20:40:08 +0200 Subject: [PATCH] i2c: added standard context validity checks Signed-off-by: Alex Tereschenko Signed-off-by: Brendan Le Foll --- src/i2c/i2c.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/i2c/i2c.c b/src/i2c/i2c.c index 7ee3cf0..8c8fb82 100644 --- a/src/i2c/i2c.c +++ b/src/i2c/i2c.c @@ -197,6 +197,11 @@ mraa_i2c_init_raw(unsigned int bus) mraa_result_t mraa_i2c_frequency(mraa_i2c_context dev, mraa_i2c_mode_t mode) { + if (dev == NULL) { + syslog(LOG_ERR, "i2c: frequency: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + if (IS_FUNC_DEFINED(dev, i2c_set_frequency_replace)) { return dev->advance_func->i2c_set_frequency_replace(dev, mode); } @@ -206,6 +211,11 @@ mraa_i2c_frequency(mraa_i2c_context dev, mraa_i2c_mode_t mode) int mraa_i2c_read(mraa_i2c_context dev, uint8_t* data, int length) { + if (dev == NULL) { + syslog(LOG_ERR, "i2c: read: context is invalid"); + return -1; + } + int bytes_read = 0; if (IS_FUNC_DEFINED(dev, i2c_read_replace)) { bytes_read = dev->advance_func->i2c_read_replace(dev, data, length); @@ -223,6 +233,11 @@ mraa_i2c_read(mraa_i2c_context dev, uint8_t* data, int length) int mraa_i2c_read_byte(mraa_i2c_context dev) { + if (dev == NULL) { + syslog(LOG_ERR, "i2c: read_byte: context is invalid"); + return -1; + } + if (IS_FUNC_DEFINED(dev, i2c_read_byte_replace)) return dev->advance_func->i2c_read_byte_replace(dev); i2c_smbus_data_t d; @@ -236,6 +251,11 @@ mraa_i2c_read_byte(mraa_i2c_context dev) int mraa_i2c_read_byte_data(mraa_i2c_context dev, uint8_t command) { + if (dev == NULL) { + syslog(LOG_ERR, "i2c: read_byte_data: context is invalid"); + return -1; + } + if (IS_FUNC_DEFINED(dev, i2c_read_byte_data_replace)) return dev->advance_func->i2c_read_byte_data_replace(dev, command); i2c_smbus_data_t d; @@ -249,6 +269,11 @@ mraa_i2c_read_byte_data(mraa_i2c_context dev, uint8_t command) int mraa_i2c_read_word_data(mraa_i2c_context dev, uint8_t command) { + if (dev == NULL) { + syslog(LOG_ERR, "i2c: read_word_data: context is invalid"); + return -1; + } + if (IS_FUNC_DEFINED(dev, i2c_read_word_data_replace)) return dev->advance_func->i2c_read_word_data_replace(dev, command); i2c_smbus_data_t d; @@ -262,6 +287,11 @@ mraa_i2c_read_word_data(mraa_i2c_context dev, uint8_t command) int mraa_i2c_read_bytes_data(mraa_i2c_context dev, uint8_t command, uint8_t* data, int length) { + if (dev == NULL) { + syslog(LOG_ERR, "i2c: read_bytes_data: context is invalid"); + return -1; + } + if (IS_FUNC_DEFINED(dev, i2c_read_bytes_data_replace)) return dev->advance_func->i2c_read_bytes_data_replace(dev, command, data, length); struct i2c_rdwr_ioctl_data d; @@ -292,6 +322,11 @@ mraa_i2c_read_bytes_data(mraa_i2c_context dev, uint8_t command, uint8_t* data, i mraa_result_t mraa_i2c_write(mraa_i2c_context dev, const uint8_t* data, int length) { + if (dev == NULL) { + syslog(LOG_ERR, "i2c: write: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + if (IS_FUNC_DEFINED(dev, i2c_write_replace)) return dev->advance_func->i2c_write_replace(dev, data, length); i2c_smbus_data_t d; @@ -319,6 +354,11 @@ mraa_i2c_write(mraa_i2c_context dev, const uint8_t* data, int length) mraa_result_t mraa_i2c_write_byte(mraa_i2c_context dev, const uint8_t data) { + if (dev == NULL) { + syslog(LOG_ERR, "i2c: write_byte: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + if (IS_FUNC_DEFINED(dev, i2c_write_byte_replace)) { return dev->advance_func->i2c_write_byte_replace(dev, data); } else { @@ -333,6 +373,11 @@ mraa_i2c_write_byte(mraa_i2c_context dev, const uint8_t data) mraa_result_t mraa_i2c_write_byte_data(mraa_i2c_context dev, const uint8_t data, const uint8_t command) { + if (dev == NULL) { + syslog(LOG_ERR, "i2c: write_byte_data: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + if (IS_FUNC_DEFINED(dev, i2c_write_byte_data_replace)) return dev->advance_func->i2c_write_byte_data_replace(dev, data, command); i2c_smbus_data_t d; @@ -347,6 +392,11 @@ mraa_i2c_write_byte_data(mraa_i2c_context dev, const uint8_t data, const uint8_t mraa_result_t mraa_i2c_write_word_data(mraa_i2c_context dev, const uint16_t data, const uint8_t command) { + if (dev == NULL) { + syslog(LOG_ERR, "i2c: write_word_data: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + if (IS_FUNC_DEFINED(dev, i2c_write_word_data_replace)) return dev->advance_func->i2c_write_word_data_replace(dev, data, command); i2c_smbus_data_t d; @@ -362,6 +412,7 @@ mraa_result_t mraa_i2c_address(mraa_i2c_context dev, uint8_t addr) { if (dev == NULL) { + syslog(LOG_ERR, "i2c: address: context is invalid"); return MRAA_ERROR_INVALID_HANDLE; } @@ -381,6 +432,11 @@ mraa_i2c_address(mraa_i2c_context dev, uint8_t addr) mraa_result_t mraa_i2c_stop(mraa_i2c_context dev) { + if (dev == NULL) { + syslog(LOG_ERR, "i2c: stop: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + free(dev); return MRAA_SUCCESS; }