Messages in this thread | | | Date | Fri, 11 Nov 2016 12:28:51 -0500 | From | Steven Rostedt <> | Subject | Re: [PATCH v2 1/4] printk/NMI: Handle continuous lines and missing newline |
| |
On Wed, 9 Nov 2016 13:41:28 +0100 Petr Mladek <pmladek@suse.com> wrote:
> /* > @@ -135,8 +170,8 @@ static void __printk_nmi_flush(struct irq_work *work) > __RAW_SPIN_LOCK_INITIALIZER(read_lock); > struct nmi_seq_buf *s = container_of(work, struct nmi_seq_buf, work); > unsigned long flags; > - size_t len, size; > - int i, last_i; > + size_t len; > + int i; > > /* > * The lock has two functions. First, one reader has to flush all > @@ -154,12 +189,14 @@ static void __printk_nmi_flush(struct irq_work *work) > /* > * This is just a paranoid check that nobody has manipulated > * the buffer an unexpected way. If we printed something then > - * @len must only increase. > + * @len must only increase. Also it should never overflow the > + * buffer size. > */ > - if (i && i >= len) { > + if ((i && i >= len) || len > sizeof(s->buffer)) {
What's wrong with using s->len? Isn't that what is inside the buffer? Couldn't just checking against the buffer size print garbage?
-- Steve
> const char *msg = "printk_nmi_flush: internal error\n"; > > printk_nmi_flush_line(msg, strlen(msg)); > + len = 0; > } > > if (!len) > @@ -167,22 +204,7 @@ static void __printk_nmi_flush(struct irq_work *work) > > /* Make sure that data has been written up to the @len */ > smp_rmb(); > - > - size = min(len, sizeof(s->buffer)); > - last_i = i; > - > - /* Print line by line. */ > - for (; i < size; i++) { > - if (s->buffer[i] == '\n') { > - printk_nmi_flush_seq_line(s, last_i, i); > - last_i = i + 1; > - } > - } > - /* Check if there was a partial line. */ > - if (last_i < size) { > - printk_nmi_flush_seq_line(s, last_i, size - 1); > - printk_nmi_flush_line("\n", strlen("\n")); > - } > + i += printk_nmi_flush_buffer(s->buffer + i, len - i); > > /* > * Check that nothing has got added in the meantime and truncate
| |