shell32: Make ShellExecute use native file association databases as fallback path (try 2)

Francois Gouget fgouget at codeweavers.com
Wed Jun 20 03:14:17 CDT 2012


On Tue, 19 Jun 2012, Erik van Pienbroek wrote:
[...]
> Additionally a check is added to make sure no recursive loop is 
> triggered when the native file association database points back to 
> wine and the fallback path is triggered again

This looks much better.


[...]
> @@ -1911,6 +1944,44 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
>          strcatW(lpstrTmpFile, lpFile);
>          retval = (UINT_PTR)ShellExecuteW(sei_tmp.hwnd, sei_tmp.lpVerb, lpstrTmpFile, NULL, NULL, 0);
>      }
> +#if defined(HAVE_FORK) && defined(HAVE_WAITPID)
> +    /* Integration with native file association database */
> +    else if (!getenv("WINE_INSIDE_SHELLEXECUTE"))
> +    {
[...]
> +        /* Prevent the situation where the native file association database
> +         * tries to run wine to execute a program and we trigger this fallback
> +         * path again and end up in a recursive loop */
> +        setenv("WINE_INSIDE_SHELLEXECUTE", "1", 0);
[...]
+        unsetenv("WINE_INSIDE_SHELLEXECUTE");

Setting WINE_INSIDE_SHELLEXECUTE here creates a race condition if two 
threads call ShellExecute() at the same time. So I think this should be 
set between the fork() and the exec() in SHELL_try_native_execute().

-- 
Francois Gouget <fgouget at codeweavers.com>



More information about the wine-patches mailing list