ui/egl: fix render node cleanup order
ASAN detected some memory leaks when terminating. Release thread-bound EGL state first, destroy the context and terminate the display while the GBM device is still alive, then destroy GBM and close the render-node fd. Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp> Fixes: a3cf9b55bbdc ("ui/egl: implement display and EGL cleanup") Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-ID: <20260820132014.2729748-1-marcandre.lureau@redhat.com>
Marc-André Lureau committed
Aug 20, 2026 at 17:20 UTC
baca25172d8c195b9abbe6f8a3ab5915dba09a91
1 file changed
+9
-6
ui/egl-helpers.c
+9
-6
@@ -736,19 +736,22 @@ bool egl_init(const char *rendernode, DisplayGLMode mode, Error **errp)
736
737
void egl_cleanup(void)
738
{
739
+ if (qemu_egl_display) {
740
+ eglReleaseThread();
741
+ }
742
+
743
if (qemu_egl_rn_ctx) {
744
eglDestroyContext(qemu_egl_display, qemu_egl_rn_ctx);
745
qemu_egl_rn_ctx = NULL;
746
}
747
744
-#ifdef CONFIG_GBM
745
- g_clear_pointer(&qemu_egl_rn_gbm_dev, gbm_device_destroy);
746
- g_clear_fd(&qemu_egl_rn_fd, NULL);
747
-#endif
748
-
748
if (qemu_egl_display) {
750
- eglReleaseThread();
749
eglTerminate(qemu_egl_display);
750
qemu_egl_display = NULL;
751
}
752
+
753
+#ifdef CONFIG_GBM
754
+ g_clear_pointer(&qemu_egl_rn_gbm_dev, gbm_device_destroy);
755
+ g_clear_fd(&qemu_egl_rn_fd, NULL);
756
+#endif
757
}