From 9f37a8ab5c74823e95696b09e50a061c5d8d35f0 Mon Sep 17 00:00:00 2001 From: Juergen Gross Date: Wed, 23 Aug 2017 19:34:00 +0200 Subject: [PATCH] xen/arch/x86/hvm/viridian.c: let custom parameter parsing routines return errno Modify the custom parameter parsing routines in: xen/arch/x86/hvm/viridian.c to indicate whether the parameter value was parsed successfully. Fix an error in the parsing function: up to now it would overwrite the stack in case more than 3 values are specified. Signed-off-by: Juergen Gross Acked-by: Paul Durrant --- xen/arch/x86/hvm/viridian.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/xen/arch/x86/hvm/viridian.c b/xen/arch/x86/hvm/viridian.c index aa9b87c0ab..2edf9d0b23 100644 --- a/xen/arch/x86/hvm/viridian.c +++ b/xen/arch/x86/hvm/viridian.c @@ -1083,7 +1083,7 @@ static int viridian_load_vcpu_ctxt(struct domain *d, hvm_domain_context_t *h) HVM_REGISTER_SAVE_RESTORE(VIRIDIAN_VCPU, viridian_save_vcpu_ctxt, viridian_load_vcpu_ctxt, 1, HVMSR_PER_VCPU); -static void __init parse_viridian_version(char *arg) +static int __init parse_viridian_version(const char *arg) { const char *t; unsigned int n[3]; @@ -1093,17 +1093,24 @@ static void __init parse_viridian_version(char *arg) n[1] = viridian_minor; n[2] = viridian_build; - while ( (t = strsep(&arg, ",")) != NULL ) - { + do { const char *e; - if ( *t == '\0' ) - continue; + t = strchr(arg, ','); + if ( !t ) + t = strchr(arg, '\0'); + + if ( *arg && *arg != ',' && i < 3 ) + { + n[i] = simple_strtoul(arg, &e, 0); + if ( e != t ) + goto fail; + } + + i++; + arg = t + 1; + } while ( *t ); - n[i++] = simple_strtoul(t, &e, 0); - if ( *e != '\0' ) - goto fail; - } if ( i != 3 ) goto fail; @@ -1118,10 +1125,11 @@ static void __init parse_viridian_version(char *arg) printk("viridian-version = %#x,%#x,%#x\n", viridian_major, viridian_minor, viridian_build); - return; + return 0; fail: printk(XENLOG_WARNING "Invalid viridian-version, using default\n"); + return -EINVAL; } custom_param("viridian-version", parse_viridian_version); -- 2.39.5