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
*** ../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 ///