]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
riscv: module: remove relocation_head rel_entry member allocation
authorClément Léger <cleger@rivosinc.com>
Thu, 28 Nov 2024 08:16:34 +0000 (09:16 +0100)
committerPalmer Dabbelt <palmer@rivosinc.com>
Wed, 8 Jan 2025 18:22:52 +0000 (10:22 -0800)
relocation_head's list_head member, rel_entry, doesn't need to be
allocated, its storage can just be part of the allocated relocation_head.
Remove the pointer which allows to get rid of the allocation as well as
an existing memory leak found by Kai Zhang using kmemleak.

Fixes: 8fd6c5142395 ("riscv: Add remaining module relocations")
Reported-by: Kai Zhang <zhangkai@iscas.ac.cn>
Signed-off-by: Clément Léger <cleger@rivosinc.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
Tested-by: Charlie Jenkins <charlie@rivosinc.com>
Link: https://lore.kernel.org/r/20241128081636.3620468-1-cleger@rivosinc.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/kernel/module.c

index 1cd461f3d8726dec16c211136897b7dd41580a7c..47d0ebeec93c23bccfb6edbd91e9a4f8a4fa6476 100644 (file)
@@ -23,7 +23,7 @@ struct used_bucket {
 
 struct relocation_head {
        struct hlist_node node;
-       struct list_head *rel_entry;
+       struct list_head rel_entry;
        void *location;
 };
 
@@ -634,7 +634,7 @@ process_accumulated_relocations(struct module *me,
                        location = rel_head_iter->location;
                        list_for_each_entry_safe(rel_entry_iter,
                                                 rel_entry_iter_tmp,
-                                                rel_head_iter->rel_entry,
+                                                &rel_head_iter->rel_entry,
                                                 head) {
                                curr_type = rel_entry_iter->type;
                                reloc_handlers[curr_type].reloc_handler(
@@ -704,16 +704,7 @@ static int add_relocation_to_accumulate(struct module *me, int type,
                        return -ENOMEM;
                }
 
-               rel_head->rel_entry =
-                       kmalloc(sizeof(struct list_head), GFP_KERNEL);
-
-               if (!rel_head->rel_entry) {
-                       kfree(entry);
-                       kfree(rel_head);
-                       return -ENOMEM;
-               }
-
-               INIT_LIST_HEAD(rel_head->rel_entry);
+               INIT_LIST_HEAD(&rel_head->rel_entry);
                rel_head->location = location;
                INIT_HLIST_NODE(&rel_head->node);
                if (!current_head->first) {
@@ -722,7 +713,6 @@ static int add_relocation_to_accumulate(struct module *me, int type,
 
                        if (!bucket) {
                                kfree(entry);
-                               kfree(rel_head->rel_entry);
                                kfree(rel_head);
                                return -ENOMEM;
                        }
@@ -735,7 +725,7 @@ static int add_relocation_to_accumulate(struct module *me, int type,
        }
 
        /* Add relocation to head of discovered rel_head */
-       list_add_tail(&entry->head, rel_head->rel_entry);
+       list_add_tail(&entry->head, &rel_head->rel_entry);
 
        return 0;
 }