|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2] vsprintf: Make sure argument to %pX specifier is valid
If invalid pointer (i.e. something smaller than HYPERVISOR_VIRT_START)
is passed for %*ph/%pv/%ps/%pS format specifiers then print "(NULL)"
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
---
xen/common/vsprintf.c | 23 ++++++++++++++++-------
1 files changed, 16 insertions(+), 7 deletions(-)
v2:
* Print "(NULL)" instead of specifier-specific string
* Consider all addresses under HYPERVISOR_VIRT_START as invalid. (I think
this is true for both x86 and ARM but I don't have ARM platform to test).
diff --git a/xen/common/vsprintf.c b/xen/common/vsprintf.c
index 065cc42..b9542b5 100644
--- a/xen/common/vsprintf.c
+++ b/xen/common/vsprintf.c
@@ -270,6 +270,22 @@ static char *pointer(char *str, char *end, const char
**fmt_ptr,
const char *fmt = *fmt_ptr, *s;
/* Custom %p suffixes. See XEN_ROOT/docs/misc/printk-formats.txt */
+
+ switch ( fmt[1] )
+ {
+ case 'h':
+ case 's':
+ case 'S':
+ case 'v':
+ ++*fmt_ptr;
+ }
+
+ if ( (unsigned long)arg < HYPERVISOR_VIRT_START )
+ {
+ char *s = "(NULL)";
+ return string(str, end, s, -1, -1, 0);
+ }
+
switch ( fmt[1] )
{
case 'h': /* Raw buffer as hex string. */
@@ -277,9 +293,6 @@ static char *pointer(char *str, char *end, const char
**fmt_ptr,
const uint8_t *hex_buffer = arg;
unsigned int i;
- /* Consumed 'h' from the format string. */
- ++*fmt_ptr;
-
/* Bound user count from %* to between 0 and 64 bytes. */
if ( field_width <= 0 )
return str;
@@ -306,9 +319,6 @@ static char *pointer(char *str, char *end, const char
**fmt_ptr,
unsigned long sym_size, sym_offset;
char namebuf[KSYM_NAME_LEN+1];
- /* Advance parents fmt string, as we have consumed 's' or 'S' */
- ++*fmt_ptr;
-
s = symbols_lookup((unsigned long)arg, &sym_size, &sym_offset,
namebuf);
/* If the symbol is not found, fall back to printing the address */
@@ -335,7 +345,6 @@ static char *pointer(char *str, char *end, const char
**fmt_ptr,
{
const struct vcpu *v = arg;
- ++*fmt_ptr;
if ( str < end )
*str = 'd';
str = number(str + 1, end, v->domain->domain_id, 10, -1, -1, 0);
--
1.7.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |