get all the docs in the sudo-ldap package into one directory, not two!
[debian/sudo] / toke.l
diff --git a/toke.l b/toke.l
index bb89a2fc8000d6c85d8082e895eb0cd963524267..ce1fd4c177370c868c3980338931ac8274337ac6 100644 (file)
--- a/toke.l
+++ b/toke.l
@@ -1,6 +1,6 @@
 %{
 /*
- * Copyright (c) 1996, 1998-2005, 2007-2009
+ * Copyright (c) 1996, 1998-2005, 2007-2010
  *     Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
 #endif /* STDC_HEADERS */
 #ifdef HAVE_STRING_H
 # include <string.h>
-#else
-# ifdef HAVE_STRINGS_H
-#  include <strings.h>
-# endif
 #endif /* HAVE_STRING_H */
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif /* HAVE_STRINGS_H */
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif /* HAVE_UNISTD_H */
 #include "parse.h"
 #include <gram.h>
 
-#ifndef lint
-__unused static const char rcsid[] = "$Sudo: toke.l,v 1.40 2009/11/22 14:54:04 millert Exp $";
-#endif /* lint */
-
 extern YYSTYPE yylval;
 extern int parse_error;
 int sudolineno = 1;
@@ -225,7 +220,7 @@ DEFVAR                      [a-z_]+
                            return(COMMAND);
                        }                       /* end of command line args */
 
-    [^\\:, \t\n]+      {
+    [^#\\:, \t\n]+     {
                            LEXTRACE("ARG ");
                            if (!fill_args(yytext, yyleng, sawspace))
                                yyterminate();
@@ -262,7 +257,7 @@ DEFVAR                      [a-z_]+
                                yyterminate();
                        }
 
-<INITIAL>^[[:blank:]]*Defaults([:@>\!]{WORD})? {
+<INITIAL>^[[:blank:]]*Defaults([:@>\!]\!?{WORD})? {
                            int n;
                            for (n = 0; isblank((unsigned char)yytext[n]); n++)
                                continue;
@@ -844,7 +839,7 @@ init_lexer()
            efree(pl);
        }
        efree(istack[idepth].path);
-       if (!istack[idepth].keepopen)
+       if (idepth && !istack[idepth].keepopen)
            fclose(istack[idepth].bs->yy_input_file);
        yy_delete_buffer(istack[idepth].bs);
     }
@@ -859,6 +854,7 @@ _push_include(path, isdir)
     char *path;
     int isdir;
 {
+    struct path_list *pl;
     FILE *fp;
 
     /* push current state onto stack */
@@ -869,7 +865,7 @@ _push_include(path, isdir)
        }
        istacksize += SUDOERS_STACK_INCREMENT;
        istack = (struct include_stack *) realloc(istack,
-           sizeof(istack) * istacksize);
+           sizeof(*istack) * istacksize);
        if (istack == NULL) {
            yyerror("unable to allocate memory");
            return(FALSE);
@@ -880,9 +876,14 @@ _push_include(path, isdir)
            /* switch_dir() called yyerror() for us */
            return(FALSE);
        }
-       if ((fp = open_sudoers(path, FALSE, &keepopen)) == NULL) {
-           yyerror(path);
-           return(FALSE); /* XXX - just to go next one */
+       while ((fp = open_sudoers(path, FALSE, &keepopen)) == NULL) {
+           /* Unable to open path in includedir, go to next one, if any. */
+           efree(path);
+           if ((pl = istack[idepth].more) == NULL)
+               return(FALSE);
+           path = pl->path;
+           istack[idepth].more = pl->next;
+           efree(pl);
        }
     } else {
        if ((fp = open_sudoers(path, TRUE, &keepopen)) == NULL) {
@@ -916,25 +917,31 @@ pop_include()
     if (!keepopen)
        fclose(YY_CURRENT_BUFFER->yy_input_file);
     yy_delete_buffer(YY_CURRENT_BUFFER);
-    keepopen = FALSE;
-    if ((pl = istack[idepth - 1].more) != NULL) {
-       /* Move to next file in the dir. */
-       istack[idepth - 1].more = pl->next;
-       if ((fp = open_sudoers(pl->path, FALSE, &keepopen)) == NULL) {
-           yyerror(pl->path);
-           return(FALSE); /* XXX - just to go next one */
+    /* If we are in an include dir, move to the next file. */
+    while ((pl = istack[idepth - 1].more) != NULL) {
+       fp = open_sudoers(pl->path, FALSE, &keepopen);
+       if (fp != NULL) {
+           istack[idepth - 1].more = pl->next;
+           efree(sudoers);
+           sudoers = pl->path;
+           sudolineno = 1;
+           yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE));
+           efree(pl);
+           break;
        }
-       efree(sudoers);
-       sudoers = pl->path;
-       sudolineno = 1;
-       yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE));
+       /* Unable to open path in include dir, go to next one. */
+       istack[idepth - 1].more = pl->next;
+       efree(pl->path);
        efree(pl);
-    } else {
+    }
+    /* If no path list, just pop the last dir on the stack. */
+    if (pl == NULL) {
        idepth--;
        yy_switch_to_buffer(istack[idepth].bs);
        efree(sudoers);
        sudoers = istack[idepth].path;
        sudolineno = istack[idepth].lineno;
+       keepopen = istack[idepth].keepopen;
     }
     return(TRUE);
 }