To: vim-dev@vim.org Subject: Patch 7.3.034 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.034 Problem: Win32: may be loading .dll from the wrong directory. Solution: Go to the Vim executable directory when opening a library. Files: src/gui_w32.c, src/if_lua.c, src/if_mzsch.c, src/if_perl.xs, src/if_python.c, src/if_python3.c, src/if_ruby.c, src/mbyte.c, src/os_mswin.c, src/os_win32.c, src/proto/os_win32.pro *** ../vim-7.3.033/src/gui_w32.c 2010-08-15 21:57:25.000000000 +0200 --- src/gui_w32.c 2010-10-22 21:49:27.000000000 +0200 *************** *** 1260,1266 **** /* try and load the user32.dll library and get the entry points for * multi-monitor-support. */ ! if ((user32_lib = LoadLibrary("User32.dll")) != NULL) { pMonitorFromWindow = (TMonitorFromWindow)GetProcAddress(user32_lib, "MonitorFromWindow"); --- 1260,1266 ---- /* try and load the user32.dll library and get the entry points for * multi-monitor-support. */ ! if ((user32_lib = vimLoadLib("User32.dll")) != NULL) { pMonitorFromWindow = (TMonitorFromWindow)GetProcAddress(user32_lib, "MonitorFromWindow"); *************** *** 4188,4194 **** static void dyn_imm_load(void) { ! hLibImm = LoadLibrary("imm32.dll"); if (hLibImm == NULL) return; --- 4188,4194 ---- static void dyn_imm_load(void) { ! hLibImm = vimLoadLib("imm32.dll"); if (hLibImm == NULL) return; *** ../vim-7.3.033/src/if_lua.c 2010-08-15 21:57:28.000000000 +0200 --- src/if_lua.c 2010-10-22 21:49:39.000000000 +0200 *************** *** 49,55 **** # define symbol_from_dll dlsym # define close_dll dlclose #else ! # define load_dll LoadLibrary # define symbol_from_dll GetProcAddress # define close_dll FreeLibrary #endif --- 49,55 ---- # define symbol_from_dll dlsym # define close_dll dlclose #else ! # define load_dll vimLoadLib # define symbol_from_dll GetProcAddress # define close_dll FreeLibrary #endif *** ../vim-7.3.033/src/if_mzsch.c 2010-08-15 21:57:32.000000000 +0200 --- src/if_mzsch.c 2010-10-22 21:49:53.000000000 +0200 *************** *** 556,563 **** if (hMzGC && hMzSch) return OK; ! hMzSch = LoadLibrary(sch_dll); ! hMzGC = LoadLibrary(gc_dll); if (!hMzSch) { --- 556,563 ---- if (hMzGC && hMzSch) return OK; ! hMzSch = vimLoadLib(sch_dll); ! hMzGC = vimLoadLib(gc_dll); if (!hMzSch) { *** ../vim-7.3.033/src/if_perl.xs 2010-08-15 21:57:30.000000000 +0200 --- src/if_perl.xs 2010-10-22 21:53:06.000000000 +0200 *************** *** 106,112 **** #define close_dll dlclose #else #define PERL_PROC FARPROC ! #define load_dll LoadLibrary #define symbol_from_dll GetProcAddress #define close_dll FreeLibrary #endif --- 106,112 ---- #define close_dll dlclose #else #define PERL_PROC FARPROC ! #define load_dll vimLoadLib #define symbol_from_dll GetProcAddress #define close_dll FreeLibrary #endif *** ../vim-7.3.033/src/if_python.c 2010-08-15 21:57:28.000000000 +0200 --- src/if_python.c 2010-10-22 21:49:57.000000000 +0200 *************** *** 110,116 **** # define close_dll dlclose # define symbol_from_dll dlsym # else ! # define load_dll LoadLibrary # define close_dll FreeLibrary # define symbol_from_dll GetProcAddress # endif --- 110,116 ---- # define close_dll dlclose # define symbol_from_dll dlsym # else ! # define load_dll vimLoadLib # define close_dll FreeLibrary # define symbol_from_dll GetProcAddress # endif *** ../vim-7.3.033/src/if_python3.c 2010-08-15 21:57:28.000000000 +0200 --- src/if_python3.c 2010-10-22 21:50:01.000000000 +0200 *************** *** 88,94 **** # define close_dll dlclose # define symbol_from_dll dlsym # else ! # define load_dll LoadLibrary # define close_dll FreeLibrary # define symbol_from_dll GetProcAddress # endif --- 88,94 ---- # define close_dll dlclose # define symbol_from_dll dlsym # else ! # define load_dll vimLoadLib # define close_dll FreeLibrary # define symbol_from_dll GetProcAddress # endif *** ../vim-7.3.033/src/if_ruby.c 2010-09-29 13:02:48.000000000 +0200 --- src/if_ruby.c 2010-10-22 21:50:04.000000000 +0200 *************** *** 55,61 **** # define symbol_from_dll dlsym # define close_dll dlclose #else ! # define load_dll LoadLibrary # define symbol_from_dll GetProcAddress # define close_dll FreeLibrary #endif --- 55,61 ---- # define symbol_from_dll dlsym # define close_dll dlclose #else ! # define load_dll vimLoadLib # define symbol_from_dll GetProcAddress # define close_dll FreeLibrary #endif *** ../vim-7.3.033/src/mbyte.c 2010-09-18 13:36:41.000000000 +0200 --- src/mbyte.c 2010-10-22 21:50:09.000000000 +0200 *************** *** 4159,4169 **** { if (hIconvDLL != 0 && hMsvcrtDLL != 0) return TRUE; ! hIconvDLL = LoadLibrary(DYNAMIC_ICONV_DLL); if (hIconvDLL == 0) /* sometimes it's called libiconv.dll */ ! hIconvDLL = LoadLibrary(DYNAMIC_ICONV_DLL_ALT); if (hIconvDLL != 0) ! hMsvcrtDLL = LoadLibrary(DYNAMIC_MSVCRT_DLL); if (hIconvDLL == 0 || hMsvcrtDLL == 0) { /* Only give the message when 'verbose' is set, otherwise it might be --- 4159,4169 ---- { if (hIconvDLL != 0 && hMsvcrtDLL != 0) return TRUE; ! hIconvDLL = vimLoadLib(DYNAMIC_ICONV_DLL); if (hIconvDLL == 0) /* sometimes it's called libiconv.dll */ ! hIconvDLL = vimLoadLib(DYNAMIC_ICONV_DLL_ALT); if (hIconvDLL != 0) ! hMsvcrtDLL = vimLoadLib(DYNAMIC_MSVCRT_DLL); if (hIconvDLL == 0 || hMsvcrtDLL == 0) { /* Only give the message when 'verbose' is set, otherwise it might be *** ../vim-7.3.033/src/os_mswin.c 2010-08-15 21:57:29.000000000 +0200 --- src/os_mswin.c 2010-10-22 22:03:26.000000000 +0200 *************** *** 817,823 **** --- 817,827 ---- BOOL fRunTimeLinkSuccess = FALSE; // Get a handle to the DLL module. + # ifdef WIN16 hinstLib = LoadLibrary(libname); + # else + hinstLib = vimLoadLib(libname); + # endif // If the handle is valid, try to get the function address. if (hinstLib != NULL) *** ../vim-7.3.033/src/os_win32.c 2010-10-13 20:37:37.000000000 +0200 --- src/os_win32.c 2010-10-23 13:16:55.000000000 +0200 *************** *** 206,247 **** static int suppress_winsize = 1; /* don't fiddle with console */ #endif static void get_exe_name(void) { ! char temp[256]; ! static int did_set_PATH = FALSE; if (exe_name == NULL) { /* store the name of the executable, may be used for $VIM */ ! GetModuleFileName(NULL, temp, 255); if (*temp != NUL) exe_name = FullName_save((char_u *)temp, FALSE); } ! if (!did_set_PATH && exe_name != NULL) { ! char_u *p; ! char_u *newpath; ! ! /* Append our starting directory to $PATH, so that when doing "!xxd" ! * it's found in our starting directory. Needed because SearchPath() ! * also looks there. */ ! p = mch_getenv("PATH"); ! newpath = alloc((unsigned)(STRLEN(p) + STRLEN(exe_name) + 2)); ! if (newpath != NULL) ! { ! STRCPY(newpath, p); ! STRCAT(newpath, ";"); ! vim_strncpy(newpath + STRLEN(newpath), exe_name, ! gettail_sep(exe_name) - exe_name); ! vim_setenv((char_u *)"PATH", newpath); ! vim_free(newpath); } ! did_set_PATH = TRUE; } } #if defined(DYNAMIC_GETTEXT) || defined(PROTO) --- 206,268 ---- static int suppress_winsize = 1; /* don't fiddle with console */ #endif + static char_u *exe_path = NULL; + static void get_exe_name(void) { ! char temp[MAXPATHL]; ! char_u *p; if (exe_name == NULL) { /* store the name of the executable, may be used for $VIM */ ! GetModuleFileName(NULL, temp, MAXPATHL - 1); if (*temp != NUL) exe_name = FullName_save((char_u *)temp, FALSE); } ! if (exe_path == NULL && exe_name != NULL) { ! exe_path = vim_strnsave(exe_name, gettail_sep(exe_name) - exe_name); ! if (exe_path != NULL) ! { ! /* Append our starting directory to $PATH, so that when doing ! * "!xxd" it's found in our starting directory. Needed because ! * SearchPath() also looks there. */ ! p = mch_getenv("PATH"); ! if (STRLEN(p) + STRLEN(exe_path) + 2 < MAXPATHL); ! { ! STRCPY(temp, p); ! STRCAT(temp, ";"); ! STRCAT(temp, exe_path); ! vim_setenv((char_u *)"PATH", temp); ! } } + } + } + + /* + * Load library "name". + */ + HINSTANCE + vimLoadLib(char *name) + { + HINSTANCE dll = NULL; + char old_dir[MAXPATHL]; ! if (exe_path == NULL) ! get_exe_name(); ! if (exe_path != NULL && mch_dirname(old_dir, MAXPATHL) == OK) ! { ! /* Change directory to where the executable is, both to make sure we ! * find a .dll there and to avoid looking for a .dll in the current ! * directory. */ ! mch_chdir(exe_path); ! dll = LoadLibrary(name); ! mch_chdir(old_dir); } + return dll; } #if defined(DYNAMIC_GETTEXT) || defined(PROTO) *************** *** 254,260 **** static char *null_libintl_bindtextdomain(const char *, const char *); static char *null_libintl_bind_textdomain_codeset(const char *, const char *); ! static HINSTANCE hLibintlDLL = 0; char *(*dyn_libintl_gettext)(const char *) = null_libintl_gettext; char *(*dyn_libintl_textdomain)(const char *) = null_libintl_textdomain; char *(*dyn_libintl_bindtextdomain)(const char *, const char *) --- 275,281 ---- static char *null_libintl_bindtextdomain(const char *, const char *); static char *null_libintl_bind_textdomain_codeset(const char *, const char *); ! static HINSTANCE hLibintlDLL = NULL; char *(*dyn_libintl_gettext)(const char *) = null_libintl_gettext; char *(*dyn_libintl_textdomain)(const char *) = null_libintl_textdomain; char *(*dyn_libintl_bindtextdomain)(const char *, const char *) *************** *** 282,307 **** if (hLibintlDLL) return 1; /* Load gettext library (libintl.dll) */ ! hLibintlDLL = LoadLibrary(libname != NULL ? libname : GETTEXT_DLL); if (!hLibintlDLL) { ! char_u dirname[_MAX_PATH]; ! ! /* Try using the path from gvim.exe to find the .dll there. */ ! get_exe_name(); ! STRCPY(dirname, exe_name); ! STRCPY(gettail(dirname), GETTEXT_DLL); ! hLibintlDLL = LoadLibrary((char *)dirname); ! if (!hLibintlDLL) { ! if (p_verbose > 0) ! { ! verbose_enter(); ! EMSG2(_(e_loadlib), GETTEXT_DLL); ! verbose_leave(); ! } ! return 0; } } for (i = 0; libintl_entry[i].name != NULL && libintl_entry[i].ptr != NULL; ++i) --- 303,318 ---- if (hLibintlDLL) return 1; /* Load gettext library (libintl.dll) */ ! hLibintlDLL = vimLoadLib(libname != NULL ? libname : GETTEXT_DLL); if (!hLibintlDLL) { ! if (p_verbose > 0) { ! verbose_enter(); ! EMSG2(_(e_loadlib), GETTEXT_DLL); ! verbose_leave(); } + return 0; } for (i = 0; libintl_entry[i].name != NULL && libintl_entry[i].ptr != NULL; ++i) *************** *** 430,436 **** * Seems like a lot of overhead to load/unload ADVAPI32.DLL each * time we verify security... */ ! advapi_lib = LoadLibrary("ADVAPI32.DLL"); if (advapi_lib != NULL) { pSetNamedSecurityInfo = (PSNSECINFO)GetProcAddress(advapi_lib, --- 441,447 ---- * Seems like a lot of overhead to load/unload ADVAPI32.DLL each * time we verify security... */ ! advapi_lib = vimLoadLib("ADVAPI32.DLL"); if (advapi_lib != NULL) { pSetNamedSecurityInfo = (PSNSECINFO)GetProcAddress(advapi_lib, *** ../vim-7.3.033/src/proto/os_win32.pro 2010-08-15 21:57:28.000000000 +0200 --- src/proto/os_win32.pro 2010-10-22 22:05:35.000000000 +0200 *************** *** 1,4 **** --- 1,5 ---- /* os_win32.c */ + HINSTANCE vimLoadLib __ARGS((char *name)); int dyn_libintl_init __ARGS((char *libname)); void dyn_libintl_end __ARGS((void)); void PlatformId __ARGS((void)); *** ../vim-7.3.033/src/version.c 2010-10-22 22:13:47.000000000 +0200 --- src/version.c 2010-10-23 13:55:21.000000000 +0200 *************** *** 716,717 **** --- 716,719 ---- { /* Add new patch number below this line */ + /**/ + 34, /**/ -- This is the polymorph virus! Follow these instructions carefully: 1. Send this message to everybody you know. 2. Format your harddisk. Thank you for your cooperation in spreading the most powerful virus ever! /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///