|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 39/52] xen: check parameter validity when parsing command line
On 14/08/17 14:46, Jan Beulich wrote:
>>>> On 14.08.17 at 09:08, <jgross@xxxxxxxx> wrote:
>> --- a/xen/common/kernel.c
>> +++ b/xen/common/kernel.c
>> @@ -23,9 +23,11 @@ enum system_state system_state = SYS_STATE_early_boot;
>> xen_commandline_t saved_cmdline;
>> static const char __initconst opt_builtin_cmdline[] = CONFIG_CMDLINE;
>>
>> -static void __init assign_integer_param(
>> +static int __init assign_integer_param(
>> const struct kernel_param *param, uint64_t val)
>> {
>> + unsigned int bits = param->len * BITS_PER_BYTE;
>> +
>> switch ( param->len )
>> {
>> case sizeof(uint8_t):
>> @@ -43,14 +45,17 @@ static void __init assign_integer_param(
>> default:
>> BUG();
>> }
>> +
>> + return ( (val & (~0ULL << bits)) && ~(val | (~0ULL >> (65 - bits))) ) ?
>
> The left part has undefined behavior when param->len == 8
> (and on x86 I'd expect it to produce just "val"). The right part
> I guess is meant to be a sign check, but that's rather obscure.
Hmm, okay.
> As iirc it is signed-to-unsigned conversion which has uniformly
> defined behavior it may end up being better for the parameter
> to be of signed type and to allow values in the range
> [<type>_MIN,U<type>_MAX]. Anything more precise would
> require signedness to be communicated from the *_param()
> users.
Okay, I'll have a try.
> Also - stray blanks inside the outermost parentheses.
>
> And finally, wouldn't it be better to check for overflow _before_
> assigning to *param->var?
I didn't want to change existing behavior. OTOH thinking twice you are
right. Better using the default value than an unexpected small one.
>
>> @@ -97,8 +102,9 @@ static void __init _cmdline_parse(const char *cmdline)
>> !strncmp(param->name, opt, q + 1 - opt) )
>> {
>> optval[-1] = '=';
>> - ((void (*)(const char *))param->var)(q);
>> + rc = ((int (*)(const char *))param->var)(q);
>
> Neither here nor in the earlier "let custom parameter parsing
> routines return errno" nor in the overview you mention why this
> is safe - it is not a given that caller and callee disagreeing on
> return type is going to work. Just think of functions returning
> aggregates or (on ix86) ones returning floating point values in
> st(0).
I thought about using a union in struct kernel_param and removing
above type cast. This would require modifying the initialization of
the kernel_param struct via the *_param() macros, though.
The other possibility would be using __builtin_types_compatible_p()
to check the function to be of proper type.
What would you like best?
>
>> optval[-1] = '\0';
>> + break;
>
> Why? Applies to further break-s you add: At least in the past we
> had command line options with two handlers, where each of them
> needed to be invoked. I don't think we should make such impossible
> even if right now there aren't any such examples. Yet if you really
> mean to, then the behavioral change needs to be called out in the
> description.
I wasn't aware of such a usage.
I'm fine for both alternatives. As you seem to prefer to keep support
for multiple handlers I'll modify the patch to allow that.
>> @@ -106,24 +112,34 @@ static void __init _cmdline_parse(const char *cmdline)
>> switch ( param->type )
>> {
>> case OPT_STR:
>> + rc = 0;
>> strlcpy(param->var, optval, param->len);
>> break;
>> case OPT_UINT:
>> - assign_integer_param(
>> + rc = assign_integer_param(
>> param,
>> - simple_strtoll(optval, NULL, 0));
>> + simple_strtoll(optval, &s, 0));
>> + if ( *s )
>> + rc = -EINVAL;
>> break;
>> case OPT_BOOL:
>> - if ( !parse_bool(optval) )
>> + rc = parse_bool(optval);
>> + if ( rc == -1 )
>
> Maybe "rc < 0"?
Okay.
>
>> @@ -131,13 +147,21 @@ static void __init _cmdline_parse(const char *cmdline)
>> safe_strcpy(opt, "no");
>> optval = opt;
>> }
>> - ((void (*)(const char *))param->var)(optval);
>> + rc = ((int (*)(const char *))param->var)(optval);
>> break;
>> default:
>> BUG();
>> break;
>> }
>> +
>> + break;
>> }
>> +
>> + if ( rc )
>> + printk("parameter \"%s\" has invalid value \"%s\"!\n", optkey,
>> + optval);
>
> With the changes made to optval in OPT_CUSTOM handling this
> may end up being confusing.
Oh yes, good catch.
Juergen
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |