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)