From a3aa40b0fe0fcef6a09dc0ecd1a61b74162773c8 Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Tue, 12 Nov 2013 09:36:39 -0700 Subject: [PATCH] Cope with a comment on the last line of the file with no newline. Bug #623 --- plugins/sudoers/toke.c | 60 +++++++++++++++++++++++------------------- plugins/sudoers/toke.l | 14 +++++++--- 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/plugins/sudoers/toke.c b/plugins/sudoers/toke.c index 6a9a74b0a..866466393 100644 --- a/plugins/sudoers/toke.c +++ b/plugins/sudoers/toke.c @@ -312,45 +312,45 @@ static yyconst short int yy_accept[814] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, - 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, - 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, 12, 66, 19, 19, 18, 18, 18, 19, 18, 18, 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, 55, 55, 55, 0, 39, 46, 46, 46, 46, 46, 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, 17, 17, 15, 14, 15, 0, 0, 3, 9, 0, 6, 7, 9, 9, 13, 0, 13, 13, 0, 10, 36, 0, 0, 35, 19, 19, 0, 19, 0, 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, 46, 41, 46, 46, 46, 46, 46, 46, 46, 46, 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, - 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, 39, 39, 39, 39, 39, 39, 39, 46, 46, 46, 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, 18, 19, 46, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 55, 55, 55, 0, 0, 40, 40, 40, 0, 39, 39, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 27, 46, 46, 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, 19, 19, 19, 19, 19, 19, 19, 19, 55, 55, @@ -358,7 +358,7 @@ static yyconst short int yy_accept[814] = 0, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 46, 46, 46, 46, 46, 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, 19, 19, 19, 37, 37, 37, 0, 0, 39, 39, 39, 39, 39, 39, 39, 0, 0, 0, 0, 0, @@ -366,12 +366,12 @@ static yyconst short int yy_accept[814] = 39, 39, 39, 39, 46, 46, 46, 0, 26, 46, 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, 39, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 0, 0, 39, 39, 39, 39, 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, 46, 46, 19, 19, 19, 38, 38, 38, 38, 39, 0, 0, 0, 39, 39, 39, 39, 39, 39, 39, @@ -379,23 +379,23 @@ static yyconst short int yy_accept[814] = 39, 39, 39, 39, 39, 39, 0, 0, 0, 0, 0, 39, 39, 39, 39, 39, 39, 39, 39, 46, 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, 0, 0, 0, 0, 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, - 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, 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, 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, 39, 39, 39, 39, 39, 39, 39, 39, 0, 33, - 46, 0, 0, 0, 0, 0, 0, 46, 55, 55, - 55, 39, 39, 39, 39, 39, 39, 0, 31, 0, - 0, 21, 0, 0, 0, 55, 55, 55, 55, 55, + 46, 65, 0, 0, 0, 0, 0, 46, 55, 55, + 55, 39, 39, 39, 39, 39, 39, 0, 31, 65, + 65, 21, 0, 0, 0, 55, 55, 55, 55, 55, 39, 39, 39, 39, 39, 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, @@ -3051,16 +3051,22 @@ case 65: YY_RULE_SETUP #line 702 "toke.l" { - BEGIN INITIAL; - sudolineno++; - continued = false; + if (sudoerstext[sudoersleng - 1] == '\n') { + /* comment ending in a newline */ + BEGIN INITIAL; + sudolineno++; + continued = false; + } else if (!feof(yyin)) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } LEXTRACE("#\n"); LEXRETURN(COMMENT); } /* comment, not uid/gid */ YY_BREAK case 66: YY_RULE_SETUP -#line 710 "toke.l" +#line 716 "toke.l" { LEXTRACE("ERROR "); LEXRETURN(ERROR); @@ -3073,7 +3079,7 @@ case YY_STATE_EOF(STARTDEFS): case YY_STATE_EOF(INDEFS): case YY_STATE_EOF(INSTR): case YY_STATE_EOF(WANTDIGEST): -#line 715 "toke.l" +#line 721 "toke.l" { if (YY_START != INITIAL) { BEGIN INITIAL; @@ -3086,10 +3092,10 @@ case YY_STATE_EOF(WANTDIGEST): YY_BREAK case 67: YY_RULE_SETUP -#line 725 "toke.l" +#line 731 "toke.l" ECHO; YY_BREAK -#line 3092 "lex.sudoers.c" +#line 3098 "lex.sudoers.c" case YY_END_OF_BUFFER: { @@ -3980,7 +3986,7 @@ int main() return 0; } #endif -#line 725 "toke.l" +#line 731 "toke.l" struct path_list { SLIST_ENTRY(path_list) entries; diff --git a/plugins/sudoers/toke.l b/plugins/sudoers/toke.l index 413adc9e3..1d449ab4d 100644 --- a/plugins/sudoers/toke.l +++ b/plugins/sudoers/toke.l @@ -699,10 +699,16 @@ sudoedit { continued = true; } /* throw away EOL after \ */ -#(-[^\n0-9].*|[^\n0-9-].*)?\n { - BEGIN INITIAL; - sudolineno++; - continued = false; +#(-[^\n0-9].*|[^\n0-9-].*)?\n? { + if (sudoerstext[sudoersleng - 1] == '\n') { + /* comment ending in a newline */ + BEGIN INITIAL; + sudolineno++; + continued = false; + } else if (!feof(yyin)) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } LEXTRACE("#\n"); LEXRETURN(COMMENT); } /* comment, not uid/gid */