summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-01-03 17:04:04 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-01-03 17:04:04 +0000
commit3b34c5517852c13a76fe6f3af5848b4390ef74b2 (patch)
tree1bb8b5a89f922507eb1bd0169ab1d66972a41a7c
parentf31ed10742a2f195629b98bce6470c0aaa2bf232 (diff)
downloadmpv-3b34c5517852c13a76fe6f3af5848b4390ef74b2.tar.bz2
mpv-3b34c5517852c13a76fe6f3af5848b4390ef74b2.tar.xz
Avoid memleaks when vo_direct3d initialization fails.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30191 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--libvo/vo_direct3d.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/libvo/vo_direct3d.c b/libvo/vo_direct3d.c
index 090f48bcf8..6e8cdaf1fe 100644
--- a/libvo/vo_direct3d.c
+++ b/libvo/vo_direct3d.c
@@ -674,7 +674,7 @@ static int preinit(const char *arg)
priv = calloc(1, sizeof(struct global_priv));
if (!priv) {
mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Allocating private memory failed.\n");
- return -1;
+ goto err_out;
}
/* FIXME
@@ -685,26 +685,26 @@ static int preinit(const char *arg)
priv->d3d9_dll = LoadLibraryA("d3d9.dll");
if (!priv->d3d9_dll) {
mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Unable to dynamically load d3d9.dll\n");
- return -1;
+ goto err_out;
}
priv->pDirect3DCreate9 = (void *)GetProcAddress(priv->d3d9_dll, "Direct3DCreate9");
if (!priv->pDirect3DCreate9) {
mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Unable to find entry point of Direct3DCreate9\n");
- return -1;
+ goto err_out;
}
priv->d3d_handle = priv->pDirect3DCreate9(D3D_SDK_VERSION);
if (!priv->d3d_handle) {
mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Initializing Direct3D failed.\n");
- return -1;
+ goto err_out;
}
if (FAILED(IDirect3D9_GetAdapterDisplayMode(priv->d3d_handle,
D3DADAPTER_DEFAULT,
&disp_mode))) {
mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Reading display mode failed.\n");
- return -1;
+ goto err_out;
}
/* Store in priv->desktop_fmt the user desktop's colorspace. Usually XRGB. */
@@ -720,7 +720,7 @@ static int preinit(const char *arg)
D3DDEVTYPE_HAL,
&disp_caps))) {
mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Reading display capabilities failed.\n");
- return -1;
+ goto err_out;
}
/* Store relevant information reguarding caps of device */
@@ -745,10 +745,14 @@ static int preinit(const char *arg)
*/
if (!vo_w32_init()) {
mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Configuring onscreen window failed.\n");
- return -1;
+ goto err_out;
}
return 0;
+
+err_out:
+ uninit();
+ return -1;
}
@@ -877,7 +881,9 @@ static void uninit(void)
uninit_d3d();
vo_w32_uninit(); /* w32_common framework call */
- FreeLibrary(priv->d3d9_dll);
+ if (priv->d3d9_dll)
+ FreeLibrary(priv->d3d9_dll);
+ priv->d3d9_dll = NULL;
free(priv);
priv = NULL;
}