KVM: selftests: Verify stats fd is usable after VM fd has been closed
authorSean Christopherson <seanjc@google.com>
Tue, 11 Jul 2023 23:01:31 +0000 (16:01 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Sat, 29 Jul 2023 15:05:30 +0000 (11:05 -0400)
Verify that VM and vCPU binary stats files are usable even after userspace
has put its last direct reference to the VM.  This is a regression test
for a UAF bug where KVM didn't gift the stats files a reference to the VM.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20230711230131.648752-8-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tools/testing/selftests/kvm/kvm_binary_stats_test.c

index 5317e27..698c1cf 100644 (file)
@@ -252,6 +252,14 @@ int main(int argc, char *argv[])
                        stats_test(vcpu_get_stats_fd(vcpus[i * max_vcpu + j]));
                }
 
+               /*
+                * Close the VM fd and redo the stats tests.  KVM should gift a
+                * reference (to the VM) to each stats fd, i.e. stats should
+                * still be accessible even after userspace has put its last
+                * _direct_ reference to the VM.
+                */
+               kvm_vm_free(vms[i]);
+
                stats_test(vm_stats_fds);
                for (j = 0; j < max_vcpu; ++j)
                        stats_test(vcpu_stats_fds[j]);
@@ -259,8 +267,6 @@ int main(int argc, char *argv[])
                ksft_test_result_pass("vm%i\n", i);
        }
 
-       for (i = 0; i < max_vm; ++i)
-               kvm_vm_free(vms[i]);
        free(vms);
        free(vcpus);
        free(vcpu_stats_fds);