Marcela Mašláňová 863193
diff -up at-3.1.10/atd.c.pamfix at-3.1.10/atd.c
Marcela Mašláňová c1bcbe
--- at-3.1.10/atd.c.pamfix	2008-07-18 16:23:11.000000000 +0200
Marcela Mašláňová c1bcbe
+++ at-3.1.10/atd.c	2008-07-18 16:23:11.000000000 +0200
Marcela Mašláňová 863193
@@ -131,15 +131,17 @@ static const struct pam_conv conv = {
Marcela Mašláňová 863193
 };
Marcela Mašláňová 863193
 
Marcela Mašláňová 863193
 #define PAM_FAIL_CHECK if (retcode != PAM_SUCCESS) { \
Marcela Mašláňová 863193
-	fprintf(stderr,"\n%s\n",pam_strerror(pamh, retcode)); \
Marcela Mašláňová 863193
+	fprintf(stderr,"\nPAM failure %s\n",pam_strerror(pamh, retcode)); \
Marcela Mašláňová 863193
 	syslog(LOG_ERR,"%s",pam_strerror(pamh, retcode)); \
Marcela Mašláňová 863193
-	pam_close_session(pamh, PAM_SILENT); \
Marcela Mašláňová 863193
-	pam_end(pamh, retcode); exit(1); \
Marcela Mašláňová 863193
+    if (pamh) \
Marcela Mašláňová 863193
+        pam_end(pamh, retcode); \
Marcela Mašláňová 863193
+    exit(1); \
Marcela Mašláňová 863193
     }
Marcela Mašláňová 863193
-#define PAM_END { retcode = pam_close_session(pamh,0); \
Marcela Mašláňová 863193
-		pam_end(pamh,retcode); }
Marcela Mašláňová 863193
 
Marcela Mašláňová 863193
-#endif /* WITH_PAM */
Marcela Mašláňová 863193
+#define PAM_SESSION_FAIL if (retcode != PAM_SUCCESS) \
Marcela Mašláňová 863193
+    pam_close_session(pamh, PAM_SILENT);
Marcela Mašláňová 863193
+
Marcela Mašláňová 863193
+#endif /* end WITH_PAM */
Marcela Mašláňová 863193
 
Marcela Mašláňová 863193
 /* Signal handlers */
Marcela Mašláňová 863193
 RETSIGTYPE 
