Message ID | 20210113204515.3473079-1-seanjc@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: x86: Add more protection against undefined behavior in rsvd_bits() | expand |
On 13/01/21 21:45, Sean Christopherson wrote: > Add compile-time asserts in rsvd_bits() to guard against KVM passing in > garbage hardcoded values, and cap the upper bound at '63' for dynamic > values to prevent generating a mask that would overflow a u64. > > Suggested-by: Paolo Bonzini <pbonzini@redhat.com> > Signed-off-by: Sean Christopherson <seanjc@google.com> > --- > arch/x86/kvm/mmu.h | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h > index 581925e476d6..261be1d2032b 100644 > --- a/arch/x86/kvm/mmu.h > +++ b/arch/x86/kvm/mmu.h > @@ -44,8 +44,15 @@ > #define PT32_ROOT_LEVEL 2 > #define PT32E_ROOT_LEVEL 3 > > -static inline u64 rsvd_bits(int s, int e) > +static __always_inline u64 rsvd_bits(int s, int e) > { > + BUILD_BUG_ON(__builtin_constant_p(e) && __builtin_constant_p(s) && e < s); > + > + if (__builtin_constant_p(e)) > + BUILD_BUG_ON(e > 63); > + else > + e &= 63; > + > if (e < s) > return 0; > > Queued for 5.11, thanks. Paolo
diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h index 581925e476d6..261be1d2032b 100644 --- a/arch/x86/kvm/mmu.h +++ b/arch/x86/kvm/mmu.h @@ -44,8 +44,15 @@ #define PT32_ROOT_LEVEL 2 #define PT32E_ROOT_LEVEL 3 -static inline u64 rsvd_bits(int s, int e) +static __always_inline u64 rsvd_bits(int s, int e) { + BUILD_BUG_ON(__builtin_constant_p(e) && __builtin_constant_p(s) && e < s); + + if (__builtin_constant_p(e)) + BUILD_BUG_ON(e > 63); + else + e &= 63; + if (e < s) return 0;
Add compile-time asserts in rsvd_bits() to guard against KVM passing in garbage hardcoded values, and cap the upper bound at '63' for dynamic values to prevent generating a mask that would overflow a u64. Suggested-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Sean Christopherson <seanjc@google.com> --- arch/x86/kvm/mmu.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)