tracing: Fix infinite loop in tracing_read_pipe on overflowed print_trace_line
commitc1ac03af6e
upstream. print_trace_line may overflow seq_file buffer. If the event is not consumed, the while loop keeps peeking this event, causing a infinite loop. Link: https://lkml.kernel.org/r/20221129113009.182425-1-yangjihong1@huawei.com Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: stable@vger.kernel.org Fixes:088b1e427d
("ftrace: pipe fixes") Signed-off-by: Yang Jihong <yangjihong1@huawei.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
17becbc4dd
Коммит
4f5de49d8c
|
@ -6764,7 +6764,20 @@ waitagain:
|
|||
|
||||
ret = print_trace_line(iter);
|
||||
if (ret == TRACE_TYPE_PARTIAL_LINE) {
|
||||
/* don't print partial lines */
|
||||
/*
|
||||
* If one print_trace_line() fills entire trace_seq in one shot,
|
||||
* trace_seq_to_user() will returns -EBUSY because save_len == 0,
|
||||
* In this case, we need to consume it, otherwise, loop will peek
|
||||
* this event next time, resulting in an infinite loop.
|
||||
*/
|
||||
if (save_len == 0) {
|
||||
iter->seq.full = 0;
|
||||
trace_seq_puts(&iter->seq, "[LINE TOO BIG]\n");
|
||||
trace_consume(iter);
|
||||
break;
|
||||
}
|
||||
|
||||
/* In other cases, don't print partial lines */
|
||||
iter->seq.seq.len = save_len;
|
||||
break;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче