]> granicus.if.org Git - sudo/commitdiff
Change defaults callbacks to take a union sudo_defs_val * instead
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 18 Jul 2016 18:11:25 +0000 (12:11 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 18 Jul 2016 18:11:25 +0000 (12:11 -0600)
of a char *.

plugins/sudoers/defaults.c
plugins/sudoers/defaults.h
plugins/sudoers/iolog.c
plugins/sudoers/sudoers.c
plugins/sudoers/sudoers.h
plugins/sudoers/testsudoers.c

index b1916f0aec51e8cbbca781e4e913de158ba19591..c63c4373d0a9dc978c1501f145cdaca288db62b3 100644 (file)
@@ -656,7 +656,7 @@ store_int(char *val, struct sudo_defs_types *def, int op)
        def->sd_un.ival = i;
     }
     if (def->callback)
-       debug_return_bool(def->callback(val));
+       debug_return_bool(def->callback(&def->sd_un));
     debug_return_bool(true);
 }
 
@@ -679,7 +679,7 @@ store_uint(char *val, struct sudo_defs_types *def, int op)
        def->sd_un.uival = u;
     }
     if (def->callback)
-       debug_return_bool(def->callback(val));
+       debug_return_bool(def->callback(&def->sd_un));
     debug_return_bool(true);
 }
 
@@ -700,7 +700,7 @@ store_float(char *val, struct sudo_defs_types *def, int op)
        def->sd_un.fval = d;
     }
     if (def->callback)
-       debug_return_bool(def->callback(val));
+       debug_return_bool(def->callback(&def->sd_un));
     debug_return_bool(true);
 }
 
@@ -728,7 +728,7 @@ store_tuple(char *val, struct sudo_defs_types *def, int op)
            debug_return_bool(false);
     }
     if (def->callback)
-       debug_return_bool(def->callback(val));
+       debug_return_bool(def->callback(&def->sd_un));
     debug_return_bool(true);
 }
 
@@ -747,7 +747,7 @@ store_str(char *val, struct sudo_defs_types *def, int op)
        }
     }
     if (def->callback)
-       debug_return_int(def->callback(val));
+       debug_return_int(def->callback(&def->sd_un));
     debug_return_int(true);
 }
 
@@ -861,7 +861,7 @@ store_mode(char *val, struct sudo_defs_types *def, int op)
        def->sd_un.mode = mode;
     }
     if (def->callback)
-       debug_return_bool(def->callback(val));
+       debug_return_bool(def->callback(&def->sd_un));
     debug_return_bool(true);
 }
 
index 03f327bddbca0caa5fff3760595ad5012e0b3953..d7827c92c2baa11b1d47f0bfd034ec7fa00f686f 100644 (file)
@@ -43,6 +43,17 @@ struct def_values {
     enum def_tuple nval;/* numeric value */
 };
 
+union sudo_defs_val {
+    int flag;
+    int ival;
+    unsigned int uival;
+    double fval;
+    enum def_tuple tuple;
+    char *str;
+    mode_t mode;
+    struct list_members list;
+};
+
 /*
  * Structure describing compile-time and run-time options.
  */
@@ -51,17 +62,8 @@ struct sudo_defs_types {
     int type;
     char *desc;
     struct def_values *values;
-    bool (*callback)(const char *);
-    union {
-       int flag;
-       int ival;
-       unsigned int uival;
-       double fval;
-       enum def_tuple tuple;
-       char *str;
-       mode_t mode;
-       struct list_members list;
-    } sd_un;
+    bool (*callback)(const union sudo_defs_val *);
+    union sudo_defs_val sd_un;
 };
 
 /*
index bde966ec3be45eb83c17fc38f6304b7ac831c318..61c3130897d0018bdf7d6c2e202c98963ea11052 100644 (file)
@@ -154,7 +154,7 @@ io_mkdirs(char *path, mode_t mode, bool is_temp)
 /*
  * Set max session ID (aka sequence number)
  */
-bool
+static bool
 io_set_max_sessid(const char *maxval)
 {
     const char *errstr;
@@ -175,6 +175,19 @@ io_set_max_sessid(const char *maxval)
     debug_return_bool(true);
 }
 
