[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3] vsprintf: Make sure argument to %pX specifier is valid
On 18/02/15 15:39, 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 value of the > pointer in parentheses. > > For example: > > struct vcpu *v0 = NULL; > struct vcpu *v1 = (void *)0xffUL; > unsigned val = 0xab; > unsigned *ptr = &val; > unsigned *badptr = (void *)0xab; > printk("v0 = %pv, v1 = %pv, curr = %pv\n", v0, v1, current); > printk("badptr = %*ph, ptr = %*ph\n", 1, badptr, 1, ptr); > > will produce > v0 = (0), v1 = (ff), curr = d0v3 > badptr = (ab), ptr = ab > > Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> I agree that this looks to be the cleanest solution. > --- > xen/common/vsprintf.c | 23 ++++++++++++++++++++++- > 1 files changed, 22 insertions(+), 1 deletions(-) > > v3: > * Print value of the bad pointer in parentheses. > (I understand Andrew's dislike of additional switch but I > think this is the cleanest way) > > 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..5ab61a1 100644 > --- a/xen/common/vsprintf.c > +++ b/xen/common/vsprintf.c > @@ -269,7 +269,28 @@ 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 */ > + /* > + * For custom %p suffixes (see XEN_ROOT/docs/misc/printk-formats.txt) > + * if arg pointer is bogus then print pointer value in parentheses. > + */ > + if ( (unsigned long)arg < HYPERVISOR_VIRT_START ) > + { > + switch (fmt[1]) > + { > + case 'h': > + case 's': > + case 'S': > + case 'v': > + ++*fmt_ptr; > + if ( str < end ) > + *str++ = '('; > + str = number(str, end, (unsigned long)arg, 16, -1, -1, ZEROPAD); > + if ( str < end ) > + *str++ = ')'; > + return str; > + } > + } > + > switch ( fmt[1] ) > { > case 'h': /* Raw buffer as hex string. */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |