--- embedaddon/sudo/plugins/sudoers/gram.y 2012/02/21 16:23:02 1.1.1.1 +++ embedaddon/sudo/plugins/sudoers/gram.y 2012/05/29 12:26:49 1.1.1.2 @@ -1,6 +1,6 @@ %{ /* - * Copyright (c) 1996, 1998-2005, 2007-2011 + * Copyright (c) 1996, 1998-2005, 2007-2012 * Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any @@ -52,6 +52,7 @@ #include "sudoers.h" /* XXX */ #include "parse.h" #include "toke.h" +#include "gram.h" /* * We must define SIZE_MAX for yacc's skeleton.c. @@ -70,10 +71,10 @@ * Globals */ extern int sudolineno; +extern int last_token; extern char *sudoers; -static int verbose = FALSE; -int parse_error = FALSE; -int pedantic = FALSE; +bool sudoers_warnings = true; +bool parse_error = false; int errorlineno = -1; char *errorfile = NULL; @@ -92,18 +93,24 @@ static struct member *new_member(char *, int); void yyerror(const char *s) { + debug_decl(yyerror, SUDO_DEBUG_PARSER) + + /* If we last saw a newline the error is on the preceding line. */ + if (last_token == COMMENT) + sudolineno--; + /* Save the line the first error occurred on. */ if (errorlineno == -1) { - errorlineno = sudolineno ? sudolineno - 1 : 0; + errorlineno = sudolineno; errorfile = estrdup(sudoers); } if (trace_print != NULL) { LEXTRACE("<*> "); - } else if (verbose && s != NULL) { - warningx(_(">>> %s: %s near line %d <<<"), sudoers, s, - sudolineno ? sudolineno - 1 : 0); + } else if (sudoers_warnings && s != NULL) { + warningx(_(">>> %s: %s near line %d <<<"), sudoers, s, sudolineno); } - parse_error = TRUE; + parse_error = true; + debug_return; } %} @@ -236,13 +243,13 @@ defaults_list : defaults_entry ; defaults_entry : DEFVAR { - $$ = new_default($1, NULL, TRUE); + $$ = new_default($1, NULL, true); } | '!' DEFVAR { - $$ = new_default($2, NULL, FALSE); + $$ = new_default($2, NULL, false); } | DEFVAR '=' WORD { - $$ = new_default($1, $3, TRUE); + $$ = new_default($1, $3, true); } | DEFVAR '+' WORD { $$ = new_default($1, $3, '+'); @@ -260,22 +267,22 @@ privileges : privilege ; privilege : hostlist '=' cmndspeclist { - struct privilege *p = emalloc(sizeof(*p)); + struct privilege *p = ecalloc(1, sizeof(*p)); list2tq(&p->hostlist, $1); list2tq(&p->cmndlist, $3); p->prev = p; - p->next = NULL; + /* p->next = NULL; */ $$ = p; } ; ophost : host { $$ = $1; - $$->negated = FALSE; + $$->negated = false; } | '!' host { $$ = $2; - $$->negated = TRUE; + $$->negated = true; } ; @@ -330,7 +337,7 @@ cmndspeclist : cmndspec ; cmndspec : runasspec selinux cmndtag opcmnd { - struct cmndspec *cs = emalloc(sizeof(*cs)); + struct cmndspec *cs = ecalloc(1, sizeof(*cs)); if ($1 != NULL) { list2tq(&cs->runasuserlist, $1->runasusers); list2tq(&cs->runasgrouplist, $1->runasgroups); @@ -357,11 +364,11 @@ cmndspec : runasspec selinux cmndtag opcmnd { opcmnd : cmnd { $$ = $1; - $$->negated = FALSE; + $$->negated = false; } | '!' cmnd { $$ = $2; - $$->negated = TRUE; + $$->negated = true; } ; @@ -406,18 +413,18 @@ runasspec : /* empty */ { ; runaslist : userlist { - $$ = emalloc(sizeof(struct runascontainer)); + $$ = ecalloc(1, sizeof(struct runascontainer)); $$->runasusers = $1; - $$->runasgroups = NULL; + /* $$->runasgroups = NULL; */ } | userlist ':' grouplist { - $$ = emalloc(sizeof(struct runascontainer)); + $$ = ecalloc(1, sizeof(struct runascontainer)); $$->runasusers = $1; $$->runasgroups = $3; } | ':' grouplist { - $$ = emalloc(sizeof(struct runascontainer)); - $$->runasusers = NULL; + $$ = ecalloc(1, sizeof(struct runascontainer)); + /* $$->runasusers = NULL; */ $$->runasgroups = $2; } ; @@ -427,34 +434,34 @@ cmndtag : /* empty */ { $$.log_input = $$.log_output = UNSPEC; } | cmndtag NOPASSWD { - $$.nopasswd = TRUE; + $$.nopasswd = true; } | cmndtag PASSWD { - $$.nopasswd = FALSE; + $$.nopasswd = false; } | cmndtag NOEXEC { - $$.noexec = TRUE; + $$.noexec = true; } | cmndtag EXEC { - $$.noexec = FALSE; + $$.noexec = false; } | cmndtag SETENV { - $$.setenv = TRUE; + $$.setenv = true; } | cmndtag NOSETENV { - $$.setenv = FALSE; + $$.setenv = false; } | cmndtag LOG_INPUT { - $$.log_input = TRUE; + $$.log_input = true; } | cmndtag NOLOG_INPUT { - $$.log_input = FALSE; + $$.log_input = false; } | cmndtag LOG_OUTPUT { - $$.log_output = TRUE; + $$.log_output = true; } | cmndtag NOLOG_OUTPUT { - $$.log_output = FALSE; + $$.log_output = false; } ; @@ -465,7 +472,7 @@ cmnd : ALL { $$ = new_member($1, ALIAS); } | COMMAND { - struct sudo_command *c = emalloc(sizeof(*c)); + struct sudo_command *c = ecalloc(1, sizeof(*c)); c->cmnd = $1.cmnd; c->args = $1.args; $$ = new_member((char *)c, COMMAND); @@ -547,11 +554,11 @@ userlist : opuser opuser : user { $$ = $1; - $$->negated = FALSE; + $$->negated = false; } | '!' user { $$ = $2; - $$->negated = TRUE; + $$->negated = true; } ; @@ -581,11 +588,11 @@ grouplist : opgroup opgroup : group { $$ = $1; - $$->negated = FALSE; + $$->negated = false; } | '!' group { $$ = $2; - $$->negated = TRUE; + $$->negated = true; } ; @@ -605,31 +612,33 @@ static struct defaults * new_default(char *var, char *val, int op) { struct defaults *d; + debug_decl(new_default, SUDO_DEBUG_PARSER) - d = emalloc(sizeof(struct defaults)); + d = ecalloc(1, sizeof(struct defaults)); d->var = var; d->val = val; tq_init(&d->binding); - d->type = 0; + /* d->type = 0; */ d->op = op; d->prev = d; - d->next = NULL; + /* d->next = NULL; */ - return d; + debug_return_ptr(d); } static struct member * new_member(char *name, int type) { struct member *m; + debug_decl(new_member, SUDO_DEBUG_PARSER) - m = emalloc(sizeof(struct member)); + m = ecalloc(1, sizeof(struct member)); m->name = name; m->type = type; m->prev = m; - m->next = NULL; + /* m->next = NULL; */ - return m; + debug_return_ptr(m); } /* @@ -642,6 +651,7 @@ add_defaults(int type, struct member *bmem, struct def { struct defaults *d; struct member_list binding; + debug_decl(add_defaults, SUDO_DEBUG_PARSER) /* * We can only call list2tq once on bmem as it will zero @@ -657,6 +667,8 @@ add_defaults(int type, struct member *bmem, struct def d->binding = binding; } tq_append(&defaults, defs); + + debug_return; } /* @@ -667,13 +679,16 @@ static void add_userspec(struct member *members, struct privilege *privs) { struct userspec *u; + debug_decl(add_userspec, SUDO_DEBUG_PARSER) - u = emalloc(sizeof(*u)); + u = ecalloc(1, sizeof(*u)); list2tq(&u->users, members); list2tq(&u->privileges, privs); u->prev = u; - u->next = NULL; + /* u->next = NULL; */ tq_append(&userspecs, u); + + debug_return; } /* @@ -689,6 +704,7 @@ init_parser(const char *path, int quiet) struct privilege *priv; struct cmndspec *cs; struct sudo_command *c; + debug_decl(init_parser, SUDO_DEBUG_PARSER) while ((us = tq_pop(&userspecs)) != NULL) { while ((m = tq_pop(&us->users)) != NULL) { @@ -773,8 +789,10 @@ init_parser(const char *path, int quiet) efree(sudoers); sudoers = path ? estrdup(path) : NULL; - parse_error = FALSE; + parse_error = false; errorlineno = -1; - errorfile = NULL; - verbose = !quiet; + errorfile = sudoers; + sudoers_warnings = !quiet; + + debug_return; }