@samitouri / QOSamiQemu / commits / ac270baaef

tests/qtest/migration: fix fd leak in ufd_version_check

ufd_version_check() opens a userfaultfd via uffd_open() but never closes it on any path where the open succeeded: the UFFDIO_API failure path, the missing-ioctls path, and the success path all returned without calling close(ufd). Convert to a goto-out pattern consistent with uffd_open() used in util/userfaultfd.c and migration/postcopy-ram.c, ensuring the fd is always closed before returning. Signed-off-by: Trieu Huynh <vikingtc4@gmail.com> Reviewed-by: Peter Xu <peterx@redhat.com> Link: https://lore.kernel.org/qemu-devel/20260419110304.8661-1-viking4@gmail.com Signed-off-by: Fabiano Rosas <farosas@suse.de>

Trieu Huynh committed Apr 19, 2026 at 18:03 UTC ac270baaefff94748ea4b699452afb118e385231
1 file changed +7 -3
tests/qtest/migration/migration-util.c
+7 -3
@@ -343,6 +343,7 @@ bool ufd_version_check(bool *uffd_feature_thread_id)
343 {
344 struct uffdio_api api_struct;
345 uint64_t ioctl_mask;
346 + bool ret = false;
347
348 int ufd = uffd_open(O_CLOEXEC);
349
@@ -355,7 +356,7 @@ bool ufd_version_check(bool *uffd_feature_thread_id)
356 api_struct.features = 0;
357 if (ioctl(ufd, UFFDIO_API, &api_struct)) {
358 g_test_message("Skipping test: UFFDIO_API failed");
358 - return false;
359 + goto release_ufd;
360 }
361
362 if (uffd_feature_thread_id) {
@@ -366,10 +367,13 @@ bool ufd_version_check(bool *uffd_feature_thread_id)
367 1ULL << _UFFDIO_UNREGISTER);
368 if ((api_struct.ioctls & ioctl_mask) != ioctl_mask) {
369 g_test_message("Skipping test: Missing userfault feature");
369 - return false;
370 + goto release_ufd;
371 }
372
372 - return true;
373 + ret = true;
374 +release_ufd:
375 + close(ufd);
376 + return ret;
377 }
378 #else
379 bool ufd_version_check(bool *uffd_feature_thread_id)