File libgnomesu-check-setuid-retval.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
@@ -338,7 +338,15 @@ main (int argc, char *argv[])
 		#ifdef HAVE_SETFSUID
 		setfsuid (pw->pw_uid);
 		#endif /* HAVE_SETFSUID */
-		change_identity (pw);
+
+		if (change_identity (pw)) {
+			pam_close_session (pamh, 0);
+			if (setcred)
+				pam_setcred (pamh, PAM_DELETE_CRED | PAM_SILENT);
+			close_pam (pamh, retval);
+			fprintf (outf, PROTOCOL_ERROR);
+			return 1;
+		}
 
 		modify_environment (pw);
 
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
@@ -232,13 +232,20 @@ init_groups (const struct passwd *pw)
 #endif
 }
 
-void
+int
 change_identity (const struct passwd *pw)
 {
-	if (setgid (pw->pw_gid))
+	if (setgid (pw->pw_gid)) {
 		perror ("cannot set group id");
-	if (setuid (pw->pw_uid))
+		return -1;
+	}
+
+	if (setuid (pw->pw_uid)) {
 		perror ("cannot set user id");
+		return -1;
+	}
+
+	return 0;
 }
 
 void
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
@@ -323,7 +323,12 @@ main (int argc, char **argv)
   init_xauth (pw);
   modify_environment (pw);
   init_groups (pw);
-  change_identity (pw);
+
+  if (change_identity (pw)) {
+	  fprintf (outf, PROTOCOL_ERROR);
+	  return 1;
+  }
+
   setup_xauth (pw);
 
   fprintf (outf, PROTOCOL_DONE);
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
@@ -31,7 +31,7 @@ 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);
+int  change_identity (const struct passwd *pw);
 void modify_environment (const struct passwd *pw);
 void *safe_memset (void *s, int c, size_t n);
 
openSUSE Build Service is sponsored by