File libgnomesu-reorder-pam-init.patch of Package libgnomesu
Index: libgnomesu-1.0.0/pam-backend/pam.c
===================================================================
--- libgnomesu-1.0.0.orig/pam-backend/pam.c
+++ libgnomesu-1.0.0/pam-backend/pam.c
@@ -323,18 +323,25 @@ main (int argc, char *argv[])
char **command = argv + 4;
pid_t pid;
int exitCode = 1, status;
+ int setcred = 0;
- modify_environment (pw);
- #ifdef HAVE_SETFSUID
- setfsuid (pw->pw_uid);
- #endif /* HAVE_SETFSUID */
- change_identity (pw);
+ init_groups (pw);
retval = pam_setcred (pamh, PAM_ESTABLISH_CRED);
if (retval != PAM_SUCCESS)
fprintf (stderr, "Warning: %s\n", pam_strerror (pamh, retval));
+ else
+ setcred = 1;
pam_open_session (pamh, 0);
+
+ #ifdef HAVE_SETFSUID
+ setfsuid (pw->pw_uid);
+ #endif /* HAVE_SETFSUID */
+ change_identity (pw);
+
+ modify_environment (pw);
+
pid = fork ();
switch (pid)
{
@@ -364,6 +371,8 @@ main (int argc, char *argv[])
break;
}
pam_close_session (pamh, 0);
+ if (setcred)
+ pam_setcred (pamh, PAM_DELETE_CRED | PAM_SILENT);
close_pam (pamh, retval);
/* evecvp() failed */
Index: libgnomesu-1.0.0/su-backend/common.c
===================================================================
--- libgnomesu-1.0.0.orig/su-backend/common.c
+++ libgnomesu-1.0.0/su-backend/common.c
@@ -223,13 +223,18 @@ modify_environment (const struct passwd
/* Become the user and group(s) specified by PW. */
void
-change_identity (const struct passwd *pw)
+init_groups (const struct passwd *pw)
{
#ifdef HAVE_INITGROUPS
errno = 0;
initgroups (pw->pw_name, pw->pw_gid);
endgrent ();
#endif
+}
+
+void
+change_identity (const struct passwd *pw)
+{
if (setgid (pw->pw_gid))
perror ("cannot set group id");
if (setuid (pw->pw_uid))
Index: libgnomesu-1.0.0/su-backend/common.h
===================================================================
--- libgnomesu-1.0.0.orig/su-backend/common.h
+++ libgnomesu-1.0.0/su-backend/common.h
@@ -30,6 +30,7 @@ char *concat (const char *s1, const char
void xputenv (const char *val);
void init_xauth (const struct passwd *pw);
void setup_xauth (const struct passwd *pw);
+void init_groups (const struct passwd *pw);
void change_identity (const struct passwd *pw);
void modify_environment (const struct passwd *pw);
void *safe_memset (void *s, int c, size_t n);
Index: libgnomesu-1.0.0/su-backend/su.c
===================================================================
--- libgnomesu-1.0.0.orig/su-backend/su.c
+++ libgnomesu-1.0.0/su-backend/su.c
@@ -322,6 +322,7 @@ main (int argc, char **argv)
init_xauth (pw);
modify_environment (pw);
+ init_groups (pw);
change_identity (pw);
setup_xauth (pw);