fix kernel modules build after updating linux to v5.9.2

- `dep.c` and `dep2.c`: `debugfs_create_u32` does not return anymore, not
  sure why:
  https://unix.stackexchange.com/questions/593983/creating-a-debugfs-file-that-is-used-to-read-write-u32-value/621282#621282
  So just doing `debugfs_lookup` for now
- vermagic.c:
  51161bfc66
  prevents its usage in v5.8. Just migrating to `init_utsname` for now
- procfs.c: `struct file_operations` moved to a new `struct proc_ops` at:
  b567e07513
- myprintk.c: `pr_warning` dropped for `pr_warn`:
  61ff72f401
- `poll.c`: `kthread_func` is not defined in kernel, prefix with lkmc to
  avoid conflict

Fix https://github.com/cirosantilli/linux-kernel-module-cheat/issues/136

Fix https://github.com/cirosantilli/linux-kernel-module-cheat/issues/137
This commit is contained in:
Ciro Santilli 六四事件 法轮功
2020-11-24 00:00:01 +00:00
parent fa8c2ee521
commit 50570326d4
9 changed files with 65 additions and 34 deletions

View File

@@ -6765,7 +6765,22 @@ Bibliography:
==== vermagic ==== vermagic
Vermagic is a magic string present in the kernel and on <<module-info>> of kernel modules. It is used to verify that the kernel module was compiled against a compatible kernel version and relevant configuration: link:kernel_modules/vermagic.c[]
As of kernel v5.8, you can't use `VERMAGIC_STRING` string from modules anymore as per: https://github.com/cirosantilli/linux/commit/51161bfc66a68d21f13d15a689b3ea7980457790[]. So instead we just showcase `init_utsname`.
Sample insmod output as of LKMC fa8c2ee521ea83a74a2300e7a3be9f9ab86e2cb6 + 1 aarch64:
....
<6>[ 25.180697] sysname = Linux
<6>[ 25.180697] nodename = buildroot
<6>[ 25.180697] release = 5.9.2
<6>[ 25.180697] version = #1 SMP Thu Jan 1 00:00:00 UTC 1970
<6>[ 25.180697] machine = aarch64
<6>[ 25.180697] domainname = (none)
....
Vermagic is a magic string present in the kernel and previously visible in <<module-info>> on kernel modules. It is used to verify that the kernel module was compiled against a compatible kernel version and relevant configuration:
.... ....
insmod vermagic.ko insmod vermagic.ko
@@ -6777,8 +6792,6 @@ Possible dmesg output:
VERMAGIC_STRING = 4.17.0 SMP mod_unload modversions VERMAGIC_STRING = 4.17.0 SMP mod_unload modversions
.... ....
Source: link:kernel_modules/vermagic.c[]
If we artificially create a mismatch with `MODULE_INFO(vermagic`, the insmod fails with: If we artificially create a mismatch with `MODULE_INFO(vermagic`, the insmod fails with:
.... ....

View File

