All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Ogness <john.ogness@linutronix.de>
To: Petr Mladek <pmladek@suse.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>,
	Sergey Senozhatsky <sergey.senozhatsky@gmail.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	linux-kernel@vger.kernel.org
Subject: [PATCH next v4 03/15] printk: limit second loop of syslog_print_all
Date: Wed,  3 Mar 2021 11:15:16 +0100	[thread overview]
Message-ID: <20210303101528.29901-4-john.ogness@linutronix.de> (raw)
In-Reply-To: <20210303101528.29901-1-john.ogness@linutronix.de>

The second loop of syslog_print_all() subtracts lengths that were
added in the first loop. With commit b031a684bfd0 ("printk: remove
logbuf_lock writer-protection of ringbuffer") it is possible that
records are (over)written during syslog_print_all(). This allows the
possibility of the second loop subtracting lengths that were never
added in the first loop.

This situation can result in syslog_print_all() filling the buffer
starting from a later record, even though there may have been room
to fit the earlier record(s) as well.

Fixes: b031a684bfd0 ("printk: remove logbuf_lock writer-protection of ringbuffer")
Signed-off-by: John Ogness <john.ogness@linutronix.de>
Reviewed-by: Petr Mladek <pmladek@suse.com>
---
 kernel/printk/printk.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 575a34b88936..77ae2704e979 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -1494,6 +1494,7 @@ static int syslog_print_all(char __user *buf, int size, bool clear)
 	struct printk_info info;
 	unsigned int line_count;
 	struct printk_record r;
+	u64 max_seq;
 	char *text;
 	int len = 0;
 	u64 seq;
@@ -1512,9 +1513,15 @@ static int syslog_print_all(char __user *buf, int size, bool clear)
 	prb_for_each_info(clear_seq, prb, seq, &info, &line_count)
 		len += get_record_print_text_size(&info, line_count, true, time);
 
+	/*
+	 * Set an upper bound for the next loop to avoid subtracting lengths
+	 * that were never added.
+	 */
+	max_seq = seq;
+
 	/* move first record forward until length fits into the buffer */
 	prb_for_each_info(clear_seq, prb, seq, &info, &line_count) {
-		if (len <= size)
+		if (len <= size || info.seq >= max_seq)
 			break;
 		len -= get_record_print_text_size(&info, line_count, true, time);
 	}
-- 
2.20.1


  parent reply	other threads:[~2021-03-03 14:33 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-03 10:15 [PATCH next v4 00/15] printk: remove logbuf_lock John Ogness
2021-03-03 10:15 ` John Ogness
2021-03-03 10:15 ` John Ogness
2021-03-03 10:15 ` [PATCH next v4 01/15] um: synchronize kmsg_dumper John Ogness
2021-03-03 10:15   ` John Ogness
2021-03-03 10:15 ` [PATCH next v4 02/15] mtd: mtdoops: " John Ogness
2021-03-03 10:15   ` John Ogness
2021-03-11  9:50   ` Miquel Raynal
2021-03-11  9:50     ` Miquel Raynal
2021-03-03 10:15 ` John Ogness [this message]
2021-03-03 10:15 ` [PATCH next v4 04/15] printk: kmsg_dump: remove unused fields John Ogness
2021-03-03 10:15 ` [PATCH next v4 05/15] printk: refactor kmsg_dump_get_buffer() John Ogness
2021-03-03 10:15 ` [PATCH next v4 06/15] printk: consolidate kmsg_dump_get_buffer/syslog_print_all code John Ogness
2021-03-03 10:15 ` [PATCH next v4 07/15] printk: introduce CONSOLE_LOG_MAX John Ogness
2021-03-03 13:35   ` Petr Mladek
2021-03-03 10:15 ` [PATCH next v4 08/15] printk: use seqcount_latch for clear_seq John Ogness
2021-03-03 10:15 ` [PATCH next v4 09/15] printk: use atomic64_t for devkmsg_user.seq John Ogness
2021-03-03 10:15 ` [PATCH next v4 10/15] printk: add syslog_lock John Ogness
2021-03-03 10:15 ` [PATCH next v4 11/15] printk: kmsg_dumper: remove @active field John Ogness
2021-03-03 10:15   ` John Ogness
2021-03-03 10:15 ` [PATCH next v4 12/15] printk: introduce a kmsg_dump iterator John Ogness
2021-03-03 10:15   ` John Ogness
2021-03-03 10:15   ` John Ogness
2021-03-03 13:48   ` Petr Mladek
2021-03-03 13:48     ` Petr Mladek
2021-03-03 13:48     ` Petr Mladek
2021-03-03 10:15 ` [PATCH next v4 13/15] printk: remove logbuf_lock John Ogness
2021-03-03 10:15 ` [PATCH next v4 14/15] printk: kmsg_dump: remove _nolock() variants John Ogness
2021-03-03 10:15   ` John Ogness
2021-03-03 10:15 ` [PATCH next v4 15/15] printk: console: remove unnecessary safe buffer usage John Ogness
2021-03-03 13:18 ` lkml delivery: was: Re: [PATCH next v4 00/15] printk: remove logbuf_lock Petr Mladek
2021-03-03 13:18   ` Petr Mladek
2021-03-03 13:18   ` Petr Mladek
2021-03-03 14:34   ` Steven Rostedt
2021-03-03 14:34     ` Steven Rostedt
2021-03-03 14:34     ` Steven Rostedt
2021-03-03 15:34 ` Petr Mladek
2021-03-03 15:34   ` Petr Mladek
2021-03-03 15:34   ` Petr Mladek
2021-03-08 15:09   ` Petr Mladek
2021-03-08 15:09     ` Petr Mladek
2021-03-08 15:09     ` Petr Mladek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210303101528.29901-4-john.ogness@linutronix.de \
    --to=john.ogness@linutronix.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pmladek@suse.com \
    --cc=rostedt@goodmis.org \
    --cc=sergey.senozhatsky.work@gmail.com \
    --cc=sergey.senozhatsky@gmail.com \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.