/*
- * Copyright (c) 1999-2005, 2007-2015
+ * Copyright (c) 1999-2005, 2007-2016
* Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* This is only meaningful for variables that are *optional*.
*/
bool
-set_default(const char *var, const char *val, int op)
+set_default(const char *var, const char *val, int op, bool quiet)
{
struct sudo_defs_types *cur;
int num;
break;
}
if (!cur->name) {
- sudo_warnx(U_("unknown defaults entry `%s'"), var);
+ if (!quiet)
+ sudo_warnx(U_("unknown defaults entry `%s'"), var);
debug_return_bool(false);
}
switch (cur->type & T_MASK) {
case T_LOGFAC:
if (!store_syslogfac(val, cur, op)) {
- if (val)
- sudo_warnx(U_("value `%s' is invalid for option `%s'"),
- val, var);
- else
- sudo_warnx(U_("no value specified for `%s'"), var);
+ if (!quiet) {
+ if (val)
+ sudo_warnx(U_("value `%s' is invalid for option `%s'"),
+ val, var);
+ else
+ sudo_warnx(U_("no value specified for `%s'"), var);
+ }
debug_return_bool(false);
}
break;
case T_LOGPRI:
if (!store_syslogpri(val, cur, op)) {
- if (val)
- sudo_warnx(U_("value `%s' is invalid for option `%s'"),
- val, var);
- else
- sudo_warnx(U_("no value specified for `%s'"), var);
+ if (!quiet) {
+ if (val)
+ sudo_warnx(U_("value `%s' is invalid for option `%s'"),
+ val, var);
+ else
+ sudo_warnx(U_("no value specified for `%s'"), var);
+ }
debug_return_bool(false);
}
break;
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
if (!ISSET(cur->type, T_BOOL) || op != false) {
- sudo_warnx(U_("no value specified for `%s'"), var);
+ if (!quiet)
+ sudo_warnx(U_("no value specified for `%s'"), var);
debug_return_bool(false);
}
}
if (ISSET(cur->type, T_PATH) && val && *val != '/') {
- sudo_warnx(U_("values for `%s' must start with a '/'"), var);
+ if (!quiet)
+ sudo_warnx(U_("values for `%s' must start with a '/'"), var);
debug_return_bool(false);
}
switch (store_str(val, cur, op)) {
/* OK */
break;
case false:
- sudo_warnx(U_("value `%s' is invalid for option `%s'"), val, var);
+ if (!quiet) {
+ sudo_warnx(U_("value `%s' is invalid for option `%s'"),
+ val, var);
+ }
/* FALLTHROUGH */
default:
debug_return_bool(false);
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
if (!ISSET(cur->type, T_BOOL) || op != false) {
- sudo_warnx(U_("no value specified for `%s'"), var);
+ if (!quiet)
+ sudo_warnx(U_("no value specified for `%s'"), var);
debug_return_bool(false);
}
}
if (!store_int(val, cur, op)) {
- sudo_warnx(U_("value `%s' is invalid for option `%s'"), val, var);
+ if (!quiet) {
+ sudo_warnx(U_("value `%s' is invalid for option `%s'"),
+ val, var);
+ }
debug_return_bool(false);
}
break;
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
if (!ISSET(cur->type, T_BOOL) || op != false) {
- sudo_warnx(U_("no value specified for `%s'"), var);
+ if (!quiet)
+ sudo_warnx(U_("no value specified for `%s'"), var);
debug_return_bool(false);
}
}
if (!store_uint(val, cur, op)) {
- sudo_warnx(U_("value `%s' is invalid for option `%s'"), val, var);
+ if (!quiet) {
+ sudo_warnx(U_("value `%s' is invalid for option `%s'"),
+ val, var);
+ }
debug_return_bool(false);
}
break;
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
if (!ISSET(cur->type, T_BOOL) || op != false) {
- sudo_warnx(U_("no value specified for `%s'"), var);
+ if (!quiet)
+ sudo_warnx(U_("no value specified for `%s'"), var);
debug_return_bool(false);
}
}
if (!store_float(val, cur, op)) {
- sudo_warnx(U_("value `%s' is invalid for option `%s'"), val, var);
+ if (!quiet) {
+ sudo_warnx(U_("value `%s' is invalid for option `%s'"),
+ val, var);
+ }
debug_return_bool(false);
}
break;
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
if (!ISSET(cur->type, T_BOOL) || op != false) {
- sudo_warnx(U_("no value specified for `%s'"), var);
+ if (!quiet)
+ sudo_warnx(U_("no value specified for `%s'"), var);
debug_return_bool(false);
}
}
if (!store_mode(val, cur, op)) {
- sudo_warnx(U_("value `%s' is invalid for option `%s'"), val, var);
+ if (!quiet) {
+ sudo_warnx(U_("value `%s' is invalid for option `%s'"),
+ val, var);
+ }
debug_return_bool(false);
}
break;
case T_FLAG:
if (val) {
- sudo_warnx(U_("option `%s' does not take a value"), var);
+ if (!quiet)
+ sudo_warnx(U_("option `%s' does not take a value"), var);
debug_return_bool(false);
}
cur->sd_un.flag = op;
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
if (!ISSET(cur->type, T_BOOL) || op != false) {
- sudo_warnx(U_("no value specified for `%s'"), var);
+ if (!quiet)
+ sudo_warnx(U_("no value specified for `%s'"), var);
debug_return_bool(false);
}
}
if (!store_list(val, cur, op)) {
- sudo_warnx(U_("value `%s' is invalid for option `%s'"), val, var);
+ if (!quiet) {
+ sudo_warnx(U_("value `%s' is invalid for option `%s'"),
+ val, var);
+ }
debug_return_bool(false);
}
break;
case T_TUPLE:
if (!val && !ISSET(cur->type, T_BOOL)) {
- sudo_warnx(U_("no value specified for `%s'"), var);
+ if (!quiet)
+ sudo_warnx(U_("no value specified for `%s'"), var);
debug_return_bool(false);
}
if (!store_tuple(val, cur, op)) {
- sudo_warnx(U_("value `%s' is invalid for option `%s'"), val, var);
+ if (!quiet) {
+ sudo_warnx(U_("value `%s' is invalid for option `%s'"),
+ val, var);
+ }
debug_return_bool(false);
}
break;
def_set_utmp = true;
def_pam_setcred = true;
+ /* Reset the locale. */
+ if (!firsttime)
+ sudoers_initlocale(NULL, def_sudoers_locale);
+
/* Finally do the lists (currently just environment tables). */
if (!init_envtables())
goto oom;
* Pass in an OR'd list of which default types to update.
*/
bool
-update_defaults(int what)
+update_defaults(int what, bool quiet)
{
struct early_default *early;
struct defaults *def;
}
for (early = early_defaults; early->var != NULL; early++) {
if (early->val != NULL) {
- if (!set_default(early->var, early->val, early->op))
+ if (!set_default(early->var, early->val, early->op, quiet))
rc = false;
early->val = NULL; /* clean state for next run */
}
if (!default_type_matches(def, what))
continue;
- if (!set_default(def->var, def->val, def->op))
+ if (!set_default(def->var, def->val, def->op, quiet))
rc = false;
}
debug_return_bool(rc);
init_parser(sudoers_file, false);
sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale);
(void) sudoersparse();
- (void) update_defaults(SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER);
+ (void) update_defaults(SETDEF_GENERIC|SETDEF_HOST, true);
sudoers_setlocale(oldlocale, NULL);
editor = get_editor(&editor_argc, &editor_argv);
struct sudoersfile *sp, *last;
FILE *fp;
int ch, oldlocale;
+ bool ok;
debug_decl(reparse_sudoers, SUDOERS_DEBUG_UTIL)
/*
parse_error = true;
errorfile = sp->path;
}
+ ok = update_defaults(SETDEF_GENERIC|SETDEF_HOST, quiet);
+ if (!check_defaults(SETDEF_ALL & ~(SETDEF_GENERIC|SETDEF_HOST), quiet))
+ ok = false;
sudoers_setlocale(oldlocale, NULL);
fclose(sudoersin);
if (!parse_error) {
- if (!check_defaults(SETDEF_ALL, quiet) ||
- check_aliases(strict, quiet) != 0) {
+ if (!ok || check_aliases(strict, quiet) != 0) {
parse_error = true;
errorfile = NULL;
}
check_syntax(const char *sudoers_file, bool quiet, bool strict, bool oldperms)
{
bool ok = false;
+ int oldlocale;
debug_decl(check_syntax, SUDOERS_DEBUG_UTIL)
if (strcmp(sudoers_file, "-") == 0) {
sudo_warn(U_("unable to open %s"), sudoers_file);
goto done;
}
+ if (!init_defaults())
+ sudo_fatalx(U_("unable to initialize sudoers default values"));
init_parser(sudoers_file, quiet);
+ sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale);
if (sudoersparse() && !parse_error) {
if (!quiet)
sudo_warnx(U_("failed to parse %s file, unknown error"), sudoers_file);
errorfile = sudoers_file;
}
if (!parse_error) {
- if (!check_defaults(SETDEF_ALL, quiet) ||
- check_aliases(strict, quiet) != 0) {
+ if (!update_defaults(SETDEF_GENERIC|SETDEF_HOST, quiet) ||
+ !check_defaults(SETDEF_ALL & ~(SETDEF_GENERIC|SETDEF_HOST), quiet)
+ || check_aliases(strict, quiet) != 0) {
parse_error = true;
errorfile = NULL;
}
}
+ sudoers_setlocale(oldlocale, NULL);
ok = !parse_error;
if (parse_error) {