OSDN Git Service

lkdtm: avoid printk() in recursive_loop()
authorArd Biesheuvel <ardb@kernel.org>
Thu, 7 Oct 2021 08:12:35 +0000 (10:12 +0200)
committerKees Cook <keescook@chromium.org>
Thu, 16 Dec 2021 23:54:37 +0000 (15:54 -0800)
commit026c6fa1a525ca3f8a615052e45d766208989597
tree26f7606b3b20ab481382ba3508b1a2433e6f2c94
parent861dc0d7fd972f2064ff48b211955717163a11e0
lkdtm: avoid printk() in recursive_loop()

The recursive_loop() function is intended as a diagnostic to ensure that
exhausting the stack is caught and mitigated. Currently, it uses
pr_info() to ensure that the function has side effects that the compiler
cannot simply optimize away, so that the stack footprint does not get
reduced inadvertently.

The typical mitigation for stack overflow is to kill the task, and this
overflow may occur inside the call to pr_info(), which means it could be
holding the console lock when this happens. This means that the console
lock is never going to be released again, preventing the diagnostic
prints related to the stack overflow handling from being visible on the
console.

So let's replace the call to pr_info() with a call to
memzero_explicit(), which is not a 'magic' function name like memset()
or memcpy(), which the compiler may replace with plain loads and stores.
To ensure that the stack frames are nested rather than tail-called, put
the call to memzero_explicit() after the recursive call.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20211007081235.382697-1-ardb@kernel.org
drivers/misc/lkdtm/bugs.c