|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] vsprintf: Make sure argument to %pX specifier is valid
On 11/02/15 20:58, Boris Ostrovsky wrote:
> 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] )
This wont function, as you have inverted the increment of *fmt_ptr and
check of fmt[1].
"(NULL)" is inappropriate for non-null pointers less than VIRT_START.
Given the VIRT check, I would just put the entire switch statement
inside an "if ( (unsigned long)arg < HYPERVISOR_VIRT_START )" block and
let it fall through to the plain number case for a bogus pointer.
~Andrew
> {
> 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);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |