crontab: Fix -e with editors saving using renaming strategy

Some editors (like vim) use renaming strategy to save file. That means
they save a file to some random name and then rename it to final
location. The advantage is that such save is atomic.

However, crontab -e holds open fd to the temporary file, meaning it
never sees the changes. The temporary file needs to be re-opened after
the editor terminates for the changes to properly save.

Fixes #12491

Signed-off-by: Gray Wolf <wolf@wolfsden.cz>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Gray Wolf 2020-06-13 02:00:48 +02:00 committed by Denys Vlasenko
parent d21a63f9fc
commit 051665ef69

View File

@ -165,8 +165,12 @@ int crontab_main(int argc UNUSED_PARAM, char **argv)
close(fd);
xlseek(src_fd, 0, SEEK_SET);
}
close_on_exec_on(src_fd); /* don't want editor to see this fd */
close(src_fd);
edit_file(pas, tmp_fname);
/* The src_fd needs to be reopened to handle editors that do
* save the buffer as new file and rename it to tmp_fname (so
* for example vim). */
src_fd = xopen3(tmp_fname, O_RDONLY, 0600);
/* fall through */
case 0: /* Replace (no -l, -e, or -r were given) */