* autoload.cc (std_dll_init): Add a retry loop.
This commit is contained in:
		
							parent
							
								
									dc9d9c731b
								
							
						
					
					
						commit
						b66f254618
					
				| 
						 | 
				
			
			@ -1,3 +1,7 @@
 | 
			
		|||
2010-10-01  Christopher Faylor  <me+cygwin@cgf.cx>
 | 
			
		||||
 | 
			
		||||
	* autoload.cc (std_dll_init): Add a retry loop.
 | 
			
		||||
 | 
			
		||||
2010-09-30  Corinna Vinschen  <corinna@vinschen.de>
 | 
			
		||||
 | 
			
		||||
	* fhandler.cc: Drop including nfs.h.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -208,7 +208,6 @@ union retchain
 | 
			
		|||
__attribute__ ((used, noinline)) static long long
 | 
			
		||||
std_dll_init ()
 | 
			
		||||
{
 | 
			
		||||
  HANDLE h;
 | 
			
		||||
  struct func_info *func = (struct func_info *) __builtin_return_address (0);
 | 
			
		||||
  struct dll_info *dll = func->dll;
 | 
			
		||||
  retchain ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -222,21 +221,31 @@ std_dll_init ()
 | 
			
		|||
    while (InterlockedIncrement (&dll->here));
 | 
			
		||||
  else if (!dll->handle)
 | 
			
		||||
    {
 | 
			
		||||
      HANDLE h;
 | 
			
		||||
      fenv_t fpuenv;
 | 
			
		||||
      fegetenv (&fpuenv);
 | 
			
		||||
      WCHAR dll_path[MAX_PATH];
 | 
			
		||||
      /* http://www.microsoft.com/technet/security/advisory/2269637.mspx */
 | 
			
		||||
      wcpcpy (wcpcpy (dll_path, windows_system_directory), dll->name);
 | 
			
		||||
      if ((h = LoadLibraryW (dll_path)) != NULL)
 | 
			
		||||
	dll->handle = h;
 | 
			
		||||
      else if (!(func->decoration & 1))
 | 
			
		||||
	api_fatal ("could not load %W, %E", dll_path);
 | 
			
		||||
      else
 | 
			
		||||
	dll->handle = INVALID_HANDLE_VALUE;
 | 
			
		||||
      dll->handle = NULL;
 | 
			
		||||
      /* MSDN seems to imply that LoadLibrary can fail mysteriously, so,
 | 
			
		||||
	 since there have been reports of this in the mailing list, retry
 | 
			
		||||
	 several times before giving up.  */
 | 
			
		||||
      for (int i = 1; !dll->handle && i <= 5; i++)
 | 
			
		||||
	if ((h = LoadLibraryW (dll_path)) != NULL)
 | 
			
		||||
	  dll->handle = h;
 | 
			
		||||
        /* FIXME: This isn't quite right.  Probably should check for specific
 | 
			
		||||
	   error codes. */
 | 
			
		||||
	else if ((func->decoration & 1))
 | 
			
		||||
	  dll->handle = INVALID_HANDLE_VALUE;
 | 
			
		||||
	else if (i < 5)
 | 
			
		||||
	  yield ();
 | 
			
		||||
	else
 | 
			
		||||
	  api_fatal ("could not load %W, %E", dll_path);
 | 
			
		||||
      fesetenv (&fpuenv);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Set "arguments for dll_chain. */
 | 
			
		||||
  /* Set "arguments" for dll_chain. */
 | 
			
		||||
  ret.low = (long) dll->init;
 | 
			
		||||
  ret.high = (long) func;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue