]> granicus.if.org Git - sudo/commitdiff
Move set_project() from sudoers module into sudo proper.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 1 Oct 2010 17:52:42 +0000 (13:52 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 1 Oct 2010 17:52:42 +0000 (13:52 -0400)
plugins/sudoers/sudoers.c
src/sudo.c

index 38b5973f81dfef778fee341cf4690cfeb042ad47..c3ee6b4f8d00d9ea2eec82ad4c419359796872d9 100644 (file)
 #  define LOGIN_DEFROOTCLASS   "daemon"
 # endif
 #endif
-#ifdef HAVE_PROJECT_H
-# include <project.h>
-# include <sys/task.h>
-#endif
 #ifdef HAVE_SELINUX
 # include <selinux/selinux.h>
 #endif
 static void init_vars(char * const *);
 static int set_cmnd(int);
 static void set_loginclass(struct passwd *);
-static void set_project(struct passwd *);
 static void set_runasgr(char *);
 static void set_runaspw(char *);
 static int sudoers_policy_version(int verbose);
@@ -789,9 +784,6 @@ set_cmnd(int sudo_mode)
     int rval;
     char *path = user_path;
 
-    /* Set project if applicable. */
-    set_project(runas_pw);
-
     /* Resolve the path and return. */
     rval = FOUND;
     user_stat = emalloc(sizeof(struct stat));
@@ -971,70 +963,6 @@ set_loginclass(struct passwd *pw)
 }
 #endif /* HAVE_LOGIN_CAP_H */
 
-#ifdef HAVE_PROJECT_H
-static void
-set_project(struct passwd *pw)
-{
-    int errflags = NO_MAIL|MSG_ONLY|NO_EXIT;
-    int errval;
-    struct project proj;
-    struct project *resultp = '\0';
-    char buf[1024];
-
-    /*
-     * Collect the default project for the user and settaskid
-     */
-    setprojent();
-    if (resultp = getdefaultproj(pw->pw_name, &proj, buf, sizeof(buf))) {
-       errval = setproject(resultp->pj_name, pw->pw_name, TASK_NORMAL);
-       if (errval != 0) {
-           switch(errval) {
-           case SETPROJ_ERR_TASK:
-               if (errno == EAGAIN)
-                   log_error(errflags, "resource control limit has been reached");
-               else if (errno == ESRCH)
-                   log_error(errflags, "user \"%s\" is not a member of "
-                       "project \"%s\"", pw->pw_name, resultp->pj_name);
-               else if (errno == EACCES)
-                   log_error(errflags, "the invoking task is final");
-               else
-                   log_error(errflags, "could not join project \"%s\"",
-                       resultp->pj_name);
-               break;
-           case SETPROJ_ERR_POOL:
-               if (errno == EACCES)
-                   log_error(errflags, "no resource pool accepting "
-                           "default bindings exists for project \"%s\"",
-                           resultp->pj_name);
-               else if (errno == ESRCH)
-                   log_error(errflags, "specified resource pool does "
-                           "not exist for project \"%s\"", resultp->pj_name);
-               else
-                   log_error(errflags, "could not bind to default "
-                           "resource pool for project \"%s\"", resultp->pj_name);
-               break;
-           default:
-               if (errval <= 0) {
-                   log_error(errflags, "setproject failed for project \"%s\"",
-                       resultp->pj_name);
-               } else {
-                   log_error(errflags, "warning, resource control assignment "
-                       "failed for project \"%s\"", resultp->pj_name);
-               }
-           }
-       }
-    } else {
-       log_error(errflags, "getdefaultproj() error: %s", strerror(errno));
-    }
-    endprojent();
-}
-#else
-static void
-set_project(struct passwd *pw)
-{
-}
-#endif /* HAVE_PROJECT_H */
-
 /*
  * Look up the fully qualified domain name and set user_host and user_shost.
  */
index aff798130e996df294509c716868d3fb356eecc2..3d45e3f2af4d4b41dae17d4de9e4754f52e49852 100644 (file)
 #ifdef HAVE_LOGIN_CAP_H
 # include <login_cap.h>
 #endif
+#ifdef HAVE_PROJECT_H
+# include <project.h>
+# include <sys/task.h>
+#endif
 #ifdef HAVE_SELINUX
 # include <selinux/selinux.h>
 #endif
@@ -637,6 +641,68 @@ disable_coredumps(void)
 #endif /* RLIMIT_CORE && !SUDO_DEVEL */
 }
 
+#ifdef HAVE_PROJECT_H
+static void
+set_project(struct passwd *pw)
+{
+    struct project proj;
+    char buf[PROJECT_BUFSZ];
+    int errval;
+
+    /*
+     * Collect the default project for the user and settaskid
+     */
+    setprojent();
+    if (getdefaultproj(pw->pw_name, &proj, buf, sizeof(buf)) != NULL) {
+       errval = setproject(proj.pj_name, pw->pw_name, TASK_NORMAL);
+       switch(errval) {
+       case 0:
+           break;
+       case SETPROJ_ERR_TASK:
+           switch (errno) {
+           case EAGAIN:
+               warningx("resource control limit has been reached");
+               break;
+           case ESRCH:
+               warningx("user \"%s\" is not a member of project \"%s\"",
+                   pw->pw_name, proj.pj_name);
+               break;
+           case EACCES:
+               warningx("the invoking task is final");
+               break;
+           default:
+               warningx("could not join project \"%s\"", proj.pj_name);
+           }
+       case SETPROJ_ERR_POOL:
+           switch (errno) {
+           case EACCES:
+               warningx("no resource pool accepting default bindings "
+                   "exists for project \"%s\"", proj.pj_name);
+               break;
+           case ESRCH:
+               warningx("specified resource pool does not exist for "
+                   "project \"%s\"", proj.pj_name);
+               break;
+           default:
+               warningx("could not bind to default resource pool for "
+                   "project \"%s\"", proj.pj_name);
+           }
+           break;
+       default:
+           if (errval <= 0) {
+               warningx("setproject failed for project \"%s\"", proj.pj_name);
+           } else {
+               warningx("warning, resource control assignment failed for "
+                   "project \"%s\"", proj.pj_name);
+           }
+       }
+    } else {
+       warning("getdefaultproj");
+    }
+    endprojent();
+}
+#endif /* HAVE_PROJECT_H */
+
 /*
  * Setup the execution environment immediately prior to the call to execve()
  * Returns TRUE on success and FALSE on failure.
@@ -671,6 +737,9 @@ exec_setup(struct command_details *details, const char *ptyname, int ptyfd)
 #endif
 
     if (pw != NULL) {
+#ifdef HAVE_PROJECT_H
+       set_project(pw);
+#endif
 #ifdef HAVE_GETUSERATTR
        aix_prep_user(pw->pw_name, ptyname ? ptyname : user_details.tty);
 #endif