irqbalance/cputree-adjust-snprintf-sizes-to-avoid-gcc-warnings.patch

92 lines
3.3 KiB
Diff
Raw Normal View History

2019-09-30 10:53:30 -04:00
From 0605850acfce6f2ae23759618604f02f946026c2 Mon Sep 17 00:00:00 2001
From: Neil Horman <nhorman@tuxdriver.com>
Date: Tue, 29 May 2018 10:26:00 -0400
Subject: [PATCH 129/152] cputree: adjust snprintf sizes to avoid gcc warnings
Gcc detects potential overruns in our use of PATH_MAX arrays when
parsing cpu topology. This commit corrects those issues by ensuing that
the print size is no longer than the array size in all cases
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
---
cputree.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/cputree.c b/cputree.c
index d09af43..c88143f 100644
--- a/cputree.c
+++ b/cputree.c
@@ -241,7 +241,8 @@ static struct topo_obj* add_cpu_to_cache_domain(struct topo_obj *cpu,
return cache;
}
-
+
+#define ADJ_SIZE(r,s) PATH_MAX-strlen(r)-strlen(#s)
static void do_one_cpu(char *path)
{
struct topo_obj *cpu;
@@ -256,7 +257,7 @@ static void do_one_cpu(char *path)
unsigned int max_cache_index, cache_index, cache_stat;
/* skip offline cpus */
- snprintf(new_path, PATH_MAX, "%s/online", path);
+ snprintf(new_path, ADJ_SIZE(path,"/online"), "%s/online", path);
file = fopen(new_path, "r");
if (file) {
char *line = NULL;
@@ -299,7 +300,8 @@ static void do_one_cpu(char *path)
/* try to read the package mask; if it doesn't exist assume solitary */
- snprintf(new_path, PATH_MAX, "%s/topology/core_siblings", path);
+ snprintf(new_path, ADJ_SIZE(path, "/topology/core_siblings"),
+ "%s/topology/core_siblings", path);
file = fopen(new_path, "r");
cpu_set(cpu->number, package_mask);
if (file) {
@@ -311,7 +313,8 @@ static void do_one_cpu(char *path)
free(line);
}
/* try to read the package id */
- snprintf(new_path, PATH_MAX, "%s/topology/physical_package_id", path);
+ snprintf(new_path, ADJ_SIZE(path, "/topology/physical_package_id"),
+ "%s/topology/physical_package_id", path);
file = fopen(new_path, "r");
if (file) {
char *line = NULL;
@@ -329,7 +332,9 @@ static void do_one_cpu(char *path)
cache_index = 1;
do {
struct stat sb;
- snprintf(new_path, PATH_MAX, "%s/cache/index%d/shared_cpu_map", path, cache_index);
+ /* Extra 10 subtraction is for the max character length of %d */
+ snprintf(new_path, ADJ_SIZE(path, "/cache/index%d/shared_cpu_map") - 10,
+ "%s/cache/index%d/shared_cpu_map", path, cache_index);
cache_stat = stat(new_path, &sb);
if (!cache_stat) {
max_cache_index = cache_index;
@@ -340,7 +345,9 @@ static void do_one_cpu(char *path)
} while(!cache_stat);
if (max_cache_index > 0) {
- snprintf(new_path, PATH_MAX, "%s/cache/index%d/shared_cpu_map", path, max_cache_index);
+ /* Extra 10 subtraction is for the max character length of %d */
+ snprintf(new_path, ADJ_SIZE(path, "/cache/index%d/shared_cpu_map") - 10,
+ "%s/cache/index%d/shared_cpu_map", path, max_cache_index);
file = fopen(new_path, "r");
if (file) {
char *line = NULL;
@@ -505,7 +512,7 @@ void parse_cpu_tree(void)
sscanf(entry->d_name, "cpu%d%c", &num, &pad) == 1 &&
!strchr(entry->d_name, ' ')) {
char new_path[PATH_MAX];
- sprintf(new_path, "/sys/devices/system/cpu/%s", entry->d_name);
+ snprintf(new_path, PATH_MAX, "/sys/devices/system/cpu/%s", entry->d_name);
do_one_cpu(new_path);
}
} while (entry);
--
1.8.3.1