aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean Delvare <jdelvare@suse.de>2017-11-08 22:17:43 +0100
committerJean Delvare <jdelvare@suse.de>2017-11-08 22:18:40 +0100
commitd062793e7aebde3ffee796dfd4180716632ae444 (patch)
tree9b7cbeb8ea0ea45113d475490b80c10e47d68ac5
parentdef2845efacab3a3973fb0218ac5077a162f8f1e (diff)
downloadi2c-tools-d062793e7aebde3ffee796dfd4180716632ae444.tar.gz
tools: i2cbusses: Check the return value of snprintf
It's very unlikely that these paths will ever be truncated, but better safe than sorry. Suggested by Uwe Kleine-König.
-rw-r--r--tools/i2cbusses.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/tools/i2cbusses.c b/tools/i2cbusses.c
index cb78cc7..41f5b6b 100644
--- a/tools/i2cbusses.c
+++ b/tools/i2cbusses.c
@@ -137,7 +137,7 @@ struct i2c_adap *gather_i2c_busses(void)
FILE *f;
char fstype[NAME_MAX], sysfs[NAME_MAX], n[NAME_MAX];
int foundsysfs = 0;
- int count=0;
+ int len, count = 0;
struct i2c_adap *adapters;
adapters = calloc(BUNCH, sizeof(struct i2c_adap));
@@ -220,18 +220,32 @@ struct i2c_adap *gather_i2c_busses(void)
/* this should work for kernels 2.6.5 or higher and */
/* is preferred because is unambiguous */
- snprintf(n, NAME_MAX, "%s/%s/name", sysfs, de->d_name);
+ len = snprintf(n, NAME_MAX, "%s/%s/name", sysfs, de->d_name);
+ if (len >= NAME_MAX) {
+ fprintf(stderr, "%s: path truncated\n", n);
+ continue;
+ }
f = fopen(n, "r");
/* this seems to work for ISA */
if(f == NULL) {
- snprintf(n, NAME_MAX, "%s/%s/device/name", sysfs, de->d_name);
+ len = snprintf(n, NAME_MAX, "%s/%s/device/name", sysfs,
+ de->d_name);
+ if (len >= NAME_MAX) {
+ fprintf(stderr, "%s: path truncated\n", n);
+ continue;
+ }
f = fopen(n, "r");
}
/* non-ISA is much harder */
/* and this won't find the correct bus name if a driver
has more than one bus */
if(f == NULL) {
- snprintf(n, NAME_MAX, "%s/%s/device", sysfs, de->d_name);
+ len = snprintf(n, NAME_MAX, "%s/%s/device", sysfs,
+ de->d_name);
+ if (len >= NAME_MAX) {
+ fprintf(stderr, "%s: path truncated\n", n);
+ continue;
+ }
if(!(ddir = opendir(n)))
continue;
while ((dde = readdir(ddir)) != NULL) {
@@ -240,8 +254,16 @@ struct i2c_adap *gather_i2c_busses(void)
if (!strcmp(dde->d_name, ".."))
continue;
if ((!strncmp(dde->d_name, "i2c-", 4))) {
- snprintf(n, NAME_MAX, "%s/%s/device/%s/name",
- sysfs, de->d_name, dde->d_name);
+ len = snprintf(n, NAME_MAX,
+ "%s/%s/device/%s/name",
+ sysfs, de->d_name,
+ dde->d_name);
+ if (len >= NAME_MAX) {
+ fprintf(stderr,
+ "%s: path truncated\n",
+ n);
+ continue;
+ }
if((f = fopen(n, "r")))
goto found;
}