Marcela Mašláňová 863193
@@ -408,6 +410,7 @@ run_file(const char *filename, uid_t uid
Marcela Mašláňová 863193
 
Marcela Mašláňová 863193
 //add for fedora, removed HAVE_PAM
Marcela Mašláňová 863193
 #ifdef  WITH_PAM
Marcela Mašláňová 863193
+    pamh = NULL;
Marcela Mašláňová 863193
     retcode = pam_start("atd", pentry->pw_name, &conv, &pamh);
Marcela Mašláňová 863193
     PAM_FAIL_CHECK;
Marcela Mašláňová 863193
     retcode = pam_set_item(pamh, PAM_TTY, "atd");
Marcela Mašláňová 863193
@@ -415,8 +418,10 @@ run_file(const char *filename, uid_t uid
Marcela Mašláňová 863193
     retcode = pam_acct_mgmt(pamh, PAM_SILENT);
Marcela Mašláňová 863193
     PAM_FAIL_CHECK;
Marcela Mašláňová 863193
     retcode = pam_open_session(pamh, PAM_SILENT);
Marcela Mašláňová 863193
+    PAM_SESSION_FAIL;
Marcela Mašláňová 863193
     PAM_FAIL_CHECK;
Marcela Mašláňová 863193
     retcode = pam_setcred(pamh, PAM_ESTABLISH_CRED | PAM_SILENT);
Marcela Mašláňová 863193
+    PAM_SESSION_FAIL;
Marcela Mašláňová 863193
     PAM_FAIL_CHECK;
Marcela Mašláňová 863193
     closelog();
Marcela Mašláňová 863193
     openlog("atd", LOG_PID, LOG_ATD);
Marcela Mašláňová c1bcbe
@@ -612,6 +617,7 @@ run_file(const char *filename, uid_t uid
Marcela Mašláňová c1bcbe
    int mail_pid = -1;
Marcela Mašláňová 863193
 //add for fedora
Marcela Mašláňová 863193
 #ifdef  WITH_PAM
Marcela Mašláňová 863193
+       pamh = NULL;
Marcela Mašláňová 863193
        retcode = pam_start("atd", pentry->pw_name, &conv, &pamh);
Marcela Mašláňová 863193
        PAM_FAIL_CHECK;
Marcela Mašláňová 863193
        retcode = pam_set_item(pamh, PAM_TTY, "atd");
Marcela Mašláňová c1bcbe
@@ -619,8 +625,10 @@ run_file(const char *filename, uid_t uid
Marcela Mašláňová 863193
        retcode = pam_acct_mgmt(pamh, PAM_SILENT);
Marcela Mašláňová 863193
        PAM_FAIL_CHECK;
Marcela Mašláňová 863193
        retcode = pam_open_session(pamh, PAM_SILENT);
Marcela Mašláňová 863193
+       PAM_SESSION_FAIL;
Marcela Mašláňová 863193
        PAM_FAIL_CHECK;
Marcela Mašláňová 863193
        retcode = pam_setcred(pamh, PAM_ESTABLISH_CRED | PAM_SILENT);
Marcela Mašláňová 863193
+       PAM_SESSION_FAIL;
Marcela Mašláňová 863193
        PAM_FAIL_CHECK;
Marcela Mašláňová 863193
         /* PAM has now re-opened our log to auth.info ! */
Marcela Mašláňová 863193
        closelog();
Marcela Mašláňová 863193
diff -up at-3.1.10/perm.c.pamfix at-3.1.10/perm.c
Marcela Mašláňová c1bcbe
--- at-3.1.10/perm.c.pamfix	2008-07-18 16:23:11.000000000 +0200
Marcela Mašláňová c1bcbe
+++ at-3.1.10/perm.c	2008-07-18 16:26:16.000000000 +0200
Marcela Mašláňová c1bcbe
@@ -135,34 +135,61 @@ check_permission()
Marcela Mašláňová 863193
  *  We must check if the atd daemon userid will be allowed to gain the job owner user's
Marcela Mašláňová 863193
  *  credentials with PAM . If not, the user has been denied at(1) usage, eg. with pam_access.
Marcela Mašláňová 863193
  */
Marcela Mašláňová 863193
-  setreuid(daemon_uid, daemon_uid);
Marcela Mašláňová 863193
-  setregid(daemon_gid, daemon_gid);
Marcela Mašláňová 863193
+  if (setreuid(daemon_uid, daemon_uid) != 0) {
Marcela Mašláňová 863193
+      fprintf(stderr, "cannot set egid: %s", strerror(errno));
Marcela Mašláňová 863193
+      exit(1);
Marcela Mašláňová 863193
+  }
Marcela Mašláňová 863193
+  if (setregid(daemon_gid, daemon_gid) != 0) {
Marcela Mašláňová 863193
+      fprintf(stderr, "cannot set euid: %s", strerror(errno));
Marcela Mašláňová 863193
+      exit(1);
Marcela Mašláňová 863193
+  }
Marcela Mašláňová 863193
 
Marcela Mašláňová 863193
 # define PAM_FAIL_CHECK if (retcode != PAM_SUCCESS) { \
Marcela Mašláňová 863193
-                              fprintf(stderr,"PAM authentication failure: %s\n",pam_strerror(pamh, retcode)); \
Marcela Mašláňová c1bcbe
-                 pam_close_session(pamh,PAM_SILENT); \
Marcela Mašláňová 863193
-                              pam_end(pamh, retcode); \
Marcela Mašláňová 863193
-                               setregid(gid,egid); \
Marcela Mašláňová 863193
-                               setreuid(uid,euid); \
Marcela Mašláňová 863193
-                               return(0); \
Marcela Mašláňová 863193
-                           }
Marcela Mašláňová 863193
+     fprintf(stderr,"PAM failure: %s\n",pam_strerror(pamh, retcode)); \
Marcela Mašláňová 863193
+     if (pamh) \
Marcela Mašláňová 863193
+         pam_end(pamh, retcode); \
Marcela Mašláňová 863193
+     if (setregid(gid,egid) != 0) { \
Marcela Mašláňová 863193
+         fprintf(stderr, "cannot set egid: %s", strerror(errno)); \
Marcela Mašláňová 863193
+         exit(1); \
Marcela Mašláňová 863193
+     } \
Marcela Mašláňová 863193
+     if (setreuid(uid,euid) != 0) { \
Marcela Mašláňová 863193
+         fprintf(stderr, "cannot set euid: %s", strerror(errno)); \
Marcela Mašláňová 863193
+         exit(1); \
Marcela Mašláňová 863193
+     } \
Marcela Mašláňová 863193
+     return(0); \
Marcela Mašláňová 863193
+     }
Marcela Mašláňová 863193
+
Marcela Mašláňová 863193
+# define PAM_SESSION_FAIL if (retcode != PAM_SUCCESS) \
Marcela Mašláňová 863193
+      pam_close_session(pamh,PAM_SILENT);
Marcela Mašláňová 863193
+
Marcela Mašláňová 863193
+  pamh = NULL;
Marcela Mašláňová 863193
   retcode = pam_start("atd", pentry->pw_name, &conv, &pamh);
Marcela Mašláňová 863193
   PAM_FAIL_CHECK;
Marcela Mašláňová 863193
   retcode = pam_set_item(pamh, PAM_TTY, "atd");
Marcela Mašláňová c1bcbe
   PAM_FAIL_CHECK;
Marcela Mašláňová 863193
   retcode = pam_acct_mgmt(pamh, PAM_SILENT);
Marcela Mašláňová c1bcbe
+  PAM_SESSION_FAIL;
Marcela Mašláňová 863193
   PAM_FAIL_CHECK;
Marcela Mašláňová 863193
   retcode = pam_open_session(pamh, PAM_SILENT);
Marcela Mašláňová 863193
+  PAM_SESSION_FAIL;
Marcela Mašláňová 863193
   PAM_FAIL_CHECK;
Marcela Mašláňová 863193
   retcode = pam_setcred(pamh, PAM_ESTABLISH_CRED | PAM_SILENT);
Marcela Mašláňová 863193
+  PAM_SESSION_FAIL;
Marcela Mašláňová 863193
   PAM_FAIL_CHECK;
Marcela Mašláňová 863193
 
Marcela Mašláňová 863193
   pam_setcred(pamh, PAM_DELETE_CRED | PAM_SILENT );
Marcela Mašláňová 863193
   pam_close_session(pamh,PAM_SILENT);
Marcela Mašláňová 863193
   pam_end(pamh, PAM_ABORT);
Marcela Mašláňová 863193
 
Marcela Mašláňová 863193
-  setregid(gid,egid);
Marcela Mašláňová 863193
-  setreuid(uid,euid);
Marcela Mašláňová 863193
+  if (setregid(gid,egid) != 0) {
Marcela Mašláňová 863193
+     fprintf(stderr, "cannot set egid: %s", strerror(errno));
Marcela Mašláňová 863193
+     exit(1);
Marcela Mašláňová 863193
+  }
Marcela Mašláňová 863193
+  if (setreuid(uid,euid) != 0) {
Marcela Mašláňová 863193
+     fprintf(stderr, "cannot set euid: %s", strerror(errno));
Marcela Mašláňová 863193
+     exit(1);
Marcela Mašláňová 863193
+  }
Marcela Mašláňová 863193
+
Marcela Mašláňová 863193
 
Marcela Mašláňová 863193
 #endif
Marcela Mašláňová 863193