2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-08-31 22:35:10 +00:00

Change defaults callbacks to take a union sudo_defs_val * instead

of a char *.
This commit is contained in:
Todd C. Miller
2016-07-18 12:11:25 -06:00
parent 6ddc95a47c
commit 9b42640ef5
6 changed files with 45 additions and 29 deletions

View File

@@ -656,7 +656,7 @@ store_int(char *val, struct sudo_defs_types *def, int op)
def->sd_un.ival = i; def->sd_un.ival = i;
} }
if (def->callback) if (def->callback)
debug_return_bool(def->callback(val)); debug_return_bool(def->callback(&def->sd_un));
debug_return_bool(true); debug_return_bool(true);
} }
@@ -679,7 +679,7 @@ store_uint(char *val, struct sudo_defs_types *def, int op)
def->sd_un.uival = u; def->sd_un.uival = u;
} }
if (def->callback) if (def->callback)
debug_return_bool(def->callback(val)); debug_return_bool(def->callback(&def->sd_un));
debug_return_bool(true); debug_return_bool(true);
} }
@@ -700,7 +700,7 @@ store_float(char *val, struct sudo_defs_types *def, int op)
def->sd_un.fval = d; def->sd_un.fval = d;
} }
if (def->callback) if (def->callback)
debug_return_bool(def->callback(val)); debug_return_bool(def->callback(&def->sd_un));
debug_return_bool(true); debug_return_bool(true);
} }
@@ -728,7 +728,7 @@ store_tuple(char *val, struct sudo_defs_types *def, int op)
debug_return_bool(false); debug_return_bool(false);
} }
if (def->callback) if (def->callback)
debug_return_bool(def->callback(val)); debug_return_bool(def->callback(&def->sd_un));
debug_return_bool(true); debug_return_bool(true);
} }
@@ -747,7 +747,7 @@ store_str(char *val, struct sudo_defs_types *def, int op)
} }
} }
if (def->callback) if (def->callback)
debug_return_int(def->callback(val)); debug_return_int(def->callback(&def->sd_un));
debug_return_int(true); debug_return_int(true);
} }
@@ -861,7 +861,7 @@ store_mode(char *val, struct sudo_defs_types *def, int op)
def->sd_un.mode = mode; def->sd_un.mode = mode;
} }
if (def->callback) if (def->callback)
debug_return_bool(def->callback(val)); debug_return_bool(def->callback(&def->sd_un));
debug_return_bool(true); debug_return_bool(true);
} }

View File

@@ -43,6 +43,17 @@ struct def_values {
enum def_tuple nval;/* numeric value */ 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. * Structure describing compile-time and run-time options.
*/ */
@@ -51,17 +62,8 @@ struct sudo_defs_types {
int type; int type;
char *desc; char *desc;
struct def_values *values; struct def_values *values;
bool (*callback)(const char *); bool (*callback)(const union sudo_defs_val *);
union { union sudo_defs_val sd_un;
int flag;
int ival;
unsigned int uival;
double fval;
enum def_tuple tuple;
char *str;
mode_t mode;
struct list_members list;
} sd_un;
}; };
/* /*

View File

@@ -154,7 +154,7 @@ io_mkdirs(char *path, mode_t mode, bool is_temp)
/* /*
* Set max session ID (aka sequence number) * Set max session ID (aka sequence number)
*/ */
bool static bool
io_set_max_sessid(const char *maxval) io_set_max_sessid(const char *maxval)
{ {
const char *errstr; const char *errstr;
@@ -175,6 +175,19 @@ io_set_max_sessid(const char *maxval)
debug_return_bool(true); 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 * Read the on-disk sequence number, set sessid to the next
* number, and update the on-disk copy. * number, and update the on-disk copy.

View File

@@ -69,8 +69,8 @@
* Prototypes * Prototypes
*/ */
static char *find_editor(int nfiles, char **files, int *argc_out, char ***argv_out); static char *find_editor(int nfiles, char **files, int *argc_out, char ***argv_out);
static bool cb_runas_default(const char *); static bool cb_runas_default(const union sudo_defs_val *);
static bool cb_sudoers_locale(const char *); static bool cb_sudoers_locale(const union sudo_defs_val *);
static int set_cmnd(void); static int set_cmnd(void);
static int create_admin_success_flag(void); static int create_admin_success_flag(void);
static bool init_vars(char * const *); 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; sudo_defs_table[I_SUDOERS_LOCALE].callback = cb_sudoers_locale;
/* Set maxseq callback. */ /* 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() */ /* It is now safe to use log_warningx() and set_perms() */
if (unknown_user) { if (unknown_user) {
@@ -761,6 +761,7 @@ init_vars(char * const envp[])
(unsigned int) user_uid); (unsigned int) user_uid);
debug_return_bool(false); debug_return_bool(false);
} }
debug_return_bool(true); debug_return_bool(true);
} }
@@ -1171,11 +1172,11 @@ set_runasgr(const char *group, bool quiet)
* Callback for runas_default sudoers setting. * Callback for runas_default sudoers setting.
*/ */
static bool 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. */ /* Only reset runaspw if user didn't specify one. */
if (!runas_user && !runas_group) if (!runas_user && !runas_group)
return set_runaspw(user, true); return set_runaspw(sd_un->str, true);
return true; return true;
} }
@@ -1183,9 +1184,9 @@ cb_runas_default(const char *user)
* Callback for sudoers_locale sudoers setting. * Callback for sudoers_locale sudoers setting.
*/ */
static bool 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);
} }
/* /*

View File

@@ -317,7 +317,7 @@ bool get_boottime(struct timespec *);
/* iolog.c */ /* iolog.c */
bool io_nextid(char *iolog_dir, char *iolog_dir_fallback, char sessid[7]); 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 */ /* iolog_path.c */
char *expand_iolog_path(const char *prefix, const char *dir, const char *file, char *expand_iolog_path(const char *prefix, const char *dir, const char *file,

View File

@@ -71,7 +71,7 @@ void print_userspecs(void);
void usage(void) __attribute__((__noreturn__)); void usage(void) __attribute__((__noreturn__));
static void set_runaspw(const char *); static void set_runaspw(const char *);
static void set_runasgr(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); static int testsudoers_print(const char *msg);
extern void setgrfile(const char *); extern void setgrfile(const char *);
@@ -392,11 +392,11 @@ set_runasgr(const char *group)
* Callback for runas_default sudoers setting. * Callback for runas_default sudoers setting.
*/ */
static bool 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. */ /* Only reset runaspw if user didn't specify one. */
if (!runas_user && !runas_group) if (!runas_user && !runas_group)
set_runaspw(user); set_runaspw(sd_un->str);
return true; return true;
} }