A possible issue with the kpatch software was discovered during testing
in the 6.6 and above kernel:
livepatch: symbol .klp.sym.vmlinux-bringup_idt_table,5438511 has an
incorrectly formatted name.

The "-" between ".vmlinux-bringup_idt_table" cannot be parsed in the
current kernel. Of course, this is a problem generated by the kpatch
software.

Perhaps, we could adopt the approach in the patch to skip the error
symbols compiled by kpatch.

Signed-off-by: Li kunyu <[email protected]>
---
 kernel/livepatch/core.c | 29 +++++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
index 0e73fac55f8e..74b07a1b6c1f 100644
--- a/kernel/livepatch/core.c
+++ b/kernel/livepatch/core.c
@@ -199,6 +199,7 @@ static int klp_resolve_symbols(Elf_Shdr *sechdrs, const 
char *strtab,
        unsigned long sympos, addr;
        bool sym_vmlinux;
        bool sec_vmlinux = !strcmp(sec_objname, "vmlinux");
+       bool reload = false;
 
        /*
         * Since the field widths for sym_objname and sym_name in the sscanf()
@@ -227,12 +228,32 @@ static int klp_resolve_symbols(Elf_Shdr *sechdrs, const 
char *strtab,
                             ".klp.sym.%55[^.].%511[^,],%lu",
                             sym_objname, sym_name, &sympos);
                if (cnt != 3) {
-                       pr_err("symbol %s has an incorrectly formatted name\n",
-                              strtab + sym->st_name);
-                       return -EINVAL;
+                       if (strchr(strtab + sym->st_name, '-')) {
+                               memset(sym_objname, 0, strlen(sym_objname));
+                               memset(sym_name, 0, strlen(sym_name));
+                               cnt = sscanf(strtab + sym->st_name,
+                                            ".klp.sym.%55[^-]-%511[^,],%lu",
+                                            sym_objname, sym_name, &sympos);
+                               if (cnt != 3) {
+                                       pr_err("symbol %s has an incorrectly 
formatted name, " \
+                                               "cnt=%d, sym_objname:%s, 
sym_name:%s\n",
+                                               strtab + sym->st_name, cnt, 
sym_objname, sym_name);
+                                       return -EINVAL;
+                               }
+                               reload = true;
+                               sympos = 1;
+                       } else {
+
+                               pr_err("symbol %s has an incorrectly formatted 
name\n",
+                                       strtab + sym->st_name);
+                               return -EINVAL;
+                       }
                }
 
-               sym_vmlinux = !strcmp(sym_objname, "vmlinux");
+               if (!reload)
+                       sym_vmlinux = !strcmp(sym_objname, "vmlinux");
+               else
+                       sym_vmlinux = sec_vmlinux;
 
                /*
                 * Prevent module-specific KLP rela sections from referencing
-- 
2.47.3


Reply via email to