+/*
+ * Sudoers callback for maxseq Defaults setting.
+ */
+bool
+cb_maxseq(const union sudo_defs_val *sd_un)
+{
+    debug_decl(cb_maxseq, SUDOERS_DEBUG_UTIL)
+
+    /* Clamp value to SESSID_MAX as documented. */
+    sessid_max = sd_un->uival < SESSID_MAX ? sd_un->uival : SESSID_MAX;
+    debug_return_bool(true);
+}
+
 /*
  * Read the on-disk sequence number, set sessid to the next
  * number, and update the on-disk copy.
index f44b00dfef0d0a1130f5f9295520d0f1a42895d3..0c4e56b501c58a603a2fd5bae80c1b3dc13b3d56 100644 (file)
@@ -69,8 +69,8 @@
  * Prototypes
  */
 static char *find_editor(int nfiles, char **files, int *argc_out, char ***argv_out);
-static bool cb_runas_default(const char *);
-static bool cb_sudoers_locale(const char *);
+static bool cb_runas_default(const union sudo_defs_val *);
+static bool cb_sudoers_locale(const union sudo_defs_val *);
 static int set_cmnd(void);
 static int create_admin_success_flag(void);
 static bool init_vars(char * const *);
@@ -753,7 +753,7 @@ init_vars(char * const envp[])
     sudo_defs_table[I_SUDOERS_LOCALE].callback = cb_sudoers_locale;
 
     /* Set maxseq callback. */
-    sudo_defs_table[I_MAXSEQ].callback = io_set_max_sessid;
+    sudo_defs_table[I_MAXSEQ].callback = cb_maxseq;
 
     /* It is now safe to use log_warningx() and set_perms() */
     if (unknown_user) {
@@ -761,6 +761,7 @@ init_vars(char * const envp[])
            (unsigned int) user_uid);
        debug_return_bool(false);
     }
+
     debug_return_bool(true);
 }
 
@@ -1171,11 +1172,11 @@ set_runasgr(const char *group, bool quiet)
  * Callback for runas_default sudoers setting.
  */
 static bool
-cb_runas_default(const char *user)
+cb_runas_default(const union sudo_defs_val *sd_un)
 {
     /* Only reset runaspw if user didn't specify one. */
     if (!runas_user && !runas_group)
-       return set_runaspw(user, true);
+       return set_runaspw(sd_un->str, true);
     return true;
 }
 
@@ -1183,9 +1184,9 @@ cb_runas_default(const char *user)
  * Callback for sudoers_locale sudoers setting.
  */
 static bool
-cb_sudoers_locale(const char *locale)
+cb_sudoers_locale(const union sudo_defs_val *sd_un)
 {
-    return sudoers_initlocale(NULL, locale);
+    return sudoers_initlocale(NULL, sd_un->str);
 }
 
 /*
index 6f41aeb2ede317df30a69729ac40242602c3de8f..4f988f9468a3069185db55c9e41ffffbacb0c7ef 100644 (file)
@@ -317,7 +317,7 @@ bool get_boottime(struct timespec *);
 
 /* iolog.c */
 bool io_nextid(char *iolog_dir, char *iolog_dir_fallback, char sessid[7]);
-bool io_set_max_sessid(const char *sessid);
+bool cb_maxseq(const union sudo_defs_val *sd_un);
 
 /* iolog_path.c */
 char *expand_iolog_path(const char *prefix, const char *dir, const char *file,
index f59c448dba1ce5282bd40a641e4655807d4bbf2e..009dfd04c9c00d5563abf4c249367d5ab2481cc8 100644 (file)
@@ -71,7 +71,7 @@ void print_userspecs(void);
 void usage(void) __attribute__((__noreturn__));
 static void set_runaspw(const char *);
 static void set_runasgr(const char *);
-static bool cb_runas_default(const char *);
+static bool cb_runas_default(const union sudo_defs_val *);
 static int testsudoers_print(const char *msg);
 
 extern void setgrfile(const char *);
@@ -392,11 +392,11 @@ set_runasgr(const char *group)
  * Callback for runas_default sudoers setting.
  */
 static bool
-cb_runas_default(const char *user)
+cb_runas_default(const union sudo_defs_val *sd_un)
 {
     /* Only reset runaspw if user didn't specify one. */
     if (!runas_user && !runas_group)
-        set_runaspw(user);
+        set_runaspw(sd_un->str);
     return true;
 }