install_sudoers: fix return value when there is no temp file to install

This can happen when no changes were made.  Also preserve the edited
temp file on error if we are unable to move it into place.
This commit is contained in:
Todd C. Miller
2021-11-09 16:09:48 -07:00
parent def7a51f4d
commit 55d17eaa34

View File

@@ -303,7 +303,12 @@ main(int argc, char *argv[])
if (reparse_sudoers(editor, editor_argc, editor_argv, strict, quiet)) { if (reparse_sudoers(editor, editor_argc, editor_argv, strict, quiet)) {
TAILQ_FOREACH(sp, &sudoerslist, entries) { TAILQ_FOREACH(sp, &sudoerslist, entries) {
if (!install_sudoers(sp, use_owner, use_perms)) { if (!install_sudoers(sp, use_owner, use_perms)) {
sudo_warnx(U_("contents of edit session left in %s"), sp->tpath); if (sp->tpath != NULL) {
sudo_warnx(U_("contents of edit session left in %s"),
sp->tpath);
free(sp->tpath);
sp->tpath = NULL;
}
exitcode = 1; exitcode = 1;
} }
} }
@@ -700,8 +705,10 @@ install_sudoers(struct sudoersfile *sp, bool set_owner, bool set_mode)
bool ret = false; bool ret = false;
debug_decl(install_sudoers, SUDOERS_DEBUG_UTIL); debug_decl(install_sudoers, SUDOERS_DEBUG_UTIL);
if (sp->tpath == NULL) if (sp->tpath == NULL) {
ret = true;
goto done; goto done;
}
if (!sp->modified) { if (!sp->modified) {
/* /*
@@ -787,19 +794,15 @@ install_sudoers(struct sudoersfile *sp, bool set_owner, bool set_mode)
av[3] = NULL; av[3] = NULL;
/* And run it... */ /* And run it... */
if (run_command(_PATH_MV, av)) { if (run_command(_PATH_MV, av) != 0) {
sudo_warnx(U_("command failed: '%s %s %s', %s unchanged"), sudo_warnx(U_("command failed: '%s %s %s', %s unchanged"),
_PATH_MV, sp->tpath, sp->path, sp->path); _PATH_MV, sp->tpath, sp->path, sp->path);
(void) unlink(sp->tpath);
free(sp->tpath);
sp->tpath = NULL;
goto done; goto done;
} }
free(sp->tpath); free(sp->tpath);
sp->tpath = NULL; sp->tpath = NULL;
} else { } else {
sudo_warn(U_("error renaming %s, %s unchanged"), sp->tpath, sp->path); sudo_warn(U_("error renaming %s, %s unchanged"), sp->tpath, sp->path);
(void) unlink(sp->tpath);
goto done; goto done;
} }
} }