In some kernel modules such as libie.ko, the mem[MOD_TEXT].size
may be zero, currently crash will only check its value to determine
if the module is valid, otherwise it fails to load kernel module with
the following warning and error:

  WARNING: invalid kernel module size: 0
        KERNEL: /lib/modules/6.10.0-rc1+/build/vmlinux
      DUMPFILE: /proc/kcore
          CPUS: 64
          DATE: Wed Jun  5 12:49:02 IDT 2024
        UPTIME: 5 days, 05:57:21
  LOAD AVERAGE: 0.28, 0.06, 0.02
         TASKS: 806
      NODENAME: xxxx
       RELEASE: 6.10.0-rc1+
       VERSION: #1 SMP PREEMPT_DYNAMIC Fri May 31 04:56:59 IDT 2024
       MACHINE: x86_64  (2100 Mhz)
        MEMORY: 1.6 GB
           PID: 203686
       COMMAND: "crash"
          TASK: ffff9f9bf66d0000  [THREAD_INFO: ffff9f9bf66d0000]
           CPU: 52
         STATE: TASK_RUNNING (ACTIVE)

  crash> mod
  mod: cannot access vmalloc'd module memory
  crash>

Lets count the module size to check if the module is valid, that will
avoid the current failure.

Signed-off-by: Lianbo Jiang <liji...@redhat.com>
---
 kernel.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/kernel.c b/kernel.c
index 1728b70c1b5c..e0dc23b9b233 100644
--- a/kernel.c
+++ b/kernel.c
@@ -3821,9 +3821,21 @@ module_init(void)
                case KALLSYMS_V2:
                        if (THIS_KERNEL_VERSION >= LINUX(2,6,27)) {
                                numksyms = UINT(modbuf + 
OFFSET(module_num_symtab));
-                               if (MODULE_MEMORY())
-                                       /* check mem[MOD_TEXT].size only */
-                                       size = UINT(modbuf + OFFSET(module_mem) 
+ OFFSET(module_memory_size));
+                               if (MODULE_MEMORY()) {
+                                       /*
+                                        * The mem[MOD_TEXT].size may be zero, 
lets count
+                                        * the module size as below.
+                                       */
+                                       int t;
+                                       size = 0;
+                                       for_each_mod_mem_type(t) {
+                                               if (t == MOD_INIT_TEXT)
+                                                       break;
+                                               size += UINT(modbuf + 
OFFSET(module_mem) +
+                                                               
SIZE(module_memory) * t +
+                                                               
OFFSET(module_memory_size));
+                                       }
+                               }
                                else
                                        size = UINT(modbuf + 
MODULE_OFFSET2(module_core_size, rx));
                        } else {
@@ -3926,7 +3938,7 @@ verify_modules(void)
 
                 for (i = 0, found = FALSE; i < kt->mods_installed; i++) {
                         lm = &st->load_modules[i];
-                       if (!kvtop(NULL, lm->mod_base, &paddr, 0)) {
+                       if (lm->mod_base && !kvtop(NULL, lm->mod_base, &paddr, 
0)) {
                                irregularities++;
                                 break;
                        }
-- 
2.45.1
--
Crash-utility mailing list -- devel@lists.crash-utility.osci.io
To unsubscribe send an email to devel-le...@lists.crash-utility.osci.io
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to