Put the code for appending the optional "buildid" into a helper
function, It makes __sprint_symbol() better readable.

Also print a warning when the "modname" is set and the "buildid" isn't.
It might catch a situation when some lookup function in
kallsyms_lookup_buildid() does not handle the "buildid".

Use pr_*_once() to avoid an infinite recursion when the function
is called from printk(). The recursion is rather theoretical but
better be on the safe side.

Signed-off-by: Petr Mladek <[email protected]>
---
 kernel/kallsyms.c | 42 +++++++++++++++++++++++++++++++++---------
 1 file changed, 33 insertions(+), 9 deletions(-)

diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index ffb64eaa0505..f25b122397ce 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -432,6 +432,37 @@ int lookup_symbol_name(unsigned long addr, char *symname)
        return lookup_module_symbol_name(addr, symname);
 }
 
+#ifdef CONFIG_STACKTRACE_BUILD_ID
+
+static int append_buildid(char *buffer,  const char *modname,
+                         const unsigned char *buildid)
+{
+       if (!modname)
+               return 0;
+
+       if (!buildid) {
+               pr_warn_once("Undefined buildid for the module %s\n", modname);
+               return 0;
+       }
+
+       /* build ID should match length of sprintf */
+#ifdef CONFIG_MODULES
+       static_assert(sizeof(typeof_member(struct module, build_id)) == 20);
+#endif
+
+       return sprintf(buffer, " %20phN", buildid);
+}
+
+#else /* CONFIG_STACKTRACE_BUILD_ID */
+
+static int append_buildid(char *buffer,   const char *modname,
+                         const unsigned char *buildid)
+{
+       return 0;
+}
+
+#endif /* CONFIG_STACKTRACE_BUILD_ID */
+
 /* Look up a kernel symbol and return it in a text buffer. */
 static int __sprint_symbol(char *buffer, unsigned long address,
                           int symbol_offset, int add_offset, int add_buildid)
@@ -454,15 +485,8 @@ static int __sprint_symbol(char *buffer, unsigned long 
address,
 
        if (modname) {
                len += sprintf(buffer + len, " [%s", modname);
-#if IS_ENABLED(CONFIG_STACKTRACE_BUILD_ID)
-               if (add_buildid && buildid) {
-                       /* build ID should match length of sprintf */
-#if IS_ENABLED(CONFIG_MODULES)
-                       static_assert(sizeof(typeof_member(struct module, 
build_id)) == 20);
-#endif
-                       len += sprintf(buffer + len, " %20phN", buildid);
-               }
-#endif
+               if (add_buildid)
+                       len += append_buildid(buffer + len, modname, buildid);
                len += sprintf(buffer + len, "]");
        }
 
-- 
2.52.0


Reply via email to