changeset 30149:5f8cbd711a04

Avoid memleaks when vo_direct3d initialization fails.
author reimar
date Sun, 03 Jan 2010 17:04:04 +0000
parents 517a800e940e
children 16c71b965952
files libvo/vo_direct3d.c
diffstat 1 files changed, 14 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_direct3d.c	Sun Jan 03 17:00:51 2010 +0000
+++ b/libvo/vo_direct3d.c	Sun Jan 03 17:04:04 2010 +0000
@@ -674,7 +674,7 @@
     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 @@
     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 @@
                                         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 @@
      */
     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 @@
 
     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;
 }