summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-01-07 00:59:25 +0100
committerwm4 <wm4@nowhere>2014-01-15 20:49:19 +0100
commitc18c324c6fd42faf6aea8d8ac9d6959a8fd31832 (patch)
tree430dfc4374c14fbfafb721af7da93ae54b6f9e28
parent6b20c244132b4872c3408344ca5bd2c2a6ae5025 (diff)
downloadmpv-c18c324c6fd42faf6aea8d8ac9d6959a8fd31832.tar.bz2
mpv-c18c324c6fd42faf6aea8d8ac9d6959a8fd31832.tar.xz
wayland: fix some memory leaks on initialization failure
This commonly happens when initializing vo_opengl on a X11-only system. Unfortunately, most wl_*_destroy() functions appear not to accept NULL pointers, making partial deinitialization a pain: you have to add your own NULL checks everywhere to avoid crashes. xkb.context is uninitialized separately, because you can initialize it just fine, even if the rest of input initialization fails.
-rw-r--r--video/out/wayland_common.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c
index 4bab0d0f2e..03aff90955 100644
--- a/video/out/wayland_common.c
+++ b/video/out/wayland_common.c
@@ -663,9 +663,12 @@ static void destroy_display (struct vo_wayland_state *wl)
if (wl->display.compositor)
wl_compositor_destroy(wl->display.compositor);
- wl_registry_destroy(wl->display.registry);
- wl_display_flush(wl->display.display);
- wl_display_disconnect(wl->display.display);
+ if (wl->display.registry)
+ wl_registry_destroy(wl->display.registry);
+ if (wl->display.display) {
+ wl_display_flush(wl->display.display);
+ wl_display_disconnect(wl->display.display);
+ }
}
static bool create_window (struct vo_wayland_state *wl)
@@ -690,8 +693,10 @@ static bool create_window (struct vo_wayland_state *wl)
static void destroy_window (struct vo_wayland_state *wl)
{
- wl_shell_surface_destroy(wl->window.shell_surface);
- wl_surface_destroy(wl->window.surface);
+ if (wl->window.shell_surface)
+ wl_shell_surface_destroy(wl->window.shell_surface);
+ if (wl->window.surface)
+ wl_surface_destroy(wl->window.surface);
}
static bool create_cursor (struct vo_wayland_state *wl)
@@ -740,8 +745,9 @@ static void destroy_input (struct vo_wayland_state *wl)
wl_keyboard_destroy(wl->input.keyboard);
xkb_map_unref(wl->input.xkb.keymap);
xkb_state_unref(wl->input.xkb.state);
- xkb_context_unref(wl->input.xkb.context);
}
+ if (wl->input.xkb.context)
+ xkb_context_unref(wl->input.xkb.context);
if (wl->input.pointer)
wl_pointer_destroy(wl->input.pointer);
@@ -765,6 +771,7 @@ int vo_wayland_init (struct vo *vo)
|| !create_window(wl)
|| !create_cursor(wl))
{
+ vo_wayland_uninit(vo);
return false;
}