Re: Error while building a kernel module with mkdir(2)
Date: Mon, 18 Sep 2023 21:38:18 UTC
Rocky Hotas wrote:
> Hello!
> I hope this is the right ML to discuss about this issue. I am trying to
> build the example kernel module presented in paragraph 2.1 of
>
> Designing BSD Rootkits: An Introduction to Kernel Hacking
> by Joseph Kong
>
> However, I get this error:
>
> mkdir_hook.c:42:9: error: implicit declaration of function 'mkdir' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
> return(mkdir(td, syscall_args));
> ^
> mkdir_hook.c:57:45: error: use of undeclared identifier 'mkdir'
> sysent[SYS_mkdir].sy_call = (sy_call_t *)mkdir;
>
> mkdir(2) requires `#include <sys/stat.h>' and I added it (while it was
> not in the code from the book), but nothing changes.
That include is for userland that needs mkdir(2). Your wrapper likely
wants to override the in-kernel sys_mkdir() defined in <sys/sysproto.h>.
> What's still wrong?
>
> After this text, I paste the code and the Makefile (written following
> https://docs.freebsd.org/en/books/arch-handbook/driverbasics/).
>
> Bye!
>
> Rocky
>
>
>
> === code: mkdir_hook.c ===
>
> #include <sys/types.h>
> #include <sys/param.h> /* defines used in kernel.h */
> #include <sys/proc.h>
> #include <sys/module.h>
> #include <sys/sysent.h>
> #include <sys/kernel.h> /* types used in module initialization */
> #include <sys/systm.h> /* uprintf */
> #include <sys/syscall.h>
> #include <sys/sysproto.h>
> #include <sys/stat.h> /* mkdir(2) */
>
>
> /* mkdir system call hook. */
> static int
> mkdir_hook(struct thread *td, void *syscall_args)
> {
> struct mkdir_args /* {
> char *path;
> int mode;
> } */ *uap;
>
> uap = (struct mkdir_args *)syscall_args;
> char path[255];
> size_t done;
> int error;
> error = copyinstr(uap->path, path, 255, &done);
>
> if (error != 0)
> return(error);
> /* Print a debug message. */
> uprintf("The directory \"%s\" will be created with the following"
> " permissions: %o\n", path, uap->mode);
>
> return(mkdir(td, syscall_args));
> }
>
> /* The function called at load/unload. */
> static int
> load(struct module *module, int cmd, void *arg)
> {
> int error = 0;
> switch (cmd) {
> case MOD_LOAD:
> /* Replace mkdir with mkdir_hook. */
> sysent[SYS_mkdir].sy_call = (sy_call_t *)mkdir_hook;
> break;
> case MOD_UNLOAD:
> /* Change everything back to normal. */
> sysent[SYS_mkdir].sy_call = (sy_call_t *)mkdir;
> break;
>
> default:
> error = EOPNOTSUPP;
> break;
> }
>
> return(error);
> }
>
> static moduledata_t
> mkdir_hook_mod = {
> "mkdir_hook", /* module name */
> load, /* event handler */
> NULL /* extra data */
> };
>
> DECLARE_MODULE(mkdir_hook, mkdir_hook_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
>
>
>
> === Makefile ===
>
> KMOD=mkdir_hook
> SRCS=mkdir_hook.c
> .include <bsd.kmod.mk>
>