[vlc-devel] [PATCH 10/19] android/surface: fix leaks if Open fails
Thomas Guillem
thomas at gllm.fr
Fri Nov 14 17:10:01 CET 2014
---
modules/video_output/android/surface.c | 31 +++++++++++++++++--------------
1 file changed, 17 insertions(+), 14 deletions(-)
diff --git a/modules/video_output/android/surface.c b/modules/video_output/android/surface.c
index 50d91e1..b0f323a 100644
--- a/modules/video_output/android/surface.c
+++ b/modules/video_output/android/surface.c
@@ -183,6 +183,8 @@ static int Open(vlc_object_t *p_this)
/* Allocate structure */
vout_display_sys_t *sys = (struct vout_display_sys_t*) calloc(1, sizeof(*sys));
+ if (!sys)
+ goto error;
/* */
sys->p_library = LoadNativeWindowAPI(&sys->native_window);
@@ -190,9 +192,8 @@ static int Open(vlc_object_t *p_this)
if (!sys->p_library)
sys->p_library = InitLibrary(sys);
if (!sys->p_library) {
- free(sys);
msg_Err(vd, "Could not initialize libandroid.so/libui.so/libgui.so/libsurfaceflinger_client.so!");
- return VLC_EGENERIC;
+ goto error;
}
/* Setup chroma */
@@ -234,14 +235,14 @@ static int Open(vlc_object_t *p_this)
/* Create the associated picture */
picture_sys_t *picsys = malloc(sizeof(*picsys));
if (unlikely(picsys == NULL))
- goto enomem;
+ goto error;
picsys->sys = sys;
picture_resource_t resource = { .p_sys = picsys };
picture_t *picture = picture_NewFromResource(&fmt, &resource);
if (!picture) {
free(picsys);
- goto enomem;
+ goto error;
}
/* Wrap it into a picture pool */
@@ -255,7 +256,7 @@ static int Open(vlc_object_t *p_this)
sys->pool = picture_pool_NewExtended(&pool_cfg);
if (!sys->pool) {
picture_Release(picture);
- goto enomem;
+ goto error;
}
/* Setup vout_display */
@@ -275,10 +276,8 @@ static int Open(vlc_object_t *p_this)
return VLC_SUCCESS;
-enomem:
- dlclose(sys->p_library);
- free(sys);
- vlc_mutex_unlock(&single_instance);
+error:
+ Close(p_this);
return VLC_ENOMEM;
}
@@ -287,11 +286,15 @@ static void Close(vlc_object_t *p_this)
vout_display_t *vd = (vout_display_t *)p_this;
vout_display_sys_t *sys = vd->sys;
- picture_pool_Release(sys->pool);
- if (sys->window)
- sys->native_window.winRelease(sys->window);
- dlclose(sys->p_library);
- free(sys);
+ if (sys) {
+ if (sys->pool)
+ picture_pool_Release(sys->pool);
+ if (sys->window)
+ sys->native_window.winRelease(sys->window);
+ if (sys->p_library)
+ dlclose(sys->p_library);
+ free(sys);
+ }
}
static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
--
2.1.1
More information about the vlc-devel
mailing list