Diff for /embedaddon/sudo/plugins/sudoers/toke.c between versions 1.1.1.4 and 1.1.1.5

version 1.1.1.4, 2013/07/22 10:46:12 version 1.1.1.5, 2014/06/15 16:12:54
Line 16 Line 16
 #define yyrestart sudoersrestart  #define yyrestart sudoersrestart
 #define yytext sudoerstext  #define yytext sudoerstext
   
/*      $OpenBSD: flex.skl,v 1.11 2010/08/04 18:24:50 millert Exp $  *//*      $OpenBSD: flex.skl,v 1.12 2013/11/04 17:03:32 millert Exp $  */
   
 /* A lexical scanner generated by flex */  /* A lexical scanner generated by flex */
   
Line 148  extern FILE *yyin, *yyout; Line 148  extern FILE *yyin, *yyout;
                 /* Undo effects of setting up yytext. */ \                  /* Undo effects of setting up yytext. */ \
                 *yy_cp = yy_hold_char; \                  *yy_cp = yy_hold_char; \
                 YY_RESTORE_YY_MORE_OFFSET \                  YY_RESTORE_YY_MORE_OFFSET \
                yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \                yy_cp = yy_bp + n - YY_MORE_ADJ; \
                 YY_DO_BEFORE_ACTION; /* set up yytext again */ \                  YY_DO_BEFORE_ACTION; /* set up yytext again */ \
                 } \                  } \
         while ( 0 )          while ( 0 )
