History

printk: limit second loop of syslog_print_all

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.

John Ogness committed 5 years ago

Commit bb07b161 parent 40ddbba1 file · +8 −1Browse files

Unified · Split

kernel/printk/printk.c+8−1
@@ -1494,6 +1494,7 @@ static int syslog_print_all(char __user *buf, int size, bool clear) · 1493 unmodified lines
14941494 struct printk_info info;
14951495 unsigned int line_count;
14961496 struct printk_record r;
1497+ u64 max_seq;
14971498 char *text;
14981499 int len = 0;
14991500 u64 seq;
@@ -1512,9 +1513,15 @@ static int syslog_print_all(char __user *buf, int size, bool clear) · 12 unmodified lines
15121513 prb_for_each_info(clear_seq, prb, seq, &info, &line_count)
15131514 len += get_record_print_text_size(&info, line_count, true, time);
15141515
1516+ /*
1517+ * Set an upper bound for the next loop to avoid subtracting lengths
1518+ * that were never added.
1519+ */
1520+ max_seq = seq;
1521+
15151522 /* move first record forward until length fits into the buffer */
15161523 prb_for_each_info(clear_seq, prb, seq, &info, &line_count) {
1517− if (len <= size)
1524+ if (len <= size || info.seq >= max_seq)
15181525 break;
15191526 len -= get_record_print_text_size(&info, line_count, true, time);
15201527 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t