]> granicus.if.org Git - sudo/commitdiff
Add set_runaspw() function to fill in runas_pw. This will be used
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 16 Jan 2004 23:09:20 +0000 (23:09 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 16 Jan 2004 23:09:20 +0000 (23:09 +0000)
as a callback to update runas_pw when the runas user changes.

sudo.c

diff --git a/sudo.c b/sudo.c
index 7be58b47fc618ae14b0bca24b72d2fefad9844c5..a397f2814a9c8f3f6ae75a0435fe194a901f82f5 100644 (file)
--- a/sudo.c
+++ b/sudo.c
@@ -126,6 +126,7 @@ extern char **rebuild_env           __P((char **, int, int));
 extern char **zero_env                 __P((char **));
 extern struct passwd *sudo_getpwnam    __P((const char *));
 extern struct passwd *sudo_getpwuid    __P((uid_t));
+extern struct passwd *sudo_pwdup       __P((const struct passwd *));
 
 /*
  * Globals
@@ -280,23 +281,6 @@ main(argc, argv, envp)
     }
 #endif
 
-    /*
-     * Look up runas user passwd struct.  If we are given a uid then
-     * there may be no corresponding passwd(5) entry (which is OK).
-     */
-    if (**user_runas == '#') {
-       runas_pw = sudo_getpwuid(atoi(*user_runas + 1));
-       if (runas_pw == NULL) {
-           runas_pw = emalloc(sizeof(struct passwd));
-           (void) memset((VOID *)runas_pw, 0, sizeof(struct passwd));
-           runas_pw->pw_uid = atoi(*user_runas + 1);
-       }
-    } else {
-       runas_pw = sudo_getpwnam(*user_runas);
-       if (runas_pw == NULL)
-           log_error(NO_MAIL|MSG_ONLY, "no passwd entry for %s!", *user_runas);
-    }
-
     /*
      * Look up the timestamp dir owner if one is specified.
      */
@@ -544,15 +528,14 @@ init_vars(sudo_mode)
 
     /* It is now safe to use log_error() and set_perms() */
 
-    /*
-     * Must defer set_fqdn() until it is safe to call log_error()
-     */
     if (def_fqdn)
-       set_fqdn();
+       set_fqdn();                     /* may call log_error() */
 
     if (nohostname)
        log_error(USE_ERRNO|MSG_ONLY, "can't get hostname");
 
+    set_runaspw(*user_runas);          /* may call log_error() */
+
     /*
      * Get current working directory.  Try as user, fall back to root.
      */
@@ -965,6 +948,31 @@ set_fqdn()
     }
 }
 
+/*
+ * Get passwd entry for the user we are going to run commands as.
+ * By default, this is "root".  Updates runas_pw as a side effect.
+ */
+int
+set_runaspw(user)
+    char *user;
+{
+    if (runas_pw != NULL)
+       free(runas_pw);
+    if (*user == '#') {
+       runas_pw = sudo_getpwuid(atoi(user + 1));
+       if (runas_pw == NULL) {
+           runas_pw = emalloc(sizeof(struct passwd));
+           (void) memset((VOID *)runas_pw, 0, sizeof(struct passwd));
+           runas_pw->pw_uid = atoi(user + 1);
+       }
+    } else {
+       runas_pw = sudo_getpwnam(user);
+       if (runas_pw == NULL)
+           log_error(NO_MAIL|MSG_ONLY, "no passwd entry for %s!", user);
+    }
+    return(TRUE);
+}
+
 /*
  * Get passwd entry for the user we are going to authenticate as.
  * By default, this is the user invoking sudo...