On 2/7/20 11:54 AM, Joshua Ashton wrote:
If the user's default browser application is winebrowser then we go into a a state where winebrowser calls winebrowser which calls winebrowser... forever.
Sometimes winebrowser is registered as a potential browser and even as the default when Wine is installed which makes this a genuine issue.
Where are you getting this? I don't see any code in Wine to set winebrowser as the default browser for winebrowser itself, or indeed to set any browser.
I wouldn't expect setting winebrowser as winebrowser's default browser to work, and I'd be personally inclined to say that whoever does that gets to keep the pieces. If distributions are doing this for some reason, well, they shouldn't do that.
Signed-off-by: Joshua Ashton joshua@froggi.es
programs/winebrowser/main.c | 40 +++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 11 deletions(-)
diff --git a/programs/winebrowser/main.c b/programs/winebrowser/main.c index 9cd6812d03..1294ebf54f 100644 --- a/programs/winebrowser/main.c +++ b/programs/winebrowser/main.c @@ -69,31 +69,49 @@ static char *strdup_unixcp( const WCHAR *str ) return ret; }
+/* forbidden apps that we will test for and never launch
- because they could cause us to create new processes indefinitely */
+static const WCHAR forbidden_apps[] =
- {'w','i','n','e','b','r','o','w','s','e','r',0,0};
/* try to launch a unix app from a comma separated string of app names */ static int launch_app( const WCHAR *candidates, const WCHAR *argv1 ) { char *cmdline; int i, count; char **argv_new;
const WCHAR* forbidden_app = forbidden_apps;
if (!(cmdline = strdup_unixcp( argv1 ))) return 1;
while (*candidates) {
WCHAR **args = CommandLineToArgvW( candidates, &count );
/* test for forbidden apps */
BOOL valid_candidate = TRUE;
while (*forbidden_app) {
if (strstrW(candidates, forbidden_app))
valid_candidate = FALSE;
forbidden_app += strlenW( forbidden_app ) + 1; /* grab the next app */
}
if (!(argv_new = HeapAlloc( GetProcessHeap(), 0, (count + 2) * sizeof(*argv_new) ))) break;
for (i = 0; i < count; i++) argv_new[i] = strdup_unixcp( args[i] );
argv_new[count] = cmdline;
argv_new[count + 1] = NULL;
if (valid_candidate)
{
WCHAR **args = CommandLineToArgvW( candidates, &count );
if (!(argv_new = HeapAlloc( GetProcessHeap(), 0, (count + 2) * sizeof(*argv_new) ))) break;
for (i = 0; i < count; i++) argv_new[i] = strdup_unixcp( args[i] );
argv_new[count] = cmdline;
argv_new[count + 1] = NULL;
TRACE( "Trying" );
for (i = 0; i <= count; i++) TRACE( " %s", wine_dbgstr_a( argv_new[i] ));
TRACE( "\n" );
TRACE( "Trying" );
for (i = 0; i <= count; i++) TRACE( " %s", wine_dbgstr_a( argv_new[i] ));
TRACE( "\n" );
_spawnvp( _P_OVERLAY, argv_new[0], (const char **)argv_new ); /* only returns on error */
for (i = 0; i < count; i++) HeapFree( GetProcessHeap(), 0, argv_new[i] );
HeapFree( GetProcessHeap(), 0, argv_new );
_spawnvp( _P_OVERLAY, argv_new[0], (const char **)argv_new ); /* only returns on error */
for (i = 0; i < count; i++) HeapFree( GetProcessHeap(), 0, argv_new[i] );
HeapFree( GetProcessHeap(), 0, argv_new );
} WINE_ERR( "could not find a suitable app to open %s\n", debugstr_w( argv1 ));} candidates += strlenW( candidates ) + 1; /* grab the next app */
-- 2.25.0