changeset 15613:5b57ccc4b640

memory leak fixes, patch by Gianluigi Tiesi <mplayer at netfarm.it>
author faust3
date Thu, 02 Jun 2005 16:49:29 +0000
parents 06e30282b170
children a4a46131ee71
files libmpdemux/demux_avs.c
diffstat 1 files changed, 19 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_avs.c	Thu Jun 02 14:19:35 2005 +0000
+++ b/libmpdemux/demux_avs.c	Thu Jun 02 16:49:29 2005 +0000
@@ -67,6 +67,9 @@
     AVS_Value handler;
     AVS_Clip *clip;
     const AVS_VideoInfo *video_info;
+#ifdef WIN32_LOADER
+    ldt_fs_t* ldt_fs;
+#endif
     HMODULE dll;
     int frameno;
     int init;
@@ -91,14 +94,14 @@
     memset(AVS, 0, sizeof(AVS_T));
 
 #ifdef WIN32_LOADER
-    Setup_LDT_Keeper();
+    AVS->ldt_fs = Setup_LDT_Keeper();
 #endif
     
     AVS->dll = LoadLibraryA("avisynth.dll");
     if(!AVS->dll)
     {
         mp_msg(MSGT_DEMUX ,MSGL_V, "AVS: failed to load avisynth.dll\n");
-        return NULL;
+        goto avs_err;
     }
     
     /* Dynamic import of needed stuff from avisynth.dll */
@@ -116,7 +119,7 @@
     if (!AVS->avs_env)
     {
         mp_msg(MSGT_DEMUX, MSGL_V, "AVS: avs_create_script_environment failed\n");
-        return NULL;
+        goto avs_err;
     }
     
 
@@ -125,16 +128,24 @@
     if (avs_is_error(AVS->handler))
     {
         mp_msg(MSGT_DEMUX, MSGL_V, "AVS: Avisynth error: %s\n", avs_as_string(AVS->handler));
-        return NULL;
+        goto avs_err;
     }
 
     if (!avs_is_clip(AVS->handler))
     {
         mp_msg(MSGT_DEMUX, MSGL_V, "AVS: Avisynth doesn't return a clip\n");
-        return NULL;
+        goto avs_err;
     }
     
     return AVS;
+
+avs_err:
+    if (AVS->dll) FreeLibrary(AVS->dll);
+#ifdef WIN32_LOADER
+    Restore_LDT_Keeper(AVS->ldt_fs);
+#endif
+    free(AVS);
+    return NULL;
 }
 
 /* Implement RGB MODES ?? */
@@ -354,6 +365,9 @@
             mp_msg(MSGT_DEMUX, MSGL_V, "AVS: Unloading avisynth.dll\n");
             FreeLibrary(AVS->dll);
         }
+#ifdef WIN32_LOADER
+        Restore_LDT_Keeper(AVS->ldt_fs);
+#endif
         free(AVS);
     }
 }