Messages in this thread Patch in this message | | | Date | Wed, 13 Feb 2008 17:46:52 +0900 | From | Tejun Heo <> | Subject | [PATCH REPOST] printk: fix possible printk buffer overrun introduced with recursion check |
| |
printk recursion detection prepends message to printk_buf and offsets printk_buf when actual message is printed but it forgets to trim buffer length accordingly. This can result in buffer overrun in extreme cases.
While at it, make printk_recursion_bug_msg static and move static variables for recursion check into vprintk().
Signed-off-by: Tejun Heo <htejun@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> --- Eeeek, forgot to cc lkml last time. Re-sending. Sorry about the noise.
kernel/printk.c | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/kernel/printk.c b/kernel/printk.c index bee3610..074a3ea 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -613,15 +613,13 @@ asmlinkage int printk(const char *fmt, ...) return r; } -/* cpu currently holding logbuf_lock */ -static volatile unsigned int printk_cpu = UINT_MAX; - -const char printk_recursion_bug_msg [] = - KERN_CRIT "BUG: recent printk recursion!\n"; -static int printk_recursion_bug; - asmlinkage int vprintk(const char *fmt, va_list args) { + /* cpu currently holding logbuf_lock */ + static volatile unsigned int printk_cpu = UINT_MAX; + static const char printk_recursion_bug_msg [] = + KERN_CRIT "BUG: recent printk recursion!\n"; + static int printk_recursion_bug; static int log_level_unknown = 1; static char printk_buf[1024]; @@ -666,7 +664,7 @@ asmlinkage int vprintk(const char *fmt, va_list args) } /* Emit the output into the temporary buffer */ printed_len += vscnprintf(printk_buf + printed_len, - sizeof(printk_buf), fmt, args); + sizeof(printk_buf) - printed_len, fmt, args); /* * Copy the output into log_buf. If the caller didn't provide -- 1.5.2.4
| |