diff -upr gdm-2.16.1-pre/daemon/slave.c gdm-2.16.1-post/daemon/slave.c --- gdm-2.16.1-pre/daemon/slave.c 2006-08-07 14:49:29.000000000 -0500 +++ gdm-2.16.1-post/daemon/slave.c 2006-11-07 16:54:20.000000000 -0600 @@ -3358,7 +3358,7 @@ session_child_run (struct passwd *pwent, #ifndef HAVE_TSOL char *argv[4]; #else - char *argv[7]; + char *argv[9]; #endif #ifdef CAN_USE_SETPENV @@ -3584,10 +3584,12 @@ session_child_run (struct passwd *pwent, argv[1] = NULL; argv[2] = NULL; argv[3] = NULL; -#ifdef HAVE_TSOL argv[4] = NULL; argv[5] = NULL; +#ifdef HAVE_TSOL argv[6] = NULL; + argv[7] = NULL; + argv[8] = NULL; #endif exec = NULL; @@ -3640,11 +3642,27 @@ session_child_run (struct passwd *pwent, argv[3] = argv[4] = argv[5] = argv[6] = NULL; } else { #endif - argv[0] = basexsession; - argv[1] = exec; - argv[2] = NULL; + /* If it looks like we are using bash, then run the Xsession + script in a login shell and pass it 'no-fake-login' as its + second argument. This keeps Xsession from sourcing .profile or + otherwise trying to pretend to be a login shell. */ + + if (strlen (pwent->pw_shell) > 4 + && ! strcmp (pwent->pw_shell + strlen (pwent->pw_shell) - 5, "/bash") + && g_file_test (pwent->pw_shell, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_EXECUTABLE)) { + argv[0] = pwent->pw_shell; + argv[1] = "--login"; + argv[2] = basexsession; + argv[3] = exec; + argv[4] = "no-fake-login"; + argv[5] = NULL; + } else { + argv[0] = basexsession; + argv[1] = exec; + argv[2] = NULL; + } #ifdef HAVE_TSOL - argv[3] = argv[4] = argv[5] = argv[6] = NULL; + argv [3] = argv [4] = argv[5] = argv[6] = argv[7] = argv[8] = NULL; } #endif } @@ -3793,7 +3811,6 @@ session_child_run (struct passwd *pwent, failsafe = TRUE; } -#ifdef HAVE_TSOL gdm_debug ("Running %s %s %s %s %s %s for %s on %s", argv[0], ve_sure_string (argv[1]), @@ -3802,13 +3819,6 @@ session_child_run (struct passwd *pwent, ve_sure_string (argv[4]), ve_sure_string (argv[5]), login, d->name); -#else - gdm_debug ("Running %s %s %s for %s on %s", - argv[0], - ve_sure_string (argv[1]), - ve_sure_string (argv[2]), - login, d->name); -#endif if ( ! ve_string_empty (pwent->pw_shell)) { shell = pwent->pw_shell;