| To: vim-dev@vim.org |
| Subject: Patch 7.3.034 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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; |
| |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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) |
| { |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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) |
| |
| |
| |
| *** 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, |
| |
| |
| |
| *** 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)); |
| |
| |
| |
| *** 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 /// |