]> granicus.if.org Git - sudo/commitdiff
Fix mode on sudoers as needed when the -f option is not specified.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 30 Nov 2011 20:33:26 +0000 (15:33 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 30 Nov 2011 20:33:26 +0000 (15:33 -0500)
plugins/sudoers/visudo.c

index 8a06fbc0910648e4d605640c5a4d91a663580127..0f1fa09dd0363ea550b1af0703c20b6399002059 100644 (file)
@@ -249,12 +249,9 @@ main(int argc, char *argv[])
     /* Check edited files for a parse error and re-edit any that fail. */
     reparse_sudoers(editor, args, strict, quiet);
 
-    /* Install the sudoers temp files. */
+    /* Install the sudoers temp files as needed. */
     tq_foreach_fwd(&sudoerslist, sp) {
-       if (!sp->modified)
-           (void) unlink(sp->tpath);
-       else
-           (void) install_sudoers(sp, oldperms);
+       (void) install_sudoers(sp, oldperms);
     }
 
     exit(0);
@@ -538,6 +535,20 @@ install_sudoers(struct sudoersfile *sp, int oldperms)
 {
     struct stat sb;
 
+    if (!sp->modified) {
+       /*
+        * No changes but fix owner/mode if needed.
+        */
+       (void) unlink(sp->tpath);
+       if (!oldperms && fstat(sp->fd, &sb) != -1) {
+           if (sb.st_uid != SUDOERS_UID || sb.st_gid != SUDOERS_GID)
+               (void) chown(sp->path, SUDOERS_UID, SUDOERS_GID);
+           if ((sb.st_mode & 0777) != SUDOERS_MODE)
+               (void) chmod(sp->path, SUDOERS_MODE);
+       }
+       return TRUE;
+    }
+
     /*
      * Change mode and ownership of temp file so when
      * we move it to sp->path things are kosher.