|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/3] x86: relax GDT check in arch_set_info_guest()
On 19.05.2020 10:42, Roger Pau Monné wrote:
> On Fri, Dec 20, 2019 at 02:49:48PM +0100, Jan Beulich wrote:
>> It is wrong for us to check frames beyond the guest specified limit
>> (in the native case, other than in the compat one).
>
> Wouldn't this result in arch_set_info_guest failing if gdt_ents was
> smaller than the maximum? Or all callers always pass gdt_ents set to
> the maximum?
Since the array is embedded in the struct, I suppose callers simply
start out from a zero-initialized array, in which case the actual
count given doesn't matter. Additionally I think it is uncommon for
the function to get called on a vCPU with v->is_initialised already
set.
>> @@ -982,9 +985,9 @@ int arch_set_info_guest(
>> fail = compat_pfn_to_cr3(pfn) != c.cmp->ctrlreg[3];
>> }
>>
>> - for ( i = 0; i < ARRAY_SIZE(v->arch.pv.gdt_frames); ++i )
>> - fail |= v->arch.pv.gdt_frames[i] != c(gdt_frames[i]);
>> fail |= v->arch.pv.gdt_ents != c(gdt_ents);
>> + for ( i = 0; !fail && i < nr_gdt_frames; ++i )
>> + fail |= v->arch.pv.gdt_frames[i] != c(gdt_frames[i]);
>
> fail doesn't need to be OR'ed anymore here, since you check for it in
> the loop condition.
Ah yes, changed.
>> @@ -1089,12 +1092,11 @@ int arch_set_info_guest(
>> else
>> {
>> unsigned long gdt_frames[ARRAY_SIZE(v->arch.pv.gdt_frames)];
>> - unsigned int nr_frames = DIV_ROUND_UP(c.cmp->gdt_ents, 512);
>>
>> - if ( nr_frames > ARRAY_SIZE(v->arch.pv.gdt_frames) )
>> + if ( nr_gdt_frames > ARRAY_SIZE(v->arch.pv.gdt_frames) )
>> return -EINVAL;
>
> Shouldn't this check be performed when nr_gdt_frames is initialized
> instead of here? (as nr_gdt_frames is already used as a limit to
> iterate over gdt_frames).
Oh, yes, of course. Thanks for spotting.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |