• Dave Martin's avatar
    KVM: arm64: Filter out invalid core register IDs in KVM_GET_REG_LIST · df205b5c
    Dave Martin authored
    Since commit d26c25a9 ("arm64: KVM: Tighten guest core register
    access from userspace"), KVM_{GET,SET}_ONE_REG rejects register IDs
    that do not correspond to a single underlying architectural register.
    
    KVM_GET_REG_LIST was not changed to match however: instead, it
    simply yields a list of 32-bit register IDs that together cover the
    whole kvm_regs struct.  This means that if userspace tries to use
    the resulting list of IDs directly to drive calls to KVM_*_ONE_REG,
    some of those calls will now fail.
    
    This was not the intention.  Instead, iterating KVM_*_ONE_REG over
    the list of IDs returned by KVM_GET_REG_LIST should be guaranteed
    to work.
    
    This patch fixes the problem by splitting validate_core_offset()
    into a backend core_reg_size_from_offset() which does all of the
    work except for checking that the size field in the register ID
    matches, and kvm_arm_copy_reg_indices() and num_core_regs() are
    converted to use this to enumerate the valid offsets.
    
    kvm_arm_copy_reg_indices() now also sets the register ID size field
    appropriately based on the value returned, so the register ID
    supplied to userspace is fully qualified for use with the register
    access ioctls.
    
    Cc: stable@vger.kernel.org
    Fixes: d26c25a9 ("arm64: KVM: Tighten guest core register access from userspace")
    Signed-off-by: default avatarDave Martin <Dave.Martin@arm.com>
    Reviewed-by: default avatarAndrew Jones <drjones@redhat.com>
    Tested-by: default avatarAndrew Jones <drjones@redhat.com>
    Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    df205b5c
guest.c 22 KB