From 237b27869e3adffe10219b990a5950f27dbec79d Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Thu, 5 Jul 2018 02:01:17 +0100 Subject: [PATCH] kstrto: move doc to README --- README.adoc | 24 ++++++++++++++++++++ kernel_module/README.adoc | 2 -- kernel_module/kstrto.c | 46 ++++++++++++++++++++++++-------------- rootfs_overlay/kstrto.sh | 11 ++++----- rootfs_overlay/test_all.sh | 1 + 5 files changed, 60 insertions(+), 24 deletions(-) diff --git a/README.adoc b/README.adoc index 58d311f..5423651 100644 --- a/README.adoc +++ b/README.adoc @@ -4076,6 +4076,30 @@ The module also shows which handlers are registered for each IRQ, as we have obs When in text mode, we can also observe interrupt line 4 with handler `ttyS0` increase continuously as IO goes through the UART. +=== Linux kernel utility functions + +==== kstrto + +Convert a string to an integer: + +.... +/kstrto.sh +echo $? +.... + +Outcome: the test passes: + +.... +0 +.... + +Sources: + +* link:kernel_module/kstrto.c[] +* link:rootfs_overlay/kstrto.sh[] + +Bibliography: https://stackoverflow.com/questions/6139493/how-convert-char-to-int-in-linux-kernel/49811658#49811658 + === Linux kernel tracing Good overviews: diff --git a/kernel_module/README.adoc b/kernel_module/README.adoc index 449a502..fc31f79 100644 --- a/kernel_module/README.adoc +++ b/kernel_module/README.adoc @@ -12,8 +12,6 @@ Our kernel modules! . Misc .. link:virt_to_phys.c[] .. link:netlink.c[] -. Utilities -.. link:kstrto.c[] . Hardening .. link:strlen_overflow.c[] . Tracing diff --git a/kernel_module/kstrto.c b/kernel_module/kstrto.c index 5a5703f..32cb765 100644 --- a/kernel_module/kstrto.c +++ b/kernel_module/kstrto.c @@ -1,36 +1,48 @@ -/* -https://stackoverflow.com/questions/6139493/how-convert-char-to-int-in-linux-kernel/49811658#49811658 - -Usage: - - /kstrto.sh -*/ +/* https://github.com/cirosantilli/linux-kernel-module-cheat#kstrto */ #include #include #include -#include /* S_IRUSR */ +#include +#include /* copy_from_user, copy_to_user */ +#include /* S_IWUSR */ static struct dentry *toplevel_file; +static char read_buf[1024]; + +static int show(struct seq_file *m, void *v) +{ + seq_printf(m, read_buf); + return 0; +} + +static int open(struct inode *inode, struct file *file) +{ + return single_open(file, show, NULL); +} static ssize_t write(struct file *filp, const char __user *buf, size_t len, loff_t *off) { - int ret; - unsigned long long res; - ret = kstrtoull_from_user(buf, len, 10, &res); - if (ret) { + ssize_t ret; + int kstrto_return; + unsigned long long kstrto_result; + kstrto_return = kstrtoull_from_user(buf, len, 10, &kstrto_result); + if (kstrto_return) { /* Negative error code. */ - pr_info("ko = %d\n", ret); - return ret; + ret = kstrto_return; } else { - pr_info("ok = %llu\n", res); - *off= len; - return len; + ret = len; } + snprintf(read_buf, sizeof(read_buf), "%llu", kstrto_result + 1); + return ret; } static const struct file_operations fops = { + .llseek = seq_lseek, + .open = open, .owner = THIS_MODULE, + .read = seq_read, + .release = single_release, .write = write, }; diff --git a/rootfs_overlay/kstrto.sh b/rootfs_overlay/kstrto.sh index 05628f5..c6121d0 100755 --- a/rootfs_overlay/kstrto.sh +++ b/rootfs_overlay/kstrto.sh @@ -1,7 +1,8 @@ #!/bin/sh +set -e +f=/sys/kernel/debug/lkmc_kstrto insmod /kstrto.ko -cd /sys/kernel/debug -echo 1234 > lkmc_kstrto -# 1234 -echo foobar > lkmc_kstrto -# -22 +printf 123 > "$f" +[ "$(cat "$f")" = 124 ] +echo foobar > "$f" && exit 1 +rmmod kstrto diff --git a/rootfs_overlay/test_all.sh b/rootfs_overlay/test_all.sh index 928819b..fd13fdf 100755 --- a/rootfs_overlay/test_all.sh +++ b/rootfs_overlay/test_all.sh @@ -8,6 +8,7 @@ for test in \ /fops.sh \ /init_module.sh \ /ioctl.sh \ + /kstrto.sh \ /mmap.sh \ /params.sh \ /procfs.sh \