]> granicus.if.org Git - sudo/commitdiff
Defer setting runas defaults until after runaspw/gr is setup.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 1 Nov 2008 13:20:01 +0000 (13:20 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 1 Nov 2008 13:20:01 +0000 (13:20 +0000)
defaults.h
parse.c
sudo.c
testsudoers.c
visudo.c

index 7e547f8aa1f6f132b10a4dee4a886153bc95575c..827632c4d1e87acd53f7b4e0c7997c282f1dd364 100644 (file)
@@ -93,9 +93,12 @@ struct sudo_defs_types {
 /*
  * Argument to update_defaults()
  */
-#define        SKIP_CMND       1
-#define        ONLY_CMND       0
-#define        SET_ALL         -1
+#define SETDEF_GENERIC 0x01
+#define        SETDEF_HOST     0x02
+#define        SETDEF_USER     0x04
+#define        SETDEF_RUNAS    0x08
+#define        SETDEF_CMND     0x10
+#define SETDEF_ALL     (SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER|SETDEF_RUNAS|SETDEF_CMND)
 
 /*
  * Prototypes
diff --git a/parse.c b/parse.c
index 6e9ffcd994e9d704a1946a7ce1bf10c34201f556..c58ac38ada64be21e5c8f659d18b5e891e73a889 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -133,37 +133,42 @@ sudo_file_parse(nss)
  * Returns TRUE on success and FALSE on failure.
  */
 int
-update_defaults(skip_cmnd)
-    int skip_cmnd;
+update_defaults(what)
+    int what;
 {
     struct defaults *def;
 
     tq_foreach_fwd(&defaults, def) {
-       if (skip_cmnd == (def->type == DEFAULTS_CMND))
-           continue;
        switch (def->type) {
            case DEFAULTS:
-               if (!set_default(def->var, def->val, def->op))
+               if (ISSET(what, SETDEF_GENERIC) &&
+                   !set_default(def->var, def->val, def->op))
                    return(FALSE);
+               break;
            case DEFAULTS_USER:
-               if (userlist_matches(sudo_user.pw, &def->binding) == ALLOW &&
+               if (ISSET(what, SETDEF_USER) &&
+                   userlist_matches(sudo_user.pw, &def->binding) == ALLOW &&
                    !set_default(def->var, def->val, def->op))
                    return(FALSE);
                break;
            case DEFAULTS_RUNAS:
-               if (runaslist_matches(&def->binding, NULL) == ALLOW &&
+               if (ISSET(what, SETDEF_RUNAS) &&
+                   runaslist_matches(&def->binding, NULL) == ALLOW &&
                    !set_default(def->var, def->val, def->op))
                    return(FALSE);
                break;
            case DEFAULTS_HOST:
-               if (hostlist_matches(&def->binding) == ALLOW &&
+               if (ISSET(what, SETDEF_HOST) &&
+                   hostlist_matches(&def->binding) == ALLOW &&
                    !set_default(def->var, def->val, def->op))
                    return(FALSE);
                break;
            case DEFAULTS_CMND:
-               if (cmndlist_matches(&def->binding) == ALLOW &&
+               if (ISSET(what, SETDEF_CMND) &&
+                   cmndlist_matches(&def->binding) == ALLOW &&
                    !set_default(def->var, def->val, def->op))
                    return(FALSE);
+               break;
        }
     }
     return(TRUE);
@@ -179,7 +184,7 @@ sudo_file_setdefs(nss)
     if (nss->handle == NULL)
        return(-1);
 
-    if (!update_defaults(SKIP_CMND))
+    if (!update_defaults(SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER))
        return(-1);
     return(0);
 }
diff --git a/sudo.c b/sudo.c
index 8c3c73e547b1ce41dc2d13ae84b2821f6262e7b7..17de1116fa5e71fde6632d27b36e097b9219c2eb 100644 (file)
--- a/sudo.c
+++ b/sudo.c
@@ -293,6 +293,9 @@ main(argc, argv, envp)
     } else
        set_runaspw(runas_user ? runas_user : def_runas_default);
 
+    if (!update_defaults(SETDEF_RUNAS))
+       log_error(NO_STDERR|NO_EXIT, "problem with defaults entries");
+
     /* Set login class if applicable. */
     set_loginclass(sudo_user.pw);
 
@@ -807,7 +810,7 @@ set_cmnd(sudo_mode)
     else
        user_base = user_cmnd;
 
-    if (!update_defaults(ONLY_CMND))
+    if (!update_defaults(SETDEF_CMND))
        log_error(NO_STDERR|NO_EXIT, "problem with defaults entries");
 
     return(rval);
index c5997b65cc011227241cab557aa260245f1f3d86..e5961b3bfae0177e231dbfa25bd8f0747474a6dc 100644 (file)
@@ -254,7 +254,7 @@ main(argc, argv)
     else
        (void) fputs("Parses OK", stdout);
 
-    if (!update_defaults(SET_ALL))
+    if (!update_defaults(SETDEF_ALL))
        (void) fputs(" (problem with defaults entries)", stdout);
     puts(".");
 
@@ -336,9 +336,10 @@ set_runasgr(group)
     }
 }
 
+/* XXX - sanity check defaults settings */
 int
-update_defaults(skip_cmnd)
-    int skip_cmnd;
+update_defaults(what)
+    int what;
 {
     return(TRUE);
 }
index 433614ef6e66d4ef7d1fbe5b6059c4e5c613922c..eb4b86a4509538055da98ba6972650fd5645b276 100644 (file)
--- a/visudo.c
+++ b/visudo.c
@@ -208,7 +208,7 @@ main(argc, argv)
        error(1, "%s", sudoers_path);
     init_parser(sudoers_path, 0);
     yyparse();
-    (void) update_defaults(SKIP_CMND);
+    (void) update_defaults(SETDEF_ALL & ~SETDEF_CMND);
 
     editor = get_editor(&args);
 
@@ -565,9 +565,10 @@ user_is_exempt()
 }
 
 /* STUB */
+/* XXX - parse defaults to get editor and env_editor values */
 int
-update_defaults(skip_cmnd)
-    int skip_cmnd;
+update_defaults(what)
+    int what;
 {
     return(TRUE);
 }