@@ -33,17 +33,12 @@ static const struct file_operations fops = {
static int myinit(void) static int myinit(void)
{ {
struct dentry *file;
dir = debugfs_create_dir("lkmc_debugfs", 0); dir = debugfs_create_dir("lkmc_debugfs", 0);
if (!dir) { if (!dir) {
pr_alert("debugfs_create_dir failed"); pr_alert("debugfs_create_dir failed");
return -1; return -1;
} }
file = debugfs_create_u32("myfile", S_IRUSR | S_IWUSR, dir, &value); debugfs_create_u32("myfile", S_IRUSR | S_IWUSR, dir, &value);
if (!file) {
pr_alert("debugfs_create_u32 failed");
return -1;
}
/* Created on the toplevel of the debugfs mount, /* Created on the toplevel of the debugfs mount,
* and with explicit fops instead of a fixed integer value. * and with explicit fops instead of a fixed integer value.

View File

@@ -6,17 +6,18 @@
u32 lkmc_dep = 0; u32 lkmc_dep = 0;
EXPORT_SYMBOL(lkmc_dep); EXPORT_SYMBOL(lkmc_dep);
static struct dentry *debugfs_file; static char *debugfs_filename = "lkmc_dep";
static int myinit(void) static int myinit(void)
{ {
debugfs_file = debugfs_create_u32("lkmc_dep", S_IRUSR | S_IWUSR, NULL, &lkmc_dep); debugfs_create_u32(debugfs_filename, S_IRUSR | S_IWUSR, NULL, &lkmc_dep);
return 0; return 0;
} }
static void myexit(void) static void myexit(void)
{ {
debugfs_remove(debugfs_file);
debugfs_remove(debugfs_lookup(debugfs_filename, NULL));
} }
module_init(myinit) module_init(myinit)

View File

@@ -5,17 +5,17 @@
#include <linux/module.h> #include <linux/module.h>
extern u32 lkmc_dep; extern u32 lkmc_dep;
static struct dentry *debugfs_file; static char *debugfs_filename = "lkmc_dep2";
static int myinit(void) static int myinit(void)
{ {
debugfs_file = debugfs_create_u32("lkmc_dep2", S_IRUSR | S_IWUSR, NULL, &lkmc_dep); debugfs_create_u32(debugfs_filename, S_IRUSR | S_IWUSR, NULL, &lkmc_dep);
return 0; return 0;
} }
static void myexit(void) static void myexit(void)
{ {
debugfs_remove(debugfs_file); debugfs_remove(debugfs_lookup(debugfs_filename, NULL));
} }
module_init(myinit) module_init(myinit)

View File

@@ -1,5 +1,6 @@
/* https://cirosantilli.com/linux-kernel-module-cheat#mmap */ /* https://cirosantilli.com/linux-kernel-module-cheat#mmap */
#include <asm-generic/io.h> /* virt_to_phys */
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> /* min */ #include <linux/kernel.h> /* min */
@@ -120,17 +121,17 @@ static int release(struct inode *inode, struct file *filp)
return 0; return 0;
} }
static const struct file_operations fops = { static const struct proc_ops pops = {
.mmap = mmap, .proc_mmap = mmap,
.open = open, .proc_open = open,
.release = release, .proc_release = release,
.read = read, .proc_read = read,
.write = write, .proc_write = write,
}; };
static int myinit(void) static int myinit(void)
{ {
proc_create(filename, 0, NULL, &fops); proc_create(filename, 0, NULL, &pops);
return 0; return 0;
} }

View File

@@ -8,7 +8,7 @@ static int myinit(void)
pr_alert("pr_alert\n"); pr_alert("pr_alert\n");
pr_crit("pr_crit\n"); pr_crit("pr_crit\n");
pr_err("pr_err"); pr_err("pr_err");
pr_warning("pr_warning\n"); pr_warn("pr_warning\n");
pr_notice("pr_notice\n"); pr_notice("pr_notice\n");
pr_info("pr_info\n"); pr_info("pr_info\n");
pr_debug("pr_debug\n"); pr_debug("pr_debug\n");

View File

@@ -54,7 +54,7 @@ unsigned int poll(struct file *filp, struct poll_table_struct *wait)
} }
} }
static int kthread_func(void *data) static int lkmc_kthread_func(void *data)
{ {
while (!kthread_should_stop()) { while (!kthread_should_stop()) {
readbuflen = snprintf( readbuflen = snprintf(
@@ -81,7 +81,7 @@ static int myinit(void)
debugfs_file = debugfs_create_file( debugfs_file = debugfs_create_file(
"lkmc_poll", S_IRUSR | S_IWUSR, NULL, NULL, &fops); "lkmc_poll", S_IRUSR | S_IWUSR, NULL, NULL, &fops);
init_waitqueue_head(&waitqueue); init_waitqueue_head(&waitqueue);
kthread = kthread_create(kthread_func, NULL, "mykthread"); kthread = kthread_create(lkmc_kthread_func, NULL, "mykthread");
wake_up_process(kthread); wake_up_process(kthread);
return 0; return 0;
} }

View File

@@ -1,6 +1,5 @@
/* https://cirosantilli.com/linux-kernel-module-cheat#procfs */ /* https://cirosantilli.com/linux-kernel-module-cheat#procfs */
#include <linux/debugfs.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> /* seq_read, seq_lseek, single_open, single_release */ #include <linux/seq_file.h> /* seq_read, seq_lseek, single_open, single_release */
@@ -19,17 +18,16 @@ static int open(struct inode *inode, struct file *file)
return single_open(file, show, NULL); return single_open(file, show, NULL);
} }
static const struct file_operations fops = { static const struct proc_ops pops = {
.llseek = seq_lseek, .proc_lseek = seq_lseek,
.open = open, .proc_open = open,
.owner = THIS_MODULE, .proc_read = seq_read,
.read = seq_read, .proc_release = single_release,
.release = single_release,
}; };
static int myinit(void) static int myinit(void)
{ {
proc_create(filename, 0, NULL, &fops); proc_create(filename, 0, NULL, &pops);
return 0; return 0;
} }

View File

@@ -2,11 +2,34 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/vermagic.h> #include <linux/utsname.h>
#if 0
#include <linux/vermagic.h> /* VERMAGIC_STRING */
#endif
static int myinit(void) static int myinit(void)
{ {
struct new_utsname *uts = init_utsname();
pr_info(
"sysname = %s\n"
"nodename = %s\n"
"release = %s\n"
"version = %s\n"
"machine = %s\n"
"domainname = %s\n",
uts->sysname,
uts->nodename,
uts->release,
uts->version,
uts->machine,
uts->domainname
);
#if 0
/* Possible before v5.8, but was buggy apparently, not sure why:
* https://github.com/cirosantilli/linux/commit/51161bfc66a68d21f13d15a689b3ea7980457790 */
pr_info("VERMAGIC_STRING = " VERMAGIC_STRING "\n"); pr_info("VERMAGIC_STRING = " VERMAGIC_STRING "\n");
#endif
/* Nice try, but it is not a member. */ /* Nice try, but it is not a member. */
/*pr_info("THIS_MODULE->vermagic = %s\n", THIS_MODULE->vermagic);*/ /*pr_info("THIS_MODULE->vermagic = %s\n", THIS_MODULE->vermagic);*/
return 0; return 0;