]> granicus.if.org Git - sudo/commitdiff
update_defaults() needs to be able to take a defaults_list for
authorTodd C. Miller <Todd.Miller@sudo.ws>
Thu, 2 Aug 2018 20:06:36 +0000 (14:06 -0600)
committerTodd C. Miller <Todd.Miller@sudo.ws>
Thu, 2 Aug 2018 20:06:36 +0000 (14:06 -0600)
the ldap/sssd backends which support per-role defaults.

plugins/sudoers/defaults.c
plugins/sudoers/defaults.h
plugins/sudoers/parse.c
plugins/sudoers/sudoers.c
plugins/sudoers/testsudoers.c
plugins/sudoers/visudo.c

index 8611d5906585b44644103437ca55894460da15b8..bfe4ee46d7a45444a6d069c9f0bef84912c61f13 100644 (file)
@@ -730,7 +730,8 @@ default_binding_matches(struct sudoers_parse_tree *parse_tree,
  * Pass in an OR'd list of which default types to update.
  */
 bool
-update_defaults(struct sudoers_parse_tree *parse_tree, int what, bool quiet)
+update_defaults(struct sudoers_parse_tree *parse_tree,
+    struct defaults_list *defs, int what, bool quiet)
 {
     struct defaults *d;
     bool ret = true;
@@ -739,10 +740,14 @@ update_defaults(struct sudoers_parse_tree *parse_tree, int what, bool quiet)
     sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
        "what: 0x%02x", what);
 
+    /* If no defaults list specified, use the global one in the parse tree. */
+    if (defs == NULL)
+       defs = &parse_tree->defaults;
+
     /*
      * First apply Defaults values marked as early.
      */
-    TAILQ_FOREACH(d, &parse_tree->defaults, entries) {
+    TAILQ_FOREACH(d, defs, entries) {
        struct early_default *early = is_early_default(d->var);
        if (early == NULL)
            continue;
@@ -764,7 +769,7 @@ update_defaults(struct sudoers_parse_tree *parse_tree, int what, bool quiet)
     /*
      * Then set the rest of the defaults.
      */
-    TAILQ_FOREACH(d, &parse_tree->defaults, entries) {
+    TAILQ_FOREACH(d, defs, entries) {
        /* Skip Defaults marked as early, we already did them. */
        if (is_early_default(d->var))
            continue;
index 3d360b8e05958760625822d998f47283f73d68b5..4b2db16c41f9d70bde83020af1b325254146f6ba 100644 (file)
@@ -122,6 +122,7 @@ struct early_default {
 /*
  * Prototypes
  */
+struct defaults_list;
 struct sudoers_parse_tree;
 void dump_default(void);
 bool init_defaults(void);
@@ -129,7 +130,7 @@ struct early_default *is_early_default(const char *name);
 bool run_early_defaults(void);
 bool set_early_default(const char *var, const char *val, int op, const char *file, int lineno, bool quiet, struct early_default *early);
 bool set_default(const char *var, const char *val, int op, const char *file, int lineno, bool quiet);
-bool update_defaults(struct sudoers_parse_tree *parse_tree, int what, bool quiet);
+bool update_defaults(struct sudoers_parse_tree *parse_tree, struct defaults_list *defs, int what, bool quiet);
 bool check_defaults(struct sudoers_parse_tree *parse_tree, bool quiet);
 
 extern struct sudo_defs_types sudo_defs_table[];
index f61518636c99fb4f3f2da0fad2086ff3b87c48aa..25a07e0efb640356da31972041700dee4f8fc620 100644 (file)
@@ -310,7 +310,7 @@ sudoers_lookup(struct sudo_nss_list *snl, struct passwd *pw, int validated,
     }
     if (match != UNSPEC) {
        if (defs != NULL)
-           update_defaults(parse_tree, SETDEF_GENERIC, false);
+           update_defaults(parse_tree, defs, SETDEF_GENERIC, false);
        if (!apply_cmndspec(cs))
            SET(validated, VALIDATE_ERROR);
        else if (match == ALLOW)
index 28c6ada56991807a18c84156a410a355b61390a2..a7916315c742b2c444dd0e07a3373ff728e5a55a 100644 (file)
@@ -198,7 +198,7 @@ sudoers_policy_init(void *info, char * const envp[])
        }
 
        sources++;
-       if (nss->getdefs(nss) == -1 || !update_defaults(nss->parse_tree,
+       if (nss->getdefs(nss) == -1 || !update_defaults(nss->parse_tree, NULL,
            SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER|SETDEF_RUNAS, false)) {
            log_warningx(SLOG_SEND_MAIL|SLOG_NO_STDERR,
                N_("problem with defaults entries"));
@@ -854,7 +854,7 @@ set_cmnd(void)
        user_base = user_cmnd;
 
     TAILQ_FOREACH(nss, snl, entries) {
-       if (!update_defaults(nss->parse_tree, SETDEF_CMND, false)) {
+       if (!update_defaults(nss->parse_tree, NULL, SETDEF_CMND, false)) {
            log_warningx(SLOG_SEND_MAIL|SLOG_NO_STDERR,
                N_("problem with defaults entries"));
        }
index fde8b743e85a9a0a35a52b1838293e8b767e8ef9..489a4b3d818a8ea89a4e93fa05bc6af92cad18c8 100644 (file)
@@ -285,7 +285,7 @@ main(int argc, char *argv[])
        (void) fputs("Parses OK", stdout);
     }
 
-    if (!update_defaults(&parsed_policy, SETDEF_ALL, false))
+    if (!update_defaults(&parsed_policy, NULL, SETDEF_ALL, false))
        (void) fputs(" (problem with defaults entries)", stdout);
     puts(".");
 
index 340dbb5c5030d2025f2a49c0d80797719d2862b6..533c952e8f875931fd25bdccb049ff8e235e882b 100644 (file)
@@ -246,7 +246,7 @@ main(int argc, char *argv[])
     init_parser(sudoers_file, quiet);
     sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale);
     (void) sudoersparse();
-    (void) update_defaults(&parsed_policy,
+    (void) update_defaults(&parsed_policy, NULL,
        SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER, quiet);
     sudoers_setlocale(oldlocale, NULL);
 
@@ -602,7 +602,7 @@ reparse_sudoers(char *editor, int editor_argc, char **editor_argv,
        }
        fclose(sudoersin);
        if (!parse_error) {
-           (void) update_defaults(&parsed_policy,
+           (void) update_defaults(&parsed_policy, NULL,
                SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER, true);
            check_defaults_and_aliases(strict, quiet);
        }
@@ -920,7 +920,7 @@ check_syntax(const char *sudoers_file, bool quiet, bool strict, bool oldperms)
            sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
     }
     if (!parse_error) {
-       (void) update_defaults(&parsed_policy,
+       (void) update_defaults(&parsed_policy, NULL,
            SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER, true);
        check_defaults_and_aliases(strict, quiet);
     }