From: Todd C. Miller Date: Mon, 6 Jan 2003 20:06:12 +0000 (+0000) Subject: o The parser needs sudoers to end with a newline but some editors (emacs) may X-Git-Tag: SUDO_1_6_7~93 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=35cf881d7623aafa8b28b039ad7675a56dd03218;p=sudo o The parser needs sudoers to end with a newline but some editors (emacs) may not add one. Check for a missing newline at EOF and add one if needed. o Set quiet flag during initial sudoers parse (to get options) o Move yyrestart() call and always use freopen() to open yyin after initial sudoers parse. --- diff --git a/visudo.c b/visudo.c index 1755bd58e..341eb4283 100644 --- a/visudo.c +++ b/visudo.c @@ -231,17 +231,24 @@ main(argc, argv) Exit(-1); } + /* Add missing newline at EOF if needed. */ + if (n > 0 && buf[n - 1] != '\n') { + buf[0] = '\n'; + write(stmp_fd, buf, 1); + } + (void) close(stmp_fd); (void) touch(stmp, sudoers_sb.st_mtime); /* Parse sudoers to pull in editor and env_editor conf values. */ if ((yyin = fopen(stmp, "r"))) { yyout = stdout; + n = quiet; + quiet = 1; init_parser(); yyparse(); parse_error = FALSE; - yyrestart(yyin); - fclose(yyin); + quiet = n; } } else (void) close(stmp_fd); @@ -390,10 +397,7 @@ main(argc, argv) * for parse errors. */ yyout = stdout; - if (parse_error) - yyin = freopen(stmp, "r", yyin); - else - yyin = fopen(stmp, "r"); + yyin = freopen(stmp, "r+", yyin); if (yyin == NULL) { (void) fprintf(stderr, "%s: Can't re-open temporary file (%s), %s unchanged.\n", @@ -401,12 +405,18 @@ main(argc, argv) Exit(-1); } + /* Add missing newline at EOF if needed. */ + if (fseek(yyin, -1, SEEK_END) == 0 && (ch = fgetc(yyin)) != '\n') + fputc('\n', yyin); + rewind(yyin); + /* Clean slate for each parse */ user_runas = NULL; init_defaults(); init_parser(); - /* Parse the sudoers file */ + /* Parse the sudoers temp file */ + yyrestart(yyin); if (yyparse() && parse_error != TRUE) { (void) fprintf(stderr, "%s: Failed to parse temporary file (%s), unknown error.\n", @@ -432,7 +442,6 @@ main(argc, argv) Exit(0); break; } - yyrestart(yyin); /* reset lexer */ } } while (parse_error == TRUE);