mraa.c: Fix buffer overfow in mraa_find_i2c_bus
All files in sysfs are 4K minimum so allocate a 4k buffer to hold the result - even if it'll never be that big Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
10
src/mraa.c
10
src/mraa.c
@@ -453,7 +453,7 @@ mraa_count_files(const char* path, const struct stat* sb, int flag, struct FTW*
|
|||||||
int
|
int
|
||||||
mraa_find_i2c_bus(const char* devname, int startfrom)
|
mraa_find_i2c_bus(const char* devname, int startfrom)
|
||||||
{
|
{
|
||||||
char path[64], value[64];
|
char path[64];
|
||||||
int fd;
|
int fd;
|
||||||
int i = startfrom;
|
int i = startfrom;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
@@ -493,15 +493,23 @@ mraa_find_i2c_bus(const char* devname, int startfrom)
|
|||||||
close(fd);
|
close(fd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
char* value = malloc(size);
|
||||||
|
if (value == NULL) {
|
||||||
|
syslog(LOG_ERR, "mraa: failed to allocate memory for i2c file");
|
||||||
|
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, devname) != NULL) {
|
if (strcasestr(value, devname) != NULL) {
|
||||||
|
free(value);
|
||||||
close(fd);
|
close(fd);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
syslog(LOG_ERR, "mraa: sysfs i2cdev failed");
|
syslog(LOG_ERR, "mraa: sysfs i2cdev failed");
|
||||||
}
|
}
|
||||||
|
free(value);
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user