printk: add warning while drop partial text in msg
RFC 1/1 printk: add warning while drop partial text in msg
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 <[email protected]>
--- kernel/printk/printk.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)
kernel/printk/printk.c +22 -1
@@ -558,6 +558,12 @@ static u32 msg_used_size(u16 text_len, u16 dict_len, u32 *pad_len)#define MAX_LOG_TAKE_PART 4static const char trunc_msg[] ="<truncated>" ; +/* +* 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 *buif (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);
Signature · 1 line
1.9.1