diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c index 0b0c398c956bae4b29a511a4f8a289b750210472..e8890f96b6d0b47c3504d19fd66063134d8b0baf 100644 --- a/drivers/misc/eeprom/at24.c +++ b/drivers/misc/eeprom/at24.c @@ -113,7 +113,7 @@ MODULE_PARM_DESC(write_timeout, "Time (in ms) to try writes (default 25)"); #define SECO_MAC_OFFSET 0 #define SECO_MAC_CHAR_LEN 12 #define SECO_SERIAL_OFFSET 6 -#define SECO_SERIAL_CHAR_LEN 9 +#define SECO_SERIAL_MAX_CHAR_LEN 9 #define SECO_PN_OFFSETa 15 #define SECO_PN_OFFSETb 16 #define SECO_PN_CHAR_LEN 17 @@ -653,7 +653,7 @@ static int at24_serial_read(void *priv, unsigned int off, void *val, size_t coun while (count) { int status; - status = at24->read_func(at24, buf, SECO_SERIAL_OFFSET, SECO_SERIAL_CHAR_LEN); + status = at24->read_func(at24, buf, SECO_SERIAL_OFFSET, SECO_SERIAL_MAX_CHAR_LEN); if (status < 0) { mutex_unlock(&at24->lock); return status; @@ -665,6 +665,9 @@ static int at24_serial_read(void *priv, unsigned int off, void *val, size_t coun mutex_unlock(&at24->lock); + if (buf[SECO_SERIAL_MAX_CHAR_LEN - 1] == 'X') + buf[SECO_SERIAL_MAX_CHAR_LEN - 1] = '\0'; + return 0; } @@ -785,13 +788,19 @@ static int at24_serial_write(void *priv, unsigned int off, void *val, size_t cou char *buf = val; int status; - if (count != (SECO_SERIAL_CHAR_LEN)) + if (count > (SECO_SERIAL_MAX_CHAR_LEN) || count < (SECO_SERIAL_MAX_CHAR_LEN - 1)) return -EINVAL; - if (buf[SECO_SERIAL_CHAR_LEN] != '\0') + if (buf[SECO_SERIAL_MAX_CHAR_LEN - 1] == '\0') { + buf[SECO_SERIAL_MAX_CHAR_LEN - 1] = 'X'; + buf[SECO_SERIAL_MAX_CHAR_LEN] = '\0'; + } + + if (buf[SECO_SERIAL_MAX_CHAR_LEN] != '\0') { return -EINVAL; + } - if ((buf[0] != 'k') && (buf[0] != 'K')) + if (!isalpha(buf[0])) return -EINVAL; /* @@ -800,7 +809,7 @@ static int at24_serial_write(void *priv, unsigned int off, void *val, size_t cou */ mutex_lock(&at24->lock); - status = at24->write_func(at24, buf, SECO_SERIAL_OFFSET, SECO_SERIAL_CHAR_LEN); + status = at24->write_func(at24, buf, SECO_SERIAL_OFFSET, SECO_SERIAL_MAX_CHAR_LEN); if (status < 0) { mutex_unlock(&at24->lock); return status; @@ -1100,7 +1109,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) at24->serial_nvmem_config.priv = at24; at24->serial_nvmem_config.stride = 1; at24->serial_nvmem_config.word_size = 1; - at24->serial_nvmem_config.size = SECO_SERIAL_CHAR_LEN; + at24->serial_nvmem_config.size = SECO_SERIAL_MAX_CHAR_LEN; at24->serial_nvmem = nvmem_register(&at24->serial_nvmem_config);