Thread (39 messages) read the whole thread 39 messages, 11 authors, 2019-05-15

RE: [PATCH] vsprintf: Do not break early boot with probing addresses

From: David Laight <hidden>
Date: 2019-05-15 09:00:29
Also in: linux-arch, linux-s390, lkml

From: Petr Mladek
Sent: 15 May 2019 08:36
On Tue 2019-05-14 14:37:51, Steven Rostedt wrote:
quoted
[ Purple is a nice shade on the bike shed. ;-) ]

On Tue, 14 May 2019 11:02:17 +0200
Geert Uytterhoeven [off-list ref] wrote:
quoted
On Tue, May 14, 2019 at 10:29 AM David Laight [off-list ref] wrote:
quoted
quoted
And I like Steven's "(fault)" idea.
How about this:

      if ptr < PAGE_SIZE              -> "(null)"
      if IS_ERR_VALUE(ptr)            -> "(fault)"

      -ss
Or:
        if (ptr < PAGE_SIZE)
                return ptr ? "(null+)" : "(null)";
Hmm, that is useful.
quoted
quoted
        if IS_ERR_VALUE(ptr)
                return "(errno)"
I still prefer "(fault)" as is pretty much all I would expect from a
pointer dereference, even if it is just bad parsing of, say, a parsing
an MAC address. "fault" is generic enough. "errno" will be confusing,
because that's normally a variable not a output.
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.
This discussion clearly shows that it is hard to make anyone happy.

I considered switching to "(fault)" because there seems to be more
people in favor of this.

But there is used also "(einval)" when an unsupported pointer
modifier is passed. The idea is to show error codes that people
are familiar with.

It might have been better to use the uppercase "(EFAULT)" and
"(EINVAL)" to make it more obvious. But I wanted to follow
the existing style with the lowercase "(null)".
Printing 'fault' when the code was (trying to) validate the
address was ok.
When the only check is for an -errno value it seems wrong as
most invalid addresses will actually fault (and panic).

The reason modern printf generate "(null)" is that it is far too
easy for a diagnostic print to fail to test a pointer.
It also makes it easier when 'throwing in' printf while debugging
to add a single trace that will work regardless of whether a
call had succeeded or not.

With the Linux kernel putting errno values into pointers it
seems likely that most invalid pointers in printf will actaully
be error values.
Printing the value will be helpful during debugging - as a
trace can be put after a call and show the parameters and result.

	David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help