Re: [PATCH] vsprintf: Do not break early boot with probing addresses
From: Petr Mladek <pmladek@suse.com>
Date: 2019-05-15 07:53:44
Also in:
linux-arch, linux-s390, lkml
On Wed 2019-05-15 09:23:05, Geert Uytterhoeven wrote:
Hi Steve, On Tue, May 14, 2019 at 9:35 PM Steven Rostedt [off-list ref] wrote:quoted
On Tue, 14 May 2019 21:13:06 +0200 Geert Uytterhoeven [off-list ref] wrote:quoted
quoted
quoted
Do we care about the value? "(-E%u)"?That too could be confusing. What would (-E22) be considered by a user doing an sprintf() on some string. I know that would confuse me, or I would think that it was what the %pX displayed, and wonder why it displayed it that way. Whereas "(fault)" is quite obvious for any %p use case.I would immediately understand there's a missing IS_ERR() check in a function that can return -EINVAL, without having to add a new printk() to find out what kind of bogus value has been received, and without having to reboot, and trying to reproduce...I have to ask. Has there actually been a case that you used a %pX and it faulted, and you had to go back to find what the value of the failure was?If it faulted, the bad pointer value is obvious from the backtrace. If the code avoids the fault by verifying the pointer and returning "(efault)" instead, the bad pointer value is lost. Or am I missing something?
Should buggy printk() crash the system? Another problem is that vsprintf() is called in printk() under lockbuf_lock. The messages are stored into printk_safe per CPU buffers. It allows to see the nested messages. But there is still a bigger risk of missing them than with a "normal" fault. Finally, various variants of these checks were already used in "random" printf formats. The only change is that we are using them consistently everywhere[*] a pointer is accessed. [*] Just the top level pointer is checked. Some pointer modifiers are accessing ptr->ptr->val. The lower level pointers are not checked to avoid too much complexity. Best Regards, Petr