of a char *.
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);
}
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);
}
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);
}
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);
}
}
}
if (def->callback)
- debug_return_int(def->callback(val));
+ debug_return_int(def->callback(&def->sd_un));
debug_return_int(true);
}
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);
}
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.
*/
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;
};
/*
/*
* Set max session ID (aka sequence number)
*/
-bool
+static bool
io_set_max_sessid(const char *maxval)
{
const char *errstr;
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.
* 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 *);
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) {
(unsigned int) user_uid);
debug_return_bool(false);
}
+
debug_return_bool(true);
}
* 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;
}
* 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);
}
/*
/* 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,
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 *);
* 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;
}