| From b8c161bce9fee0a1db0239b7f2432470fb4b655d Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Thu, 12 Mar 2020 12:01:51 +0100 |
| Subject: [PATCH] staging: greybus: loopback_test: fix potential path |
| truncations |
| |
| commit ae62cf5eb2792d9a818c2d93728ed92119357017 upstream. |
| |
| Newer GCC warns about possible truncations of two generated path names as |
| we're concatenating the configurable sysfs and debugfs path prefixes |
| with a filename and placing the results in buffers of the same size as |
| the maximum length of the prefixes. |
| |
| snprintf(d->name, MAX_STR_LEN, "gb_loopback%u", dev_id); |
| |
| snprintf(d->sysfs_entry, MAX_SYSFS_PATH, "%s%s/", |
| t->sysfs_prefix, d->name); |
| |
| snprintf(d->debugfs_entry, MAX_SYSFS_PATH, "%sraw_latency_%s", |
| t->debugfs_prefix, d->name); |
| |
| Fix this by separating the maximum path length from the maximum prefix |
| length and reducing the latter enough to fit the generated strings. |
| |
| Note that we also need to reduce the device-name buffer size as GCC |
| isn't smart enough to figure out that we ever only used MAX_STR_LEN |
| bytes of it. |
| |
| Fixes: 6b0658f68786 ("greybus: tools: Add tools directory to greybus repo and add loopback") |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Link: https://lore.kernel.org/r/20200312110151.22028-4-johan@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/staging/greybus/tools/loopback_test.c b/drivers/staging/greybus/tools/loopback_test.c |
| index ff8234198e7b..dac5129e76f1 100644 |
| --- a/drivers/staging/greybus/tools/loopback_test.c |
| +++ b/drivers/staging/greybus/tools/loopback_test.c |
| @@ -21,6 +21,7 @@ |
| #include <signal.h> |
| |
| #define MAX_NUM_DEVICES 10 |
| +#define MAX_SYSFS_PREFIX 0x80 |
| #define MAX_SYSFS_PATH 0x200 |
| #define CSV_MAX_LINE 0x1000 |
| #define SYSFS_MAX_INT 0x20 |
| @@ -69,7 +70,7 @@ struct loopback_results { |
| }; |
| |
| struct loopback_device { |
| - char name[MAX_SYSFS_PATH]; |
| + char name[MAX_STR_LEN]; |
| char sysfs_entry[MAX_SYSFS_PATH]; |
| char debugfs_entry[MAX_SYSFS_PATH]; |
| struct loopback_results results; |
| @@ -95,8 +96,8 @@ struct loopback_test { |
| int stop_all; |
| int poll_count; |
| char test_name[MAX_STR_LEN]; |
| - char sysfs_prefix[MAX_SYSFS_PATH]; |
| - char debugfs_prefix[MAX_SYSFS_PATH]; |
| + char sysfs_prefix[MAX_SYSFS_PREFIX]; |
| + char debugfs_prefix[MAX_SYSFS_PREFIX]; |
| struct timespec poll_timeout; |
| struct loopback_device devices[MAX_NUM_DEVICES]; |
| struct loopback_results aggregate_results; |
| @@ -915,10 +916,10 @@ int main(int argc, char *argv[]) |
| t.iteration_max = atoi(optarg); |
| break; |
| case 'S': |
| - snprintf(t.sysfs_prefix, MAX_SYSFS_PATH, "%s", optarg); |
| + snprintf(t.sysfs_prefix, MAX_SYSFS_PREFIX, "%s", optarg); |
| break; |
| case 'D': |
| - snprintf(t.debugfs_prefix, MAX_SYSFS_PATH, "%s", optarg); |
| + snprintf(t.debugfs_prefix, MAX_SYSFS_PREFIX, "%s", optarg); |
| break; |
| case 'm': |
| t.mask = atol(optarg); |
| @@ -969,10 +970,10 @@ int main(int argc, char *argv[]) |
| } |
| |
| if (!strcmp(t.sysfs_prefix, "")) |
| - snprintf(t.sysfs_prefix, MAX_SYSFS_PATH, "%s", sysfs_prefix); |
| + snprintf(t.sysfs_prefix, MAX_SYSFS_PREFIX, "%s", sysfs_prefix); |
| |
| if (!strcmp(t.debugfs_prefix, "")) |
| - snprintf(t.debugfs_prefix, MAX_SYSFS_PATH, "%s", debugfs_prefix); |
| + snprintf(t.debugfs_prefix, MAX_SYSFS_PREFIX, "%s", debugfs_prefix); |
| |
| ret = find_loopback_devices(&t); |
| if (ret) |
| -- |
| 2.7.4 |
| |