Private
Public Access
2
0

intel_de3815.c: Add error handling to seeks and avoid reading past buffer size

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
Brendan Le Foll
2015-07-08 10:29:27 +01:00
parent 8734a42377
commit 7f34a5c9cf

View File

@@ -126,15 +126,31 @@ mraa_intel_de3815()
int i = 0; int i = 0;
int suc = 0; int suc = 0;
for (i = 0; i < 9; i++) { for (i = 0; i < 9; i++) {
off_t size, err;
char path[MAX_SIZE]; char path[MAX_SIZE];
char value[MAX_SIZE];
snprintf(path, MAX_SIZE, "/sys/class/i2c-dev/i2c-%u/name", i); snprintf(path, MAX_SIZE, "/sys/class/i2c-dev/i2c-%u/name", i);
fd = open(path, O_RDONLY); fd = open(path, O_RDONLY);
if (fd < 0) { if (fd < 0) {
break; break;
} }
off_t size = lseek(fd, 0, SEEK_END); size = lseek(fd, 0, SEEK_END);
char value[MAX_SIZE]; if (size < 0) {
lseek(fd, 0, SEEK_SET); syslog(LOG_WARNING, "mraa: failed to seek i2c filename file");
close(fd);
break;
}
err = lseek(fd, 0, SEEK_SET);
if (err < 0) {
syslog(LOG_WARNING, "mraa: failed to seek i2c filename file");
close(fd);
break;
}
if (size >= MAX_SIZE) {
syslog(LOG_NOTICE, "mraa: i2c filename file too big, skipping");
close(fd);
break;
}
ssize_t r = read(fd, value, size); ssize_t r = read(fd, value, size);
if (r > 0) { if (r > 0) {
if (strcasestr(value, I2CNAME) != NULL) { if (strcasestr(value, I2CNAME) != NULL) {