Line 312  static yyconst short int yy_accept[814] = Line 312  static yyconst short int yy_accept[814] =
     {   0,      {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,   68,   55,   63,   62,   61,   54,          0,    0,    0,    0,   68,   55,   63,   62,   61,   54,
       66,   34,   56,   57,   34,   58,   55,   55,   55,   55,       65,   34,   56,   57,   34,   58,   55,   55,   55,   55,
        60,   59,   66,   46,   46,   46,   46,   46,   46,   46,         60,   59,   66,   46,   46,   46,   46,   46,   46,   46,
       46,   46,   46,   66,   55,   55,   63,   66,   46,   46,       46,   46,   46,   66,   55,   55,   63,   65,   46,   46,
        46,   46,   46,    2,   66,    1,   55,   46,   46,   55,         46,   46,   46,    2,   66,    1,   55,   46,   46,   55,
       17,   16,   17,   16,   16,   66,   66,   66,    3,    9,       17,   16,   17,   16,   16,   66,   65,   66,    3,    9,
         8,    9,    4,    9,    5,   66,   13,   13,   13,   11,          8,    9,    4,    9,    5,   66,   13,   13,   13,   11,
        12,   66,   19,   19,   18,   18,   18,   19,   18,   18,         12,   66,   19,   19,   18,   18,   18,   19,   18,   18,
        18,   19,   19,   19,   19,   19,   18,   19,   19,   55,         18,   19,   19,   19,   19,   19,   18,   19,   19,   55,
   
        0,   63,   61,    0,   65,    0,   55,   36,    0,   34,        0,   63,   61,   65,   65,    0,   55,   36,    0,   34,
         0,   35,    0,   53,   53,    0,   55,   55,    0,   55,          0,   35,    0,   53,   53,    0,   55,   55,    0,   55,
        55,   55,   55,    0,   39,   46,   46,   46,   46,   46,         55,   55,   55,    0,   39,   46,   46,   46,   46,   46,
        46,   46,   46,   46,   46,   46,   46,   55,   64,   55,         46,   46,   46,   46,   46,   46,   46,   55,   64,   55,
       55,   63,    0,    0,    0,    0,    0,    0,   55,   55,       55,   63,    0,    0,    0,    0,    0,   65,   55,   55,
        55,   55,   55,    2,    1,    0,    1,   47,   47,    0,         55,   55,   55,    2,    1,    0,    1,   47,   47,    0,
        55,   17,   17,   15,   14,   15,    0,    0,    3,    9,         55,   17,   17,   15,   14,   15,    0,    0,    3,    9,
         0,    6,    7,    9,    9,   13,    0,   13,   13,    0,          0,    6,    7,    9,    9,   13,    0,   13,   13,    0,
        10,   36,    0,    0,   35,   19,   19,    0,   19,    0,         10,   36,    0,    0,   35,   19,   19,    0,   19,    0,
         0,   18,   18,   18,   18,   18,   18,   19,   19,   46,          0,   18,   18,   18,   18,   18,   18,   19,   19,   46,
   
       19,   19,   19,   19,   19,   19,   19,    0,    0,    0,       19,   19,   19,   19,   19,   19,   19,   65,   65,    0,
        36,   55,   55,   55,   55,   55,    0,    0,   39,   39,         36,   55,   55,   55,   55,   55,    0,    0,   39,   39,
        46,   41,   46,   46,   46,   46,   46,   46,   46,   46,         46,   41,   46,   46,   46,   46,   46,   46,   46,   46,
        46,   46,   46,   46,   55,   55,    0,    0,    0,    0,         46,   46,   46,   46,   55,   55,    0,    0,    0,    0,
        0,    0,   55,   55,   55,   55,   55,    0,   55,   10,        0,   65,   55,   55,   55,   55,   55,    0,   55,   10,
         0,    0,    0,   18,   18,   18,   19,   19,   19,   19,          0,    0,    0,   18,   18,   18,   19,   19,   19,   19,
       19,   19,   19,   19,   19,   19,   19,    0,   55,   55,       19,   19,   19,   19,   19,   19,   19,   65,   55,   55,
        55,   55,   55,   55,    0,   40,   40,   40,    0,    0,         55,   55,   55,   55,    0,   40,   40,   40,    0,    0,
        39,   39,   39,   39,   39,   39,   39,   46,   46,   46,         39,   39,   39,   39,   39,   39,   39,   46,   46,   46,
        46,   46,   46,   46,   46,   46,   46,   42,   46,   43,         46,   46,   46,   46,   46,   46,   46,   42,   46,   43,
   
       55,   55,   55,   55,    0,    0,    0,    0,    0,    0,       55,   55,   55,   55,    0,    0,    0,    0,    0,   65,
        55,   55,   55,   55,    0,    0,    0,    0,    0,   18,         55,   55,   55,   55,    0,    0,    0,    0,    0,   18,
        18,   19,   46,   19,   19,   19,   19,   19,   19,   19,         18,   19,   46,   19,   19,   19,   19,   19,   19,   19,
        19,   19,   19,   55,   55,   55,    0,    0,   40,   40,         19,   19,   19,   55,   55,   55,    0,    0,   40,   40,
        40,    0,   39,   39,    0,   39,   39,   39,   39,   39,         40,    0,   39,   39,    0,   39,   39,   39,   39,   39,
        39,   39,   39,   39,   39,   39,    0,   27,   46,   46,         39,   39,   39,   39,   39,   39,    0,   27,   46,   46,
        46,   46,   46,   46,   46,   46,   44,   46,   55,   55,         46,   46,   46,   46,   46,   46,   44,   46,   55,   55,
       55,   55,   55,    0,    0,    0,    0,   55,   55,   55,       55,   55,   55,    0,    0,    0,   65,   55,   55,   55,
         0,    0,    0,   18,   18,   46,   46,   19,   19,   19,          0,    0,    0,   18,   18,   46,   46,   19,   19,   19,
        19,   19,   19,   19,   19,   19,   19,   19,   55,   55,         19,   19,   19,   19,   19,   19,   19,   19,   55,   55,
   
Line 358  static yyconst short int yy_accept[814] = Line 358  static yyconst short int yy_accept[814] =
         0,    0,   39,   39,   39,   39,   39,   39,   39,   39,          0,    0,   39,   39,   39,   39,   39,   39,   39,   39,
        39,   39,   39,   39,   39,   46,   46,   46,   46,   46,         39,   39,   39,   39,   39,   46,   46,   46,   46,   46,
        46,   46,   46,   46,   48,   49,   50,   51,   55,    0,         46,   46,   46,   46,   48,   49,   50,   51,   55,    0,
        0,    0,   55,   55,   55,    0,    0,    0,    0,    0,        0,   65,   55,   55,   55,    0,    0,    0,    0,    0,
        46,   46,   19,   46,   19,   19,   19,   19,   19,   19,         46,   46,   19,   46,   19,   19,   19,   19,   19,   19,
        19,   19,   19,   37,   37,   37,    0,    0,   39,   39,         19,   19,   19,   37,   37,   37,    0,    0,   39,   39,
        39,   39,   39,   39,   39,    0,    0,    0,    0,    0,         39,   39,   39,   39,   39,    0,    0,    0,    0,    0,
Line 366  static yyconst short int yy_accept[814] = Line 366  static yyconst short int yy_accept[814] =
        39,   39,   39,   39,   46,   46,   46,    0,   26,   46,         39,   39,   39,   39,   46,   46,   46,    0,   26,   46,
   
        46,   46,   46,    0,   25,    0,   28,   55,    0,    0,         46,   46,   46,    0,   25,    0,   28,   55,    0,    0,
        0,   55,   55,   55,   37,   37,   37,   46,   46,   46,       65,   55,   55,   55,   37,   37,   37,   46,   46,   46,
        46,   19,   19,   19,   55,   37,   37,   37,   37,    0,         46,   19,   19,   19,   55,   37,   37,   37,   37,    0,
        39,    0,   39,   39,   39,   39,   39,   39,   39,   39,         39,    0,   39,   39,   39,   39,   39,   39,   39,   39,
        39,   39,   39,    0,    0,    0,   39,   39,   39,   39,         39,   39,   39,    0,    0,    0,   39,   39,   39,   39,
        39,   39,   39,   39,   39,   39,   39,   39,   39,   46,         39,   39,   39,   39,   39,   39,   39,   39,   39,   46,
       46,   46,   46,   46,   46,   46,   52,    0,    0,    0,       46,   46,   46,   46,   46,   46,   52,    0,    0,   65,
        55,   22,   47,    0,   37,   37,   37,   37,   46,   46,         55,   22,   47,    0,   37,   37,   37,   37,   46,   46,
        46,   46,   19,   19,   19,   38,   38,   38,   38,   39,         46,   46,   19,   19,   19,   38,   38,   38,   38,   39,
         0,    0,    0,   39,   39,   39,   39,   39,   39,   39,          0,    0,    0,   39,   39,   39,   39,   39,   39,   39,
Line 379  static yyconst short int yy_accept[814] = Line 379  static yyconst short int yy_accept[814] =
        39,   39,   39,   39,   39,   39,    0,    0,    0,    0,         39,   39,   39,   39,   39,   39,    0,    0,    0,    0,
         0,   39,   39,   39,   39,   39,   39,   39,   39,   46,          0,   39,   39,   39,   39,   39,   39,   39,   39,   46,
        46,   46,   46,   46,    0,   24,    0,   29,    0,   22,         46,   46,   46,   46,    0,   24,    0,   29,    0,   22,
        0,    0,   55,    0,   55,   38,   38,   38,   38,   46,       65,   65,   55,    0,   55,   38,   38,   38,   38,   46,
        46,   46,   46,   55,   55,   38,   38,   38,   38,    0,         46,   46,   46,   55,   55,   38,   38,   38,   38,    0,
         0,    0,    0,    0,   39,   39,   39,   39,   39,   39,          0,    0,    0,    0,   39,   39,   39,   39,   39,   39,
        39,   39,   39,   39,   39,   39,   39,   39,   39,   39,         39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
        39,   39,   39,   39,   45,    0,   32,   46,   46,   46,         39,   39,   39,   39,   45,    0,   32,   46,   46,   46,
        0,    0,    0,   20,    0,   23,   22,    0,    0,    0,        0,   65,   65,   20,   65,   23,   22,    0,    0,    0,
         0,    0,   22,    0,    0,    0,   38,   38,   38,   38,          0,    0,   22,    0,    0,    0,   38,   38,   38,   38,
   
        46,   46,   46,   55,   55,   55,    0,    0,    0,   39,         46,   46,   46,   55,   55,   55,    0,    0,    0,   39,
        39,   39,   39,   39,   39,   39,   39,   39,   39,   39,         39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
        39,   39,   39,   39,   39,   39,   39,    0,   30,   46,         39,   39,   39,   39,   39,   39,   39,    0,   30,   46,
       46,   23,    0,    0,   22,    0,    0,    0,   46,   46,       46,   23,   65,    0,   22,    0,    0,    0,   46,   46,
        55,   55,   55,   55,   55,    0,    0,    0,    0,    0,         55,   55,   55,   55,   55,    0,    0,    0,    0,    0,
        39,   39,   39,   39,   39,   39,   39,   39,    0,   33,         39,   39,   39,   39,   39,   39,   39,   39,    0,   33,
       46,    0,    0,    0,    0,    0,    0,   46,   55,   55,       46,   65,    0,    0,    0,    0,    0,   46,   55,   55,
       55,   39,   39,   39,   39,   39,   39,    0,   31,    0,       55,   39,   39,   39,   39,   39,   39,    0,   31,   65,
        0,   21,    0,    0,    0,   55,   55,   55,   55,   55,       65,   21,    0,    0,    0,   55,   55,   55,   55,   55,
        39,   39,   39,   39,   39,    0,    0,    0,    0,    0,         39,   39,   39,   39,   39,    0,    0,    0,    0,    0,
   
        37,   37,   37,   37,   37,   37,   37,   37,   37,   37,         37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
Line 2007  char *yytext; Line 2007  char *yytext;
 #include "sha2.h"  #include "sha2.h"
 #include "secure_path.h"  #include "secure_path.h"
   
extern YYSTYPE sudoerslval;int sudolineno;                 /* current sudoers line number. */
extern bool parse_error;int last_token;                 /* last token that was parsed. */
extern bool sudoers_warnings;char *sudoers;                  /* sudoers file being parsed. */
int sudolineno; 
int last_token; 
char *sudoers; 
   
 /* Default sudoers path, mode and owner (may be set via sudo.conf) */  /* Default sudoers path, mode and owner (may be set via sudo.conf) */
 const char *sudoers_file = _PATH_SUDOERS;  const char *sudoers_file = _PATH_SUDOERS;
Line 2053  int (*trace_print)(const char *msg) = sudoers_trace_pr Line 2050  int (*trace_print)(const char *msg) = sudoers_trace_pr
   
 #define WANTDIGEST 6  #define WANTDIGEST 6
   
#line 2056 "lex.sudoers.c"#line 2053 "lex.sudoers.c"
   
 /* Macros after this point can all be overridden by user definitions in  /* Macros after this point can all be overridden by user definitions in
  * section 1.   * section 1.
Line 2207  YY_DECL Line 2204  YY_DECL
         register char *yy_cp, *yy_bp;          register char *yy_cp, *yy_bp;
         register int yy_act;          register int yy_act;
   
#line 140 "toke.l"#line 137 "toke.l"
   
#line 2212 "lex.sudoers.c"#line 2209 "lex.sudoers.c"
   
         if ( yy_init )          if ( yy_init )
                 {                  {
Line 2295  do_action: /* This label is used only to access EOF ac Line 2292  do_action: /* This label is used only to access EOF ac
   
 case 1:  case 1:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 141 "toke.l"#line 138 "toke.l"
 {  {
                             LEXTRACE(", ");                              LEXTRACE(", ");
                             LEXRETURN(',');                              LEXRETURN(',');
Line 2303  YY_RULE_SETUP Line 2300  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 2:  case 2:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 146 "toke.l"#line 143 "toke.l"
 BEGIN STARTDEFS;  BEGIN STARTDEFS;
         YY_BREAK          YY_BREAK
 case 3:  case 3:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 148 "toke.l"#line 145 "toke.l"
 {  {
                             BEGIN INDEFS;                              BEGIN INDEFS;
                             LEXTRACE("DEFVAR ");                              LEXTRACE("DEFVAR ");
Line 2320  YY_RULE_SETUP Line 2317  YY_RULE_SETUP
   
 case 4:  case 4:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 157 "toke.l"#line 154 "toke.l"
 {  {
                             BEGIN STARTDEFS;                              BEGIN STARTDEFS;
                             LEXTRACE(", ");                              LEXTRACE(", ");
Line 2329  YY_RULE_SETUP Line 2326  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 5:  case 5:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 163 "toke.l"#line 160 "toke.l"
 {  {
                             LEXTRACE("= ");                              LEXTRACE("= ");
                             LEXRETURN('=');                              LEXRETURN('=');
Line 2337  YY_RULE_SETUP Line 2334  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 6:  case 6:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 168 "toke.l"#line 165 "toke.l"
 {  {
                             LEXTRACE("+= ");                              LEXTRACE("+= ");
                             LEXRETURN('+');                              LEXRETURN('+');
Line 2345  YY_RULE_SETUP Line 2342  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 7:  case 7:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 173 "toke.l"#line 170 "toke.l"
 {  {
                             LEXTRACE("-= ");                              LEXTRACE("-= ");
                             LEXRETURN('-');                              LEXRETURN('-');
Line 2353  YY_RULE_SETUP Line 2350  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 8:  case 8:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 178 "toke.l"#line 175 "toke.l"
 {  {
                             LEXTRACE("BEGINSTR ");                              LEXTRACE("BEGINSTR ");
                             sudoerslval.string = NULL;                              sudoerslval.string = NULL;
Line 2363  YY_RULE_SETUP Line 2360  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 9:  case 9:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 185 "toke.l"#line 182 "toke.l"
 {  {
                             LEXTRACE("WORD(2) ");                              LEXTRACE("WORD(2) ");
                             if (!fill(sudoerstext, sudoersleng))                              if (!fill(sudoerstext, sudoersleng))
Line 2375  YY_RULE_SETUP Line 2372  YY_RULE_SETUP
   
 case 10:  case 10:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 194 "toke.l"#line 191 "toke.l"
 {  {
                             /* Line continuation char followed by newline. */                              /* Line continuation char followed by newline. */
                             sudolineno++;                              sudolineno++;
Line 2384  YY_RULE_SETUP Line 2381  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 11:  case 11:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 200 "toke.l"#line 197 "toke.l"
 {  {
                             LEXTRACE("ENDSTR ");                              LEXTRACE("ENDSTR ");
                             BEGIN prev_state;                              BEGIN prev_state;
Line 2419  YY_RULE_SETUP Line 2416  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 12:  case 12:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 232 "toke.l"#line 229 "toke.l"
 {  {
                             LEXTRACE("BACKSLASH ");                              LEXTRACE("BACKSLASH ");
                             if (!append(sudoerstext, sudoersleng))                              if (!append(sudoerstext, sudoersleng))
Line 2428  YY_RULE_SETUP Line 2425  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 13:  case 13:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 238 "toke.l"#line 235 "toke.l"
 {  {
                             LEXTRACE("STRBODY ");                              LEXTRACE("STRBODY ");
                             if (!append(sudoerstext, sudoersleng))                              if (!append(sudoerstext, sudoersleng))
Line 2439  YY_RULE_SETUP Line 2436  YY_RULE_SETUP
   
 case 14:  case 14:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 246 "toke.l"#line 243 "toke.l"
 {  {
                             /* quoted fnmatch glob char, pass verbatim */                              /* quoted fnmatch glob char, pass verbatim */
                             LEXTRACE("QUOTEDCHAR ");                              LEXTRACE("QUOTEDCHAR ");
Line 2450  YY_RULE_SETUP Line 2447  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 15:  case 15:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 254 "toke.l"#line 251 "toke.l"
 {  {
                             /* quoted sudoers special char, strip backslash */                              /* quoted sudoers special char, strip backslash */
                             LEXTRACE("QUOTEDCHAR ");                              LEXTRACE("QUOTEDCHAR ");
Line 2461  YY_RULE_SETUP Line 2458  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 16:  case 16:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 262 "toke.l"#line 259 "toke.l"
 {  {
                             BEGIN INITIAL;                              BEGIN INITIAL;
                             yyless(0);                              yyless(0);
Line 2470  YY_RULE_SETUP Line 2467  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 17:  case 17:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 268 "toke.l"#line 265 "toke.l"
 {  {
                             LEXTRACE("ARG ");                              LEXTRACE("ARG ");
                             if (!fill_args(sudoerstext, sudoersleng, sawspace))                              if (!fill_args(sudoerstext, sudoersleng, sawspace))
Line 2481  YY_RULE_SETUP Line 2478  YY_RULE_SETUP
   
 case 18:  case 18:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 276 "toke.l"#line 273 "toke.l"
 {  {
                             /* Only return DIGEST if the length is correct. */                              /* Only return DIGEST if the length is correct. */
                             if (sudoersleng == digest_len * 2) {                              if (sudoersleng == digest_len * 2) {
Line 2497  YY_RULE_SETUP Line 2494  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 19:  case 19:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 289 "toke.l"#line 286 "toke.l"
 {  {
                             /* Only return DIGEST if the length is correct. */                              /* Only return DIGEST if the length is correct. */
                            size_t len;                            int len;
                             if (sudoerstext[sudoersleng - 1] == '=') {                              if (sudoerstext[sudoersleng - 1] == '=') {
                                 /* use padding */                                  /* use padding */
                                 len = 4 * ((digest_len + 2) / 3);                                  len = 4 * ((digest_len + 2) / 3);
Line 2521  YY_RULE_SETUP Line 2518  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 20:  case 20:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 310 "toke.l"#line 307 "toke.l"
 {  {
                             char *path;                              char *path;
   
Line 2542  YY_RULE_SETUP Line 2539  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 21:  case 21:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 328 "toke.l"#line 325 "toke.l"
 {  {
                             char *path;                              char *path;
   
Line 2566  YY_RULE_SETUP Line 2563  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 22:  case 22:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 349 "toke.l"#line 346 "toke.l"
 {  {
                             char deftype;                              char deftype;
                             int n;                              int n;
Line 2609  YY_RULE_SETUP Line 2606  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 23:  case 23:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 389 "toke.l"#line 386 "toke.l"
 {  {
                             int n;                              int n;
   
Line 2638  YY_RULE_SETUP Line 2635  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 24:  case 24:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 415 "toke.l"#line 412 "toke.l"
 {  {
                                 /* cmnd does not require passwd for this user */                                  /* cmnd does not require passwd for this user */
                                 LEXTRACE("NOPASSWD ");                                  LEXTRACE("NOPASSWD ");
Line 2647  YY_RULE_SETUP Line 2644  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 25:  case 25:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 421 "toke.l"#line 418 "toke.l"
 {  {
                                 /* cmnd requires passwd for this user */                                  /* cmnd requires passwd for this user */
                                 LEXTRACE("PASSWD ");                                  LEXTRACE("PASSWD ");
Line 2656  YY_RULE_SETUP Line 2653  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 26:  case 26:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 427 "toke.l"#line 424 "toke.l"
 {  {
                                 LEXTRACE("NOEXEC ");                                  LEXTRACE("NOEXEC ");
                                 LEXRETURN(NOEXEC);                                  LEXRETURN(NOEXEC);
Line 2664  YY_RULE_SETUP Line 2661  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 27:  case 27:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 432 "toke.l"#line 429 "toke.l"
 {  {
                                 LEXTRACE("EXEC ");                                  LEXTRACE("EXEC ");
                                 LEXRETURN(EXEC);                                  LEXRETURN(EXEC);
Line 2672  YY_RULE_SETUP Line 2669  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 28:  case 28:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 437 "toke.l"#line 434 "toke.l"
 {  {
                                 LEXTRACE("SETENV ");                                  LEXTRACE("SETENV ");
                                 LEXRETURN(SETENV);                                  LEXRETURN(SETENV);
Line 2680  YY_RULE_SETUP Line 2677  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 29:  case 29:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 442 "toke.l"#line 439 "toke.l"
 {  {
                                 LEXTRACE("NOSETENV ");                                  LEXTRACE("NOSETENV ");
                                 LEXRETURN(NOSETENV);                                  LEXRETURN(NOSETENV);
Line 2688  YY_RULE_SETUP Line 2685  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 30:  case 30:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 447 "toke.l"#line 444 "toke.l"
 {  {
                                 LEXTRACE("LOG_OUTPUT ");                                  LEXTRACE("LOG_OUTPUT ");
                                 LEXRETURN(LOG_OUTPUT);                                  LEXRETURN(LOG_OUTPUT);
Line 2696  YY_RULE_SETUP Line 2693  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 31:  case 31:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 452 "toke.l"#line 449 "toke.l"
 {  {
                                 LEXTRACE("NOLOG_OUTPUT ");                                  LEXTRACE("NOLOG_OUTPUT ");
                                 LEXRETURN(NOLOG_OUTPUT);                                  LEXRETURN(NOLOG_OUTPUT);
Line 2704  YY_RULE_SETUP Line 2701  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 32:  case 32:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 457 "toke.l"#line 454 "toke.l"
 {  {
                                 LEXTRACE("LOG_INPUT ");                                  LEXTRACE("LOG_INPUT ");
                                 LEXRETURN(LOG_INPUT);                                  LEXRETURN(LOG_INPUT);
Line 2712  YY_RULE_SETUP Line 2709  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 33:  case 33:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 462 "toke.l"#line 459 "toke.l"
 {  {
                                 LEXTRACE("NOLOG_INPUT ");                                  LEXTRACE("NOLOG_INPUT ");
                                 LEXRETURN(NOLOG_INPUT);                                  LEXRETURN(NOLOG_INPUT);
Line 2720  YY_RULE_SETUP Line 2717  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 34:  case 34:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 467 "toke.l"#line 464 "toke.l"
 {  {
                             /* empty group or netgroup */                              /* empty group or netgroup */
                             LEXTRACE("ERROR ");                              LEXTRACE("ERROR ");
Line 2729  YY_RULE_SETUP Line 2726  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 35:  case 35:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 473 "toke.l"#line 470 "toke.l"
 {  {
                             /* netgroup */                              /* netgroup */
                             if (!fill(sudoerstext, sudoersleng))                              if (!fill(sudoerstext, sudoersleng))
Line 2740  YY_RULE_SETUP Line 2737  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 36:  case 36:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 481 "toke.l"#line 478 "toke.l"
 {  {
                             /* group */                              /* group */
                             if (!fill(sudoerstext, sudoersleng))                              if (!fill(sudoerstext, sudoersleng))
Line 2751  YY_RULE_SETUP Line 2748  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 37:  case 37:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 489 "toke.l"#line 486 "toke.l"
 {  {
                             if (!fill(sudoerstext, sudoersleng))                              if (!fill(sudoerstext, sudoersleng))
                                 yyterminate();                                  yyterminate();
Line 2761  YY_RULE_SETUP Line 2758  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 38:  case 38:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 496 "toke.l"#line 493 "toke.l"
 {  {
                             if (!fill(sudoerstext, sudoersleng))                              if (!fill(sudoerstext, sudoersleng))
                                 yyterminate();                                  yyterminate();
Line 2771  YY_RULE_SETUP Line 2768  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 39:  case 39:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 503 "toke.l"#line 500 "toke.l"
 {  {
                             if (!ipv6_valid(sudoerstext)) {                              if (!ipv6_valid(sudoerstext)) {
                                 LEXTRACE("ERROR ");                                  LEXTRACE("ERROR ");
Line 2785  YY_RULE_SETUP Line 2782  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 40:  case 40:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 514 "toke.l"#line 511 "toke.l"
 {  {
                             if (!ipv6_valid(sudoerstext)) {                              if (!ipv6_valid(sudoerstext)) {
                                 LEXTRACE("ERROR ");                                  LEXTRACE("ERROR ");
Line 2799  YY_RULE_SETUP Line 2796  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 41:  case 41:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 525 "toke.l"#line 522 "toke.l"
 {  {
                             LEXTRACE("ALL ");                              LEXTRACE("ALL ");
                             LEXRETURN(ALL);                              LEXRETURN(ALL);
Line 2808  YY_RULE_SETUP Line 2805  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 42:  case 42:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 531 "toke.l"#line 528 "toke.l"
 {  {
 #ifdef HAVE_SELINUX  #ifdef HAVE_SELINUX
                             LEXTRACE("ROLE ");                              LEXTRACE("ROLE ");
Line 2820  YY_RULE_SETUP Line 2817  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 43:  case 43:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 540 "toke.l"#line 537 "toke.l"
 {  {
 #ifdef HAVE_SELINUX  #ifdef HAVE_SELINUX
                             LEXTRACE("TYPE ");                              LEXTRACE("TYPE ");
Line 2832  YY_RULE_SETUP Line 2829  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 44:  case 44:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 548 "toke.l"#line 545 "toke.l"
 {  {
 #ifdef HAVE_PRIV_SET  #ifdef HAVE_PRIV_SET
                             LEXTRACE("PRIVS ");                              LEXTRACE("PRIVS ");
Line 2844  YY_RULE_SETUP Line 2841  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 45:  case 45:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 557 "toke.l"#line 554 "toke.l"
 {  {
 #ifdef HAVE_PRIV_SET  #ifdef HAVE_PRIV_SET
                             LEXTRACE("LIMITPRIVS ");                              LEXTRACE("LIMITPRIVS ");
Line 2856  YY_RULE_SETUP Line 2853  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 46:  case 46:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 566 "toke.l"#line 563 "toke.l"
 {  {
                         got_alias:                          got_alias:
                             if (!fill(sudoerstext, sudoersleng))                              if (!fill(sudoerstext, sudoersleng))
Line 2867  YY_RULE_SETUP Line 2864  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 47:  case 47:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 574 "toke.l"#line 571 "toke.l"
 {  {
                             /* XXX - no way to specify digest for command */                              /* XXX - no way to specify digest for command */
                             /* no command args allowed for Defaults!/path */                              /* no command args allowed for Defaults!/path */
Line 2879  YY_RULE_SETUP Line 2876  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 48:  case 48:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 583 "toke.l"#line 580 "toke.l"
 {  {
                             digest_len = SHA224_DIGEST_LENGTH;                              digest_len = SHA224_DIGEST_LENGTH;
                             BEGIN WANTDIGEST;                              BEGIN WANTDIGEST;
Line 2889  YY_RULE_SETUP Line 2886  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 49:  case 49:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 590 "toke.l"#line 587 "toke.l"
 {  {
                             digest_len = SHA256_DIGEST_LENGTH;                              digest_len = SHA256_DIGEST_LENGTH;
                             BEGIN WANTDIGEST;                              BEGIN WANTDIGEST;
Line 2899  YY_RULE_SETUP Line 2896  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 50:  case 50:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 597 "toke.l"#line 594 "toke.l"
 {  {
                             digest_len = SHA384_DIGEST_LENGTH;                              digest_len = SHA384_DIGEST_LENGTH;
                             BEGIN WANTDIGEST;                              BEGIN WANTDIGEST;
Line 2909  YY_RULE_SETUP Line 2906  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 51:  case 51:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 604 "toke.l"#line 601 "toke.l"
 {  {
                             digest_len = SHA512_DIGEST_LENGTH;                              digest_len = SHA512_DIGEST_LENGTH;
                             BEGIN WANTDIGEST;                              BEGIN WANTDIGEST;
Line 2919  YY_RULE_SETUP Line 2916  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 52:  case 52:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 611 "toke.l"#line 608 "toke.l"
 {  {
                             BEGIN GOTCMND;                              BEGIN GOTCMND;
                             LEXTRACE("COMMAND ");                              LEXTRACE("COMMAND ");
Line 2929  YY_RULE_SETUP Line 2926  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 53:  case 53:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 618 "toke.l"#line 615 "toke.l"
 {  {
                             /* directories can't have args... */                              /* directories can't have args... */
                             if (sudoerstext[sudoersleng - 1] == '/') {                              if (sudoerstext[sudoersleng - 1] == '/') {
Line 2947  YY_RULE_SETUP Line 2944  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 54:  case 54:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 633 "toke.l"#line 630 "toke.l"
 {  {
                             LEXTRACE("BEGINSTR ");                              LEXTRACE("BEGINSTR ");
                             sudoerslval.string = NULL;                              sudoerslval.string = NULL;
Line 2957  YY_RULE_SETUP Line 2954  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 55:  case 55:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 640 "toke.l"#line 637 "toke.l"
 {  {
                             /* a word */                              /* a word */
                             if (!fill(sudoerstext, sudoersleng))                              if (!fill(sudoerstext, sudoersleng))
Line 2968  YY_RULE_SETUP Line 2965  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 56:  case 56:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 648 "toke.l"#line 645 "toke.l"
 {  {
                             LEXTRACE("( ");                              LEXTRACE("( ");
                             LEXRETURN('(');                              LEXRETURN('(');
Line 2976  YY_RULE_SETUP Line 2973  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 57:  case 57:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 653 "toke.l"#line 650 "toke.l"
 {  {
                             LEXTRACE(") ");                              LEXTRACE(") ");
                             LEXRETURN(')');                              LEXRETURN(')');
Line 2984  YY_RULE_SETUP Line 2981  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 58:  case 58:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 658 "toke.l"#line 655 "toke.l"
 {  {
                             LEXTRACE(", ");                              LEXTRACE(", ");
                             LEXRETURN(',');                              LEXRETURN(',');
Line 2992  YY_RULE_SETUP Line 2989  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 59:  case 59:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 663 "toke.l"#line 660 "toke.l"
 {  {
                             LEXTRACE("= ");                              LEXTRACE("= ");
                             LEXRETURN('=');                              LEXRETURN('=');
Line 3000  YY_RULE_SETUP Line 2997  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 60:  case 60:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 668 "toke.l"#line 665 "toke.l"
 {  {
                             LEXTRACE(": ");                              LEXTRACE(": ");
                             LEXRETURN(':');                              LEXRETURN(':');
Line 3008  YY_RULE_SETUP Line 3005  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 61:  case 61:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 673 "toke.l"#line 670 "toke.l"
 {  {
                             if (sudoersleng & 1) {                              if (sudoersleng & 1) {
                                 LEXTRACE("!");                                  LEXTRACE("!");
Line 3018  YY_RULE_SETUP Line 3015  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 62:  case 62:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 680 "toke.l"#line 677 "toke.l"
 {  {
                             if (YY_START == INSTR) {                              if (YY_START == INSTR) {
                                 LEXTRACE("ERROR ");                                  LEXTRACE("ERROR ");
Line 3033  YY_RULE_SETUP Line 3030  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 63:  case 63:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 692 "toke.l"#line 689 "toke.l"
 {                       /* throw away space/tabs */  {                       /* throw away space/tabs */
                             sawspace = true;    /* but remember for fill_args */                              sawspace = true;    /* but remember for fill_args */
                         }                          }
         YY_BREAK          YY_BREAK
 case 64:  case 64:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 696 "toke.l"#line 693 "toke.l"
 {  {
                             sawspace = true;    /* remember for fill_args */                              sawspace = true;    /* remember for fill_args */
                             sudolineno++;                              sudolineno++;
Line 3049  YY_RULE_SETUP Line 3046  YY_RULE_SETUP
         YY_BREAK          YY_BREAK
 case 65:  case 65:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 702 "toke.l"#line 699 "toke.l"
 {  {
                            BEGIN INITIAL;                            if (sudoerstext[sudoersleng - 1] == '\n') {
                            sudolineno++;                                /* comment ending in a newline */
                            continued = false;                                BEGIN INITIAL;
                                 sudolineno++;
                                 continued = false;
                             } else if (!feof(yyin)) {
                                 LEXTRACE("ERROR ");
                                 LEXRETURN(ERROR);
                             }
                             LEXTRACE("#\n");                              LEXTRACE("#\n");
                             LEXRETURN(COMMENT);                              LEXRETURN(COMMENT);
                         }                       /* comment, not uid/gid */                          }                       /* comment, not uid/gid */
         YY_BREAK          YY_BREAK
 case 66:  case 66:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 710 "toke.l"#line 713 "toke.l"
 {  {
                             LEXTRACE("ERROR ");                              LEXTRACE("ERROR ");
                             LEXRETURN(ERROR);                              LEXRETURN(ERROR);
Line 3073  case YY_STATE_EOF(STARTDEFS): Line 3076  case YY_STATE_EOF(STARTDEFS):
 case YY_STATE_EOF(INDEFS):  case YY_STATE_EOF(INDEFS):
 case YY_STATE_EOF(INSTR):  case YY_STATE_EOF(INSTR):
 case YY_STATE_EOF(WANTDIGEST):  case YY_STATE_EOF(WANTDIGEST):
#line 715 "toke.l"#line 718 "toke.l"
 {  {
                             if (YY_START != INITIAL) {                              if (YY_START != INITIAL) {
                                 BEGIN INITIAL;                                  BEGIN INITIAL;
Line 3086  case YY_STATE_EOF(WANTDIGEST): Line 3089  case YY_STATE_EOF(WANTDIGEST):
         YY_BREAK          YY_BREAK
 case 67:  case 67:
 YY_RULE_SETUP  YY_RULE_SETUP
#line 725 "toke.l"#line 728 "toke.l"
 ECHO;  ECHO;
         YY_BREAK          YY_BREAK
#line 3092 "lex.sudoers.c"#line 3095 "lex.sudoers.c"
   
         case YY_END_OF_BUFFER:          case YY_END_OF_BUFFER:
                 {                  {
Line 3229  ECHO; Line 3232  ECHO;
  *      EOB_ACT_END_OF_FILE - end of file   *      EOB_ACT_END_OF_FILE - end of file
  */   */
   
static int yy_get_next_buffer()static int yy_get_next_buffer YY_PROTO(( void ))
         {          {
         register char *dest = yy_current_buffer->yy_ch_buf;          register char *dest = yy_current_buffer->yy_ch_buf;
         register char *source = yytext_ptr;          register char *source = yytext_ptr;
Line 3361  static int yy_get_next_buffer() Line 3364  static int yy_get_next_buffer()
   
 /* yy_get_previous_state - get the state just before the EOB char was reached */  /* yy_get_previous_state - get the state just before the EOB char was reached */
   
static yy_state_type yy_get_previous_state()static yy_state_type yy_get_previous_state YY_PROTO(( void ))
         {          {
         register yy_state_type yy_current_state;          register yy_state_type yy_current_state;
         register char *yy_cp;          register char *yy_cp;
Line 3472  register char *yy_bp; Line 3475  register char *yy_bp;
   
 #ifndef YY_NO_INPUT  #ifndef YY_NO_INPUT
 #ifdef __cplusplus  #ifdef __cplusplus
static int yyinput()static int yyinput YY_PROTO(( void ))
 #else  #else
static int input()static int input YY_PROTO(( void ))
 #endif  #endif
         {          {
         int c;          int c;
Line 3850  int new_state; Line 3853  int new_state;
   
   
 #ifndef YY_NO_POP_STATE  #ifndef YY_NO_POP_STATE
static void yy_pop_state()static void yy_pop_state YY_PROTO(( void ))
         {          {
         if ( --yy_start_stack_ptr < 0 )          if ( --yy_start_stack_ptr < 0 )
                 YY_FATAL_ERROR( "start-condition stack underflow" );                  YY_FATAL_ERROR( "start-condition stack underflow" );
Line 3861  static void yy_pop_state() Line 3864  static void yy_pop_state()
   
   
 #ifndef YY_NO_TOP_STATE  #ifndef YY_NO_TOP_STATE
static int yy_top_state()static int yy_top_state YY_PROTO(( void ))
         {          {
         return yy_start_stack[yy_start_stack_ptr - 1];          return yy_start_stack[yy_start_stack_ptr - 1];
         }          }
Line 3980  int main() Line 3983  int main()
         return 0;          return 0;
         }          }
 #endif  #endif
#line 725 "toke.l"#line 728 "toke.l"
   
 struct path_list {  struct path_list {
       SLIST_ENTRY(path_list) entries;
     char *path;      char *path;
     struct path_list *next;  
 };  };
   
   SLIST_HEAD(path_list_head, path_list);
   
 struct include_stack {  struct include_stack {
     YY_BUFFER_STATE bs;      YY_BUFFER_STATE bs;
     char *path;      char *path;
    struct path_list *more; /* more files in case of includedir */    struct path_list_head more; /* more files in case of includedir */
     int lineno;      int lineno;
     bool keepopen;      bool keepopen;
 };  };
   
   /*
    * Compare two struct path_list structs in reverse order.
    */
 static int  static int
 pl_compare(const void *v1, const void *v2)  pl_compare(const void *v1, const void *v2)
 {  {
     const struct path_list * const *p1 = v1;      const struct path_list * const *p1 = v1;
     const struct path_list * const *p2 = v2;      const struct path_list * const *p2 = v2;
   
    return strcmp((*p1)->path, (*p2)->path);    return strcmp((*p2)->path, (*p1)->path);
 }  }
   
 static char *  static char *
 switch_dir(struct include_stack *stack, char *dirpath)  switch_dir(struct include_stack *stack, char *dirpath)
 {  {
     DIR *dir;      DIR *dir;
    int i, count = 0;    unsigned int i, count = 0;
     unsigned int max_paths = 32;
     char *path = NULL;      char *path = NULL;
     struct dirent *dent;      struct dirent *dent;
     struct stat sb;      struct stat sb;
    struct path_list *pl, *first = NULL;    struct path_list *pl, **paths = NULL;
    struct path_list **sorted = NULL; 
     debug_decl(switch_dir, SUDO_DEBUG_PARSER)      debug_decl(switch_dir, SUDO_DEBUG_PARSER)
   
     if (!(dir = opendir(dirpath))) {      if (!(dir = opendir(dirpath))) {
Line 4023  switch_dir(struct include_stack *stack, char *dirpath) Line 4031  switch_dir(struct include_stack *stack, char *dirpath)
         }          }
         goto done;          goto done;
     }      }
       paths = malloc(sizeof(*paths) * max_paths);
       if (paths == NULL) {
           closedir(dir);
           goto bad;
       }
     while ((dent = readdir(dir))) {      while ((dent = readdir(dir))) {
         /* Ignore files that end in '~' or have a '.' in them. */          /* Ignore files that end in '~' or have a '.' in them. */
         if (dent->d_name[0] == '\0' || dent->d_name[NAMLEN(dent) - 1] == '~'          if (dent->d_name[0] == '\0' || dent->d_name[NAMLEN(dent) - 1] == '~'
Line 4042  switch_dir(struct include_stack *stack, char *dirpath) Line 4055  switch_dir(struct include_stack *stack, char *dirpath)
         if (pl == NULL)          if (pl == NULL)
             goto bad;              goto bad;
         pl->path = path;          pl->path = path;
        pl->next = first;        if (count >= max_paths) {
        first = pl;            struct path_list **tmp;
             max_paths <<= 1;
             tmp = realloc(paths, sizeof(*paths) * max_paths);
             if (tmp == NULL) {
                 closedir(dir);
                 goto bad;
             }
             paths = tmp;
         }
         paths[count++] = pl;
         path = NULL;          path = NULL;
         count++;  
     }      }
     closedir(dir);      closedir(dir);
   
     if (count == 0)      if (count == 0)
         goto done;          goto done;
   
    /* Sort the list as an array. */    /* Sort the list as an array in reverse order. */
    sorted = malloc(sizeof(*sorted) * count);    qsort(paths, count, sizeof(*paths), pl_compare);
    if (sorted == NULL)
        goto bad;    /* Build up the list in sorted order. */
    pl = first; 
     for (i = 0; i < count; i++) {      for (i = 0; i < count; i++) {
        sorted[i] = pl;        SLIST_INSERT_HEAD(&stack->more, paths[i], entries);
        pl = pl->next; 
     }      }
     qsort(sorted, count, sizeof(*sorted), pl_compare);  
   
     /* Apply sorting to the list. */  
     first = sorted[0];  
     sorted[count - 1]->next = NULL;  
     for (i = 1; i < count; i++)  
         sorted[i - 1]->next = sorted[i];  
     efree(sorted);  
   
     /* Pull out the first element for parsing, leave the rest for later. */      /* Pull out the first element for parsing, leave the rest for later. */
    if (count) {    pl = SLIST_FIRST(&stack->more);
        path = first->path;    SLIST_REMOVE_HEAD(&stack->more, entries);
        pl = first->next;    path = pl->path;
        efree(first);    efree(pl);
        stack->more = pl; 
    } else { 
        path = NULL; 
    } 
 done:  done:
       efree(paths);
     efree(dirpath);      efree(dirpath);
     debug_return_str(path);      debug_return_str(path);
 bad:  bad:
    while (first != NULL) {    for (i = 0; i < count; i++) {
        pl = first;        efree(paths[i]->path);
        first = pl->next;        efree(paths[i]);
        efree(pl->path); 
        efree(pl); 
     }      }
    efree(sorted);    efree(paths);
     efree(dirpath);      efree(dirpath);
     efree(path);      efree(path);
     debug_return_str(NULL);      debug_return_str(NULL);
Line 4110  init_lexer(void) Line 4116  init_lexer(void)
   
     while (idepth) {      while (idepth) {
         idepth--;          idepth--;
        while ((pl = istack[idepth].more) != NULL) {        while ((pl = SLIST_FIRST(&istack[idepth].more)) != NULL) {
            istack[idepth].more = pl->next;            SLIST_REMOVE_HEAD(&istack[idepth].more, entries);
             efree(pl->path);              efree(pl->path);
             efree(pl);              efree(pl);
         }          }
Line 4141  _push_include(char *path, bool isdir) Line 4147  _push_include(char *path, bool isdir)
   
     /* push current state onto stack */      /* push current state onto stack */
     if (idepth >= istacksize) {      if (idepth >= istacksize) {
           struct include_stack *new_istack;
   
         if (idepth > MAX_SUDOERS_DEPTH) {          if (idepth > MAX_SUDOERS_DEPTH) {
             sudoerserror(N_("too many levels of includes"));              sudoerserror(N_("too many levels of includes"));
             debug_return_bool(false);              debug_return_bool(false);
         }          }
         istacksize += SUDOERS_STACK_INCREMENT;          istacksize += SUDOERS_STACK_INCREMENT;
        istack = (struct include_stack *) realloc(istack,        new_istack = (struct include_stack *) realloc(istack,
             sizeof(*istack) * istacksize);              sizeof(*istack) * istacksize);
        if (istack == NULL) {        if (new_istack == NULL) {
             warning(NULL);              warning(NULL);
             sudoerserror(NULL);              sudoerserror(NULL);
             debug_return_bool(false);              debug_return_bool(false);
         }          }
           istack = new_istack;
     }      }
       SLIST_INIT(&istack[idepth].more);
     if (isdir) {      if (isdir) {
         struct stat sb;          struct stat sb;
         switch (sudo_secure_dir(path, sudoers_uid, sudoers_gid, &sb)) {          switch (sudo_secure_dir(path, sudoers_uid, sudoers_gid, &sb)) {
Line 4169  _push_include(char *path, bool isdir) Line 4179  _push_include(char *path, bool isdir)
                 debug_return_bool(false);                  debug_return_bool(false);
             case SUDO_PATH_WRONG_OWNER:              case SUDO_PATH_WRONG_OWNER:
                 if (sudoers_warnings) {                  if (sudoers_warnings) {
                    warningx(_("%s is owned by uid %u, should be %u"),                       warningx(U_("%s is owned by uid %u, should be %u"),   
                         path, (unsigned int) sb.st_uid,                          path, (unsigned int) sb.st_uid,
                         (unsigned int) sudoers_uid);                          (unsigned int) sudoers_uid);
                 }                  }
                 debug_return_bool(false);                  debug_return_bool(false);
             case SUDO_PATH_WORLD_WRITABLE:              case SUDO_PATH_WORLD_WRITABLE:
                 if (sudoers_warnings) {                  if (sudoers_warnings) {
                    warningx(_("%s is world writable"), path);                    warningx(U_("%s is world writable"), path);
                 }                  }
                 debug_return_bool(false);                  debug_return_bool(false);
             case SUDO_PATH_GROUP_WRITABLE:              case SUDO_PATH_GROUP_WRITABLE:
                 if (sudoers_warnings) {                  if (sudoers_warnings) {
                    warningx(_("%s is owned by gid %u, should be %u"),                    warningx(U_("%s is owned by gid %u, should be %u"),
                         path, (unsigned int) sb.st_gid,                          path, (unsigned int) sb.st_gid,
                         (unsigned int) sudoers_gid);                          (unsigned int) sudoers_gid);
                 }                  }
Line 4197  _push_include(char *path, bool isdir) Line 4207  _push_include(char *path, bool isdir)
         while ((fp = open_sudoers(path, false, &keepopen)) == NULL) {          while ((fp = open_sudoers(path, false, &keepopen)) == NULL) {
             /* Unable to open path in includedir, go to next one, if any. */              /* Unable to open path in includedir, go to next one, if any. */
             efree(path);              efree(path);
            if ((pl = istack[idepth].more) == NULL)            if ((pl = SLIST_FIRST(&istack[idepth].more)) == NULL)
                 debug_return_bool(false);                  debug_return_bool(false);
               SLIST_REMOVE_HEAD(&istack[idepth].more, entries);
             path = pl->path;              path = pl->path;
             istack[idepth].more = pl->next;  
             efree(pl);              efree(pl);
         }          }
     } else {      } else {
Line 4209  _push_include(char *path, bool isdir) Line 4219  _push_include(char *path, bool isdir)
             sudoerserror(NULL);              sudoerserror(NULL);
             debug_return_bool(false);              debug_return_bool(false);
         }          }
         istack[idepth].more = NULL;  
     }      }
     /* Push the old (current) file and open the new one. */      /* Push the old (current) file and open the new one. */
     istack[idepth].path = sudoers; /* push old path */      istack[idepth].path = sudoers; /* push old path */
Line 4238  pop_include(void) Line 4247  pop_include(void)
         fclose(YY_CURRENT_BUFFER->yy_input_file);          fclose(YY_CURRENT_BUFFER->yy_input_file);
     sudoers_delete_buffer(YY_CURRENT_BUFFER);      sudoers_delete_buffer(YY_CURRENT_BUFFER);
     /* If we are in an include dir, move to the next file. */      /* If we are in an include dir, move to the next file. */
    while ((pl = istack[idepth - 1].more) != NULL) {    while ((pl = SLIST_FIRST(&istack[idepth - 1].more)) != NULL) {
         SLIST_REMOVE_HEAD(&istack[idepth - 1].more, entries);
         fp = open_sudoers(pl->path, false, &keepopen);          fp = open_sudoers(pl->path, false, &keepopen);
         if (fp != NULL) {          if (fp != NULL) {
             istack[idepth - 1].more = pl->next;  
             efree(sudoers);              efree(sudoers);
             sudoers = pl->path;              sudoers = pl->path;
             sudolineno = 1;              sudolineno = 1;
Line 4250  pop_include(void) Line 4259  pop_include(void)
             break;              break;
         }          }
         /* Unable to open path in include dir, go to next one. */          /* Unable to open path in include dir, go to next one. */
         istack[idepth - 1].more = pl->next;  
         efree(pl->path);          efree(pl->path);
         efree(pl);          efree(pl);
     }      }

Removed from v.1.1.1.4  
changed lines
  Added in v.1.1.1.5


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>