drm_syncobj_merger: fix memory leak and sync_fd corruption on error

Fix a memory leak when waiter_init fails in wlr_drm_syncobj_merger_add(),
and prevent the old sync_fd from being closed when sync_file_merge fails
in wlr_drm_syncobj_merger_add_sync_file().
This commit is contained in:
leiliang 2026-05-15 16:17:33 +08:00
parent 6b5e2159c4
commit aee9fa09f0

View file

@ -118,6 +118,7 @@ bool wlr_drm_syncobj_merger_add(struct wlr_drm_syncobj_merger *merger,
}
if (!wlr_drm_syncobj_timeline_waiter_init(&add->waiter, src_timeline, src_point,
flags, loop, export_waiter_handle_ready)) {
free(add);
return false;
}
add->merger = merger;
@ -133,6 +134,9 @@ bool wlr_drm_syncobj_merger_add_sync_file(struct wlr_drm_syncobj_merger *merger,
if (merger->sync_fd != -1) {
new_sync = sync_file_merge(merger->sync_fd, fd);
close(fd);
if (new_sync < 0) {
return false;
}
close(merger->sync_fd);
}
merger->sync_fd = new_sync;