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