• Heiko Carstens's avatar
    s390/kvm,gaccess: fix guest access return code handling · 744b37fb
    Heiko Carstens authored
    Guest access functions like copy_to/from_guest() call __guestaddr_to_user()
    which in turn call gmap_fault() in order to translate a guest address to a
    user space address.
    In error case __guest_addr_to_user() returns either -EFAULT or -ENOMEM.
    The copy_to/from_guest functions just pass these return values down to the
    callers.
    The -ENOMEM case however is problematic since there are several places
    which access guest memory like:
    
    rc = copy_to_guest(...);
    if (rc == -EFAULT)
    	error_handling();
    
    So in case of -ENOMEM the code assumes that the guest memory access
    succeeded even though it failed.
    This can cause guest data or state corruption.
    
    If __guestaddr_to_user() returns -ENOMEM the meaning is that a valid user
    space mapping exists, but there was not enough memory available when trying
    to build the guest mapping. In other words an out-of-memory situation
    occured.
    For normal user space accesses an out-of-memory situation causes the page
    fault handler to map -ENOMEM to -EFAULT (see fixup code in do_no_context()).
    We need to do exactly the same for the kvm gaccess functions.
    
    So __guestaddr_to_user() should just map all error codes to -EFAULT.
    Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
    Reviewed-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
    744b37fb
gaccess.h 8.64 KB