Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751817AbdG1J2G (ORCPT ); Fri, 28 Jul 2017 05:28:06 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:36752 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751767AbdG1J2F (ORCPT ); Fri, 28 Jul 2017 05:28:05 -0400 From: pierre Kuo To: pmladek@suse.com Cc: sergey.senozhatsky@gmail.com, rostedt@goodmis.org, linux-kernel@vger.kernel.org, pierre Kuo Subject: [RFC] printk: add warning while drop partial text in msg Date: Fri, 28 Jul 2017 17:27:44 +0800 Message-Id: <1501234064-3346-1-git-send-email-vichy.kuo@gmail.com> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1889 Lines: 58 If the buffer pass to msg_print_text is not big enough to put both all prefixes and log_text(msg), kernel will quietly break. That means the user may not have the chance to know whether the log_text(msg) is fully printed into buffer or not. In this patch, once above case happened, we try to calculate how many characters of log_text(msg) are dropped and add waring for debugging purpose. Signed-off-by: pierre Kuo --- kernel/printk/printk.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index fc47863..6cbb3699 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -558,6 +558,12 @@ static u32 msg_used_size(u16 text_len, u16 dict_len, u32 *pad_len) #define MAX_LOG_TAKE_PART 4 static const char trunc_msg[] = ""; +/* + * Define max drop msg length that we put in next msg + */ +#define MAX_DROP_MSG_LENGTH 32 +static char drop_msg[MAX_DROP_MSG_LENGTH]; + static u32 truncate_msg(u16 *text_len, u16 *trunc_msg_len, u16 *dict_len, u32 *pad_len) { @@ -1264,8 +1270,23 @@ static size_t msg_print_text(const struct printk_log *msg, bool syslog, char *bu if (buf) { if (print_prefix(msg, syslog, NULL) + - text_len + 1 >= size - len) + text_len + 1 >= size - len) { + /* below stores dropped characters + * related information in next msg + */ + size_t drop_len; + + drop_len = scnprintf(drop_msg, + MAX_DROP_MSG_LENGTH, + "<%u characters dropped>", + (next) ? + (unsigned int)(text_size + next - text) : + (unsigned int)text_size); + drop_msg[drop_len] = 0; + log_store(msg->facility, msg->level, msg->flags, + 0, NULL, 0, drop_msg, strlen(drop_msg)); break; + } len += print_prefix(msg, syslog, buf + len); memcpy(buf + len, text, text_len); -- 1.9.1