diff -Naur -wbBE -X ignore_list main-cvs/libmpdemux/demux_avs.c main-devel/libmpdemux/demux_avs.c --- main-cvs/libmpdemux/demux_avs.c 2005-05-03 22:33:12.000000000 +0800 +++ main-devel/libmpdemux/demux_avs.c 2005-05-11 17:17:02.000000000 +0800 @@ -80,6 +80,9 @@ #ifdef ENABLE_AUDIO imp_avs_get_audio avs_get_audio; #endif +#ifdef WIN32_LOADER + ldt_fs_t* ldt_fs; +#endif } AVS_T; AVS_T *initAVS(const char *filename) @@ -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 err_out; } /* 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 err_out; } @@ -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 err_out; } if (!avs_is_clip(AVS->handler)) { mp_msg(MSGT_DEMUX, MSGL_V, "AVS: Avisynth doesn't return a clip\n"); - return NULL; + goto err_out; } return AVS; + +err_out: + if (AVS->dll) FreeLibrary(AVS->dll); +#ifdef WIN32_LOADER + if (AVS->ldt_fs) 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 + if (AVS->ldt_fs) Restore_LDT_Keeper(AVS->ldt_fs); +#endif free(AVS); } } diff -Naur -wbBE -X ignore_list main-cvs/loader/ldt_keeper.c main-devel/loader/ldt_keeper.c --- main-cvs/loader/ldt_keeper.c 2005-04-25 09:01:10.000000000 +0800 +++ main-devel/loader/ldt_keeper.c 2005-05-11 17:05:24.000000000 +0800 @@ -195,6 +195,7 @@ ldt_fs->fd = open("/dev/zero", O_RDWR); if(ldt_fs->fd<0){ perror( "Cannot open /dev/zero for READ+WRITE. Check permissions! error: "); + free(ldt_fs); return NULL; } fs_seg= @@ -275,12 +276,12 @@ void Restore_LDT_Keeper(ldt_fs_t* ldt_fs) { - if (ldt_fs == NULL || ldt_fs->fs_seg == 0) + if (ldt_fs == NULL) return; if (ldt_fs->prev_struct) free(ldt_fs->prev_struct); + if (ldt_fs->fs_seg) munmap((char*)ldt_fs->fs_seg, getpagesize()); - ldt_fs->fs_seg = 0; close(ldt_fs->fd); free(ldt_fs); }