Package init
This commit is contained in:
parent
02658ac8c8
commit
deb8249f89
29
Checking-return-value-of-strdup-in-collect_full_irq_.patch
Normal file
29
Checking-return-value-of-strdup-in-collect_full_irq_.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From 7dafc4d5c8d8229f107c90d97f33a4094eb89c6e Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Thu, 7 Nov 2019 09:12:42 +0000
|
||||
Subject: [PATCH 1/8] backport: Checking return value of strdup() in
|
||||
collect_full_irq_list()
|
||||
|
||||
strdup() may return NULL if memory allocation fail, checking the return
|
||||
value before reference.
|
||||
|
||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
||||
---
|
||||
procinterrupts.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index 2c8118a..87fae2f 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -188,6 +188,8 @@ GList* collect_full_irq_list()
|
||||
continue;
|
||||
|
||||
savedline = strdup(line);
|
||||
+ if (!savedline)
|
||||
+ break;
|
||||
irq_name = strtok_r(savedline, " ", &savedptr);
|
||||
if (strstr(irq_name, "xen-dyn") != NULL)
|
||||
is_xen_dyn = 1;
|
||||
--
|
||||
2.19.1
|
||||
64
bugfix-fix-strcat-may-cause-buffer-overrun.patch
Normal file
64
bugfix-fix-strcat-may-cause-buffer-overrun.patch
Normal file
@ -0,0 +1,64 @@
|
||||
From f4d052d7b210612a7ffbdd7c3cfbce213c9a0e21 Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Fri, 8 Nov 2019 08:47:43 +0000
|
||||
Subject: [PATCH] irqbalance: fix strcat may cause buffer overrun
|
||||
|
||||
when the sum length of irq_name and saveptr is more than PATH_MAX, strcat will cause buffer overrun
|
||||
---
|
||||
procinterrupts.c | 26 ++++++++++++++++++--------
|
||||
1 file changed, 18 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index 373d8b5..0b24b56 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -205,6 +205,7 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
int is_xen_dyn = 0;
|
||||
#ifdef AARCH64
|
||||
char *tmp = NULL;
|
||||
+ char irq_fullname_valid = 1;
|
||||
char irq_fullname[PATH_MAX] = {0};
|
||||
#endif
|
||||
|
||||
@@ -236,12 +237,16 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
if (tmp)
|
||||
*tmp = 0;
|
||||
|
||||
- strcat(irq_fullname, irq_name);
|
||||
- strcat(irq_fullname, " ");
|
||||
- strcat(irq_fullname, savedptr);
|
||||
- tmp = strchr(irq_fullname, '\n');
|
||||
- if (tmp)
|
||||
- *tmp = 0;
|
||||
+ if (strlen(irq_name) + strlen(savedptr) + 1 < PATH_MAX) {
|
||||
+ strcat(irq_fullname, irq_name);
|
||||
+ strcat(irq_fullname, " ");
|
||||
+ strcat(irq_fullname, savedptr);
|
||||
+ tmp = strchr(irq_fullname, '\n');
|
||||
+ if (tmp)
|
||||
+ *tmp = 0;
|
||||
+ } else {
|
||||
+ irq_fullname_valid = 0;
|
||||
+ }
|
||||
#endif
|
||||
irq_mod = last_token;
|
||||
info->irq = irq;
|
||||
@@ -251,8 +256,13 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int
|
||||
info->class = IRQ_VIRT_EVENT;
|
||||
} else {
|
||||
#ifdef AARCH64
|
||||
- irq_name = irq_fullname;
|
||||
- guess_arm_irq_hints(irq_name, info);
|
||||
+ if (irq_fullname_valid) {
|
||||
+ irq_name = irq_fullname;
|
||||
+ guess_arm_irq_hints(irq_name, info);
|
||||
+ } else {
|
||||
+ info->type = IRQ_TYPE_LEGACY;
|
||||
+ info->class = IRQ_OTHER;
|
||||
+ }
|
||||
#else
|
||||
info->type = IRQ_TYPE_LEGACY;
|
||||
info->class = IRQ_OTHER;
|
||||
--
|
||||
2.19.1
|
||||
|
||||
106
correct-to-use-realloc-function.patch
Normal file
106
correct-to-use-realloc-function.patch
Normal file
@ -0,0 +1,106 @@
|
||||
From 22a40e9d0dd59ee58ff06d2b6360007e046d608f Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Thu, 7 Nov 2019 09:33:47 +0000
|
||||
Subject: [PATCH 6/8] irqbalance: correct to use realloc() function
|
||||
|
||||
The man doc about realloc() say:
|
||||
"
|
||||
If realloc() fails the original block is left untouched; it is not
|
||||
freed or move
|
||||
"
|
||||
|
||||
So make the handling of realloc() function correctly.
|
||||
|
||||
In addition, there is another problem about parameter using in
|
||||
sock_handle(), it should be use the address of @setup instead of @setup.
|
||||
|
||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
||||
---
|
||||
irqbalance.c | 33 +++++++++++++++++++++++----------
|
||||
1 file changed, 23 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/irqbalance.c b/irqbalance.c
|
||||
index c9378d0..cace4d8 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -321,14 +321,18 @@ gboolean scan(gpointer data)
|
||||
void get_irq_data(struct irq_info *irq, void *data)
|
||||
{
|
||||
char **irqdata = (char **)data;
|
||||
+ char *newptr = NULL;
|
||||
+
|
||||
if (!*irqdata)
|
||||
- *irqdata = calloc(24 + 1 + 11 + 20 + 20 + 11, 1);
|
||||
+ newptr = calloc(24 + 1 + 11 + 20 + 20 + 11, 1);
|
||||
else
|
||||
- *irqdata = realloc(*irqdata, strlen(*irqdata) + 24 + 1 + 11 + 20 + 20 + 11);
|
||||
+ newptr = realloc(*irqdata, strlen(*irqdata) + 24 + 1 + 11 + 20 + 20 + 11);
|
||||
|
||||
- if (!*irqdata)
|
||||
+ if (!newptr)
|
||||
return;
|
||||
|
||||
+ *irqdata = newptr;
|
||||
+
|
||||
sprintf(*irqdata + strlen(*irqdata),
|
||||
"IRQ %d LOAD %lu DIFF %lu CLASS %d ", irq->irq, irq->load,
|
||||
(irq->irq_count - irq->last_irq_count), irq->class);
|
||||
@@ -338,6 +342,7 @@ void get_object_stat(struct topo_obj *object, void *data)
|
||||
{
|
||||
char **stats = (char **)data;
|
||||
char *irq_data = NULL;
|
||||
+ char *newptr = NULL;
|
||||
size_t irqdlen;
|
||||
|
||||
if (g_list_length(object->interrupts) > 0) {
|
||||
@@ -355,13 +360,17 @@ void get_object_stat(struct topo_obj *object, void *data)
|
||||
* This should be adjusted if the string in the sprintf is changed
|
||||
*/
|
||||
if (!*stats) {
|
||||
- *stats = calloc(irqdlen + 31 + 11 + 20 + 11 + 1, 1);
|
||||
+ newptr = calloc(irqdlen + 31 + 11 + 20 + 11 + 1, 1);
|
||||
} else {
|
||||
- *stats = realloc(*stats, strlen(*stats) + irqdlen + 31 + 11 + 20 + 11 + 1);
|
||||
+ newptr = realloc(*stats, strlen(*stats) + irqdlen + 31 + 11 + 20 + 11 + 1);
|
||||
}
|
||||
|
||||
- if (!*stats)
|
||||
+ if (!newptr) {
|
||||
+ free(irq_data);
|
||||
return;
|
||||
+ }
|
||||
+
|
||||
+ *stats = newptr;
|
||||
|
||||
sprintf(*stats + strlen(*stats), "TYPE %d NUMBER %d LOAD %lu SAVE_MODE %d %s",
|
||||
object->obj_type, object->number, object->load,
|
||||
@@ -475,19 +484,23 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
||||
if (!strncmp(buff, "setup", strlen("setup"))) {
|
||||
char banned[512];
|
||||
char *setup = calloc(strlen("SLEEP ") + 11 + 1, 1);
|
||||
+ char *newptr = NULL;
|
||||
if (!setup)
|
||||
goto out_close;
|
||||
snprintf(setup, strlen("SLEEP ") + 11 + 1, "SLEEP %d ", sleep_interval);
|
||||
if(g_list_length(cl_banned_irqs) > 0) {
|
||||
- for_each_irq(cl_banned_irqs, get_irq_data, setup);
|
||||
+ for_each_irq(cl_banned_irqs, get_irq_data, &setup);
|
||||
}
|
||||
cpumask_scnprintf(banned, 512, banned_cpus);
|
||||
- setup = realloc(setup, strlen(setup) + strlen(banned) + 7 + 1);
|
||||
- if (!setup)
|
||||
- goto out_close;
|
||||
+ newptr = realloc(setup, strlen(setup) + strlen(banned) + 7 + 1);
|
||||
+ if (!newptr)
|
||||
+ goto out_free_setup;
|
||||
+
|
||||
+ setup = newptr;
|
||||
snprintf(setup + strlen(setup), strlen(banned) + 7 + 1,
|
||||
"BANNED %s", banned);
|
||||
send(sock, setup, strlen(setup), 0);
|
||||
+out_free_setup:
|
||||
free(setup);
|
||||
}
|
||||
|
||||
--
|
||||
2.19.1
|
||||
27
fix-resource-leak-for-not-invoking-closedir-after-op.patch
Normal file
27
fix-resource-leak-for-not-invoking-closedir-after-op.patch
Normal file
@ -0,0 +1,27 @@
|
||||
From d85897487c5f523ebc9ba8a56de911592703fed3 Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Thu, 7 Nov 2019 09:27:55 +0000
|
||||
Subject: [PATCH 5/8] backport: fix resource leak for not invoking closedir()
|
||||
after opendir()
|
||||
|
||||
fix resource leak for not invoking closedir() after opendir()
|
||||
|
||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
||||
---
|
||||
ui/irqbalance-ui.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/ui/irqbalance-ui.c b/ui/irqbalance-ui.c
|
||||
index 47dd5dc..4dfbd46 100644
|
||||
--- a/ui/irqbalance-ui.c
|
||||
+++ b/ui/irqbalance-ui.c
|
||||
@@ -418,6 +418,7 @@ int main(int argc, char **argv)
|
||||
fclose(f);
|
||||
}
|
||||
} while((entry) && (irqbalance_pid == -1));
|
||||
+ closedir(dir);
|
||||
}
|
||||
if(irqbalance_pid == -1) {
|
||||
printf("Unable to determine irqbalance PID\n");
|
||||
--
|
||||
2.19.1
|
||||
69
fix-resource-leak-on-the-error-paths-in-main.patch
Normal file
69
fix-resource-leak-on-the-error-paths-in-main.patch
Normal file
@ -0,0 +1,69 @@
|
||||
From 4bddf961e18f59b27301b73895c0ae3a6cde9b7b Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Thu, 7 Nov 2019 09:38:21 +0000
|
||||
Subject: [PATCH 8/8] backport: fix resource leak on the error paths in main()
|
||||
|
||||
Currently, both checking for core count < 2 and init_socket() fail, just
|
||||
return directly, so lead to resource leak.
|
||||
|
||||
Make it correct to free resource when on these situation.
|
||||
|
||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
||||
---
|
||||
irqbalance.c | 12 ++++++++----
|
||||
1 file changed, 8 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/irqbalance.c b/irqbalance.c
|
||||
index cace4d8..5e5ef9b 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -556,6 +556,7 @@ int init_socket()
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
sigset_t sigset, old_sigset;
|
||||
+ int ret = EXIT_SUCCESS;
|
||||
|
||||
sigemptyset(&sigset);
|
||||
sigaddset(&sigset,SIGINT);
|
||||
@@ -636,7 +637,7 @@ int main(int argc, char** argv)
|
||||
"single cpu. Shutting down\n";
|
||||
|
||||
log(TO_ALL, LOG_WARNING, "%s", msg);
|
||||
- exit(EXIT_SUCCESS);
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
if (!foreground_mode) {
|
||||
@@ -673,7 +674,8 @@ int main(int argc, char** argv)
|
||||
parse_proc_stat();
|
||||
|
||||
if (init_socket()) {
|
||||
- return EXIT_FAILURE;
|
||||
+ ret = EXIT_FAILURE;
|
||||
+ goto out;
|
||||
}
|
||||
main_loop = g_main_loop_new(NULL, FALSE);
|
||||
int *last_interval = &sleep_interval;
|
||||
@@ -682,6 +684,7 @@ int main(int argc, char** argv)
|
||||
|
||||
g_main_loop_quit(main_loop);
|
||||
|
||||
+out:
|
||||
free_object_tree();
|
||||
free_cl_opts();
|
||||
|
||||
@@ -689,9 +692,10 @@ int main(int argc, char** argv)
|
||||
if (!foreground_mode && pidfile)
|
||||
unlink(pidfile);
|
||||
/* Remove socket */
|
||||
- close(socket_fd);
|
||||
+ if (socket_fd > 0)
|
||||
+ close(socket_fd);
|
||||
if (socket_name[0])
|
||||
unlink(socket_name);
|
||||
|
||||
- return EXIT_SUCCESS;
|
||||
+ return ret;
|
||||
}
|
||||
--
|
||||
2.19.1
|
||||
66
fix-the-problem-of-banmod-that-memory-is-freed-befor.patch
Normal file
66
fix-the-problem-of-banmod-that-memory-is-freed-befor.patch
Normal file
@ -0,0 +1,66 @@
|
||||
From 559980c2e1dea1082949c17d52794c43c35f40ce Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Thu, 7 Nov 2019 09:35:42 +0000
|
||||
Subject: [PATCH 7/8] backport: fix the problem of banmod that memory is freed
|
||||
before using
|
||||
|
||||
Currently strdupa() is used to allocate memory for irq_info's name in
|
||||
collect_full_irq_list(), we know that it allocate memory from stack,
|
||||
when the invoking function return, the memory will be freed. so if the
|
||||
irq_info's name is invalid, it will lead to check_for_module_ban() no
|
||||
correct.
|
||||
|
||||
check_for_irq_ban
|
||||
check_for_module_ban(res->name) // res->name is not valid
|
||||
|
||||
Use strdup() instead of strdupa(), and free the memory of irq_info's
|
||||
name before freeing the irq_info.
|
||||
|
||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
||||
---
|
||||
classify.c | 9 ++++++++-
|
||||
procinterrupts.c | 2 +-
|
||||
2 files changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/classify.c b/classify.c
|
||||
index 3136fc3..ed3f3ba 100644
|
||||
--- a/classify.c
|
||||
+++ b/classify.c
|
||||
@@ -748,6 +748,13 @@ static void add_missing_irq(struct irq_info *info, void *attr)
|
||||
add_new_irq(info->irq, info, proc_interrupts);
|
||||
}
|
||||
|
||||
+static void free_tmp_irqs(gpointer data)
|
||||
+{
|
||||
+ struct irq_info *info = data;
|
||||
+
|
||||
+ free(info->name);
|
||||
+ free(info);
|
||||
+}
|
||||
|
||||
void rebuild_irq_db(void)
|
||||
{
|
||||
@@ -777,7 +784,7 @@ void rebuild_irq_db(void)
|
||||
|
||||
for_each_irq(tmp_irqs, add_missing_irq, interrupts_db);
|
||||
|
||||
- g_list_free_full(tmp_irqs, free);
|
||||
+ g_list_free_full(tmp_irqs, free_tmp_irqs);
|
||||
|
||||
}
|
||||
|
||||
diff --git a/procinterrupts.c b/procinterrupts.c
|
||||
index 87fae2f..11fe1bc 100644
|
||||
--- a/procinterrupts.c
|
||||
+++ b/procinterrupts.c
|
||||
@@ -228,7 +228,7 @@ GList* collect_full_irq_list()
|
||||
info->class = IRQ_OTHER;
|
||||
#endif
|
||||
}
|
||||
- info->name = strdupa(irq_mod);
|
||||
+ info->name = strdup(irq_mod);
|
||||
tmp_list = g_list_append(tmp_list, info);
|
||||
}
|
||||
free(savedline);
|
||||
--
|
||||
2.19.1
|
||||
35
free-the-memory-when-getline-fail-in-add_one_node.patch
Normal file
35
free-the-memory-when-getline-fail-in-add_one_node.patch
Normal file
@ -0,0 +1,35 @@
|
||||
From 0f7965c9cc3963c4dbfa7b61820ff973ef5da539 Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Thu, 7 Nov 2019 09:22:15 +0000
|
||||
Subject: [PATCH 3/8] backport: free the memory when getline() fail in
|
||||
add_one_node()
|
||||
|
||||
when getline() fail, the memory still need to be freed.
|
||||
|
||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
||||
---
|
||||
numa.c | 7 +++----
|
||||
1 file changed, 3 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/numa.c b/numa.c
|
||||
index f0b1a98..542e1f4 100644
|
||||
--- a/numa.c
|
||||
+++ b/numa.c
|
||||
@@ -74,12 +74,11 @@ static void add_one_node(const char *nodename)
|
||||
cpus_clear(new->mask);
|
||||
} else {
|
||||
ret = getline(&cpustr, &blen, f);
|
||||
- if (ret <= 0) {
|
||||
+ if (ret <= 0)
|
||||
cpus_clear(new->mask);
|
||||
- } else {
|
||||
+ else
|
||||
cpumask_parse_user(cpustr, ret, new->mask);
|
||||
- free(cpustr);
|
||||
- }
|
||||
+ free(cpustr);
|
||||
}
|
||||
fclose(f);
|
||||
new->obj_type = OBJ_TYPE_NODE;
|
||||
--
|
||||
2.19.1
|
||||
106
getline-clean-up-freeing-of-lines-from-getline.patch
Normal file
106
getline-clean-up-freeing-of-lines-from-getline.patch
Normal file
@ -0,0 +1,106 @@
|
||||
From 9fd716f6627c0bb3b63cef94780e20101d9616c3 Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Thu, 7 Nov 2019 09:19:33 +0000
|
||||
Subject: [PATCH 2/8] backport:
|
||||
getline-clean-up-freeing-of-lines-from-getline.patch
|
||||
|
||||
It was noted that several calls to getline failed to free the resultant line,
|
||||
which the man page for getline says to do even if the call fails. Clean that up
|
||||
here
|
||||
|
||||
And while we're at it, merge some of the free calls so they're common to a
|
||||
function where they can be, and not strewn all over the place
|
||||
|
||||
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
|
||||
---
|
||||
cputree.c | 29 +++++++++++++++++------------
|
||||
1 file changed, 17 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/cputree.c b/cputree.c
|
||||
index 5551784..91919ec 100644
|
||||
--- a/cputree.c
|
||||
+++ b/cputree.c
|
||||
@@ -91,10 +91,10 @@ static void setup_banned_cpus(void)
|
||||
if (getline(&line, &size, file) > 0) {
|
||||
if (strlen(line) && line[0] != '\n')
|
||||
cpulist_parse(line, strlen(line), isolated_cpus);
|
||||
- free(line);
|
||||
- line = NULL;
|
||||
- size = 0;
|
||||
}
|
||||
+ free(line);
|
||||
+ line = NULL;
|
||||
+ size = 0;
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
@@ -103,10 +103,10 @@ static void setup_banned_cpus(void)
|
||||
if (getline(&line, &size, file) > 0) {
|
||||
if (strlen(line) && line[0] != '\n')
|
||||
cpulist_parse(line, strlen(line), nohz_full);
|
||||
- free(line);
|
||||
- line = NULL;
|
||||
- size = 0;
|
||||
}
|
||||
+ free(line);
|
||||
+ line = NULL;
|
||||
+ size = 0;
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
@@ -271,6 +271,7 @@ static void do_one_cpu(char *path)
|
||||
int nodeid;
|
||||
int packageid = 0;
|
||||
unsigned int max_cache_index, cache_index, cache_stat;
|
||||
+ int ret = 1;
|
||||
|
||||
/* skip offline cpus */
|
||||
snprintf(new_path, ADJ_SIZE(path,"/online"), "%s/online", path);
|
||||
@@ -278,14 +279,12 @@ static void do_one_cpu(char *path)
|
||||
if (file) {
|
||||
char *line = NULL;
|
||||
size_t size = 0;
|
||||
- if (getline(&line, &size, file)==0)
|
||||
- return;
|
||||
+ if (getline(&line, &size, file)>0)
|
||||
+ ret = (line && line[0]=='0') ? 1 : 0;
|
||||
fclose(file);
|
||||
- if (line && line[0]=='0') {
|
||||
- free(line);
|
||||
- return;
|
||||
- }
|
||||
free(line);
|
||||
+ if (ret)
|
||||
+ return;
|
||||
}
|
||||
|
||||
cpu = calloc(sizeof(struct topo_obj), 1);
|
||||
@@ -327,6 +326,8 @@ static void do_one_cpu(char *path)
|
||||
cpumask_parse_user(line, strlen(line), package_mask);
|
||||
fclose(file);
|
||||
free(line);
|
||||
+ line = NULL;
|
||||
+ size = 0;
|
||||
}
|
||||
/* try to read the package id */
|
||||
snprintf(new_path, ADJ_SIZE(path, "/topology/physical_package_id"),
|
||||
@@ -339,6 +340,8 @@ static void do_one_cpu(char *path)
|
||||
packageid = strtoul(line, NULL, 10);
|
||||
fclose(file);
|
||||
free(line);
|
||||
+ line = NULL;
|
||||
+ size = 0;
|
||||
}
|
||||
|
||||
/* try to read the cache mask; if it doesn't exist assume solitary */
|
||||
@@ -372,6 +375,8 @@ static void do_one_cpu(char *path)
|
||||
cpumask_parse_user(line, strlen(line), cache_mask);
|
||||
fclose(file);
|
||||
free(line);
|
||||
+ line = NULL;
|
||||
+ size = 0;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.19.1
|
||||
109
prevent-NULL-pointer-dereference-when-memory-allocat.patch
Normal file
109
prevent-NULL-pointer-dereference-when-memory-allocat.patch
Normal file
@ -0,0 +1,109 @@
|
||||
From f37fe357b21ffd7ab210b088c36300d9562406cb Mon Sep 17 00:00:00 2001
|
||||
From: liuchao173 <liuchao173@huawei.com>
|
||||
Date: Thu, 7 Nov 2019 09:26:30 +0000
|
||||
Subject: [PATCH 4/8] backport: prevent NULL pointer dereference when memory
|
||||
allocation failure
|
||||
|
||||
There are several places where memory allocation does not check return
|
||||
values, adding null pointer checks.
|
||||
|
||||
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
|
||||
---
|
||||
cputree.c | 2 ++
|
||||
irqbalance.c | 20 ++++++++++++++++++++
|
||||
2 files changed, 22 insertions(+)
|
||||
|
||||
diff --git a/cputree.c b/cputree.c
|
||||
index 91919ec..9cd2db8 100644
|
||||
--- a/cputree.c
|
||||
+++ b/cputree.c
|
||||
@@ -432,6 +432,8 @@ static void dump_irq(struct irq_info *info, void *data)
|
||||
int i;
|
||||
char * indent = malloc (sizeof(char) * (spaces + 1));
|
||||
|
||||
+ if (!indent)
|
||||
+ return;
|
||||
for ( i = 0; i < spaces; i++ )
|
||||
indent[i] = log_indent[0];
|
||||
|
||||
diff --git a/irqbalance.c b/irqbalance.c
|
||||
index 93e4909..c9378d0 100644
|
||||
--- a/irqbalance.c
|
||||
+++ b/irqbalance.c
|
||||
@@ -326,6 +326,9 @@ void get_irq_data(struct irq_info *irq, void *data)
|
||||
else
|
||||
*irqdata = realloc(*irqdata, strlen(*irqdata) + 24 + 1 + 11 + 20 + 20 + 11);
|
||||
|
||||
+ if (!*irqdata)
|
||||
+ return;
|
||||
+
|
||||
sprintf(*irqdata + strlen(*irqdata),
|
||||
"IRQ %d LOAD %lu DIFF %lu CLASS %d ", irq->irq, irq->load,
|
||||
(irq->irq_count - irq->last_irq_count), irq->class);
|
||||
@@ -357,6 +360,9 @@ void get_object_stat(struct topo_obj *object, void *data)
|
||||
*stats = realloc(*stats, strlen(*stats) + irqdlen + 31 + 11 + 20 + 11 + 1);
|
||||
}
|
||||
|
||||
+ if (!*stats)
|
||||
+ return;
|
||||
+
|
||||
sprintf(*stats + strlen(*stats), "TYPE %d NUMBER %d LOAD %lu SAVE_MODE %d %s",
|
||||
object->obj_type, object->number, object->load,
|
||||
object->powersave_mode, irq_data ? irq_data : "");
|
||||
@@ -393,6 +399,10 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
||||
goto out_close;
|
||||
}
|
||||
cmsg = CMSG_FIRSTHDR(&msg);
|
||||
+ if (!cmsg) {
|
||||
+ log(TO_ALL, LOG_WARNING, "Connection no memory.\n");
|
||||
+ goto out_close;
|
||||
+ }
|
||||
if ((cmsg->cmsg_level == SOL_SOCKET) &&
|
||||
(cmsg->cmsg_type == SCM_CREDENTIALS)) {
|
||||
struct ucred *credentials = (struct ucred *) CMSG_DATA(cmsg);
|
||||
@@ -416,6 +426,8 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
||||
strlen("sleep ")))) {
|
||||
char *sleep_string = malloc(
|
||||
sizeof(char) * (recv_size - strlen("settings sleep ")));
|
||||
+ if (!sleep_string)
|
||||
+ goto out_close;
|
||||
strncpy(sleep_string, buff + strlen("settings sleep "),
|
||||
recv_size - strlen("settings sleep "));
|
||||
int new_iterval = strtoul(sleep_string, NULL, 10);
|
||||
@@ -428,6 +440,8 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
||||
char *end;
|
||||
char *irq_string = malloc(
|
||||
sizeof(char) * (recv_size - strlen("settings ban irqs ")));
|
||||
+ if (!irq_string)
|
||||
+ goto out_close;
|
||||
strncpy(irq_string, buff + strlen("settings ban irqs "),
|
||||
recv_size - strlen("settings ban irqs "));
|
||||
g_list_free_full(cl_banned_irqs, free);
|
||||
@@ -446,6 +460,8 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
||||
strlen("cpus")))) {
|
||||
char *cpu_ban_string = malloc(
|
||||
sizeof(char) * (recv_size - strlen("settings cpus ")));
|
||||
+ if (!cpu_ban_string)
|
||||
+ goto out_close;
|
||||
strncpy(cpu_ban_string, buff + strlen("settings cpus "),
|
||||
recv_size - strlen("settings cpus "));
|
||||
banned_cpumask_from_ui = strtok(cpu_ban_string, " ");
|
||||
@@ -459,12 +475,16 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
|
||||
if (!strncmp(buff, "setup", strlen("setup"))) {
|
||||
char banned[512];
|
||||
char *setup = calloc(strlen("SLEEP ") + 11 + 1, 1);
|
||||
+ if (!setup)
|
||||
+ goto out_close;
|
||||
snprintf(setup, strlen("SLEEP ") + 11 + 1, "SLEEP %d ", sleep_interval);
|
||||
if(g_list_length(cl_banned_irqs) > 0) {
|
||||
for_each_irq(cl_banned_irqs, get_irq_data, setup);
|
||||
}
|
||||
cpumask_scnprintf(banned, 512, banned_cpus);
|
||||
setup = realloc(setup, strlen(setup) + strlen(banned) + 7 + 1);
|
||||
+ if (!setup)
|
||||
+ goto out_close;
|
||||
snprintf(setup + strlen(setup), strlen(banned) + 7 + 1,
|
||||
"BANNED %s", banned);
|
||||
send(sock, setup, strlen(setup), 0);
|
||||
--
|
||||
2.19.1
|
||||
Loading…
x
Reference in New Issue
Block a user