printk silently truncates messages longer than 1024 - 1 bytes. Implement overflow detection and append "$PRINTK_BUF_OVERFLOW$\n" to truncated messages.
Signed-off-by: Tejun Heo <[EMAIL PROTECTED]> --- kernel/printk.c | 15 ++++++++++++--- 1 files changed, 12 insertions(+), 3 deletions(-) diff --git a/kernel/printk.c b/kernel/printk.c index 074a3ea..419cd47 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -42,6 +42,7 @@ void __attribute__((weak)) early_printk(const char *fmt, ...) { } +#define PRINTK_BUF_LEN 1024 #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) /* printk's without a loglevel use this.. */ @@ -619,9 +620,10 @@ asmlinkage int vprintk(const char *fmt, va_list args) static volatile unsigned int printk_cpu = UINT_MAX; static const char printk_recursion_bug_msg [] = KERN_CRIT "BUG: recent printk recursion!\n"; + static const char overflow_tag[] = "$PRINTK_BUF_OVERFLOW$\n"; static int printk_recursion_bug; static int log_level_unknown = 1; - static char printk_buf[1024]; + static char printk_buf[PRINTK_BUF_LEN + sizeof(overflow_tag) - 1]; unsigned long flags; int printed_len = 0; @@ -663,8 +665,15 @@ asmlinkage int vprintk(const char *fmt, va_list args) printed_len = sizeof(printk_recursion_bug_msg); } /* Emit the output into the temporary buffer */ - printed_len += vscnprintf(printk_buf + printed_len, - sizeof(printk_buf) - printed_len, fmt, args); + printed_len += vsnprintf(printk_buf + printed_len, + PRINTK_BUF_LEN - printed_len, fmt, args); + + /* Check for overflow and tag the message if overflowed */ + if (printed_len >= PRINTK_BUF_LEN) { + memcpy(printk_buf + PRINTK_BUF_LEN - 1, overflow_tag, + sizeof(overflow_tag)); + printed_len = sizeof(printk_buf) - 1; + } /* * Copy the output into log_buf. If the caller didn't provide -- 1.5.2.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/