Thread (39 messages) flat view 39 messages, 11 authors, 2019-05-15

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

From: Petr Mladek <pmladek@suse.com>
Date: 2019-05-13 12:24:31
Also in: linux-arch, linux-s390, lkml

On Fri 2019-05-10 12:40:58, Steven Rostedt wrote:
On Fri, 10 May 2019 18:32:58 +0200
Martin Schwidefsky [off-list ref] wrote:
quoted
On Fri, 10 May 2019 12:24:01 -0400
Steven Rostedt [off-list ref] wrote:
quoted
On Fri, 10 May 2019 10:42:13 +0200
Petr Mladek [off-list ref] wrote:
  
quoted
 static const char *check_pointer_msg(const void *ptr)
 {
-	char byte;
-
 	if (!ptr)
 		return "(null)";
 
-	if (probe_kernel_address(ptr, byte))
+	if ((unsigned long)ptr < PAGE_SIZE || IS_ERR_VALUE(ptr))
 		return "(efault)";
     

	< PAGE_SIZE ?

do you mean: < TASK_SIZE ?  
The check with < TASK_SIZE would break on s390. The 'ptr' is
in the kernel address space, *not* in the user address space.
Remember s390 has two separate address spaces for kernel/user
the check < TASK_SIZE only makes sense with a __user pointer.
So we allow this to read user addresses? Can't that cause a fault?
I did some quick check and did not found anywhere a user pointer
being dereferenced via vsprintf().

In each case, %s did the check (ptr < PAGE_SIZE) even before this
patchset. The other checks are in %p format modifiers that are
used to print various kernel structures.

Finally, it accesses the pointer directly. I am not completely sure
but I think that it would not work that easily with an address
from the user address space.

Best Regards,
Petr
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help