]> granicus.if.org Git - sudo/commitdiff
Set errorfile to the sudoers path if we set parse_error manually.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 14 Apr 2010 10:24:42 +0000 (06:24 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 14 Apr 2010 10:24:42 +0000 (06:24 -0400)
This prevents a NULL dereference in printf() when checking a sudoers
file in strict mode when alias errors are present.

plugins/sudoers/visudo.c

index 45c6673ba66515e4be56bdf6db379ee731ffc668..5d20135a130a146112b28531cdf56ee79dfc7865 100644 (file)
@@ -427,14 +427,17 @@ reparse_sudoers(editor, args, strict, quiet)
 
        /* Parse the sudoers temp file */
        yyrestart(fp);
-       if (yyparse() && parse_error != TRUE) {
+       if (yyparse() && !parse_error) {
            warningx("unabled to parse temporary file (%s), unknown error",
                sp->tpath);
            parse_error = TRUE;
+           errorfile = sp->path;
        }
        fclose(yyin);
-       if (check_aliases(strict, quiet) != 0)
+       if (!parse_error && check_aliases(strict, quiet) != 0) {
            parse_error = TRUE;
+           errorfile = sp->path;
+       }
 
        /*
         * Got an error, prompt the user for what to do now
@@ -698,22 +701,27 @@ check_syntax(sudoers_path, quiet, strict)
        exit(1);
     }
     init_parser(sudoers_path, quiet);
-    if (yyparse() && parse_error != TRUE) {
+    if (yyparse() && !parse_error) {
        if (!quiet)
            warningx("failed to parse %s file, unknown error", sudoers_path);
        parse_error = TRUE;
+       errorfile = sudoers_path;
     }
-    if (!parse_error) {
-       if (check_aliases(strict, quiet) != 0)
-           parse_error = TRUE;
+    if (!parse_error && check_aliases(strict, quiet) != 0) {
+       parse_error = TRUE;
+       errorfile = sudoers_path;
     }
     error = parse_error;
     if (!quiet) {
-       if (parse_error)
-           (void) printf("parse error in %s near line %d\n", errorfile,
-               errorlineno);
-       else
+       if (parse_error) {
+           if (errorlineno != -1)
+               (void) printf("parse error in %s near line %d\n", errorfile,
+                   errorlineno);
+           else
+               (void) printf("parse error in %s\n", errorfile);
+       } else {
            (void) printf("%s: parsed OK\n", sudoers_path);
+       }
     }
     /* Check mode and owner in strict mode. */
 #ifdef HAVE_FSTAT