summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGray Wolf2020-06-13 02:00:48 +0200
committerDenys Vlasenko2020-07-11 17:02:37 +0200
commit051665ef69568cf16a445a86a43d5ae74d303add (patch)
treee87eaedf959b41ab2c9ce5b318225b1e2a1684e6
parentd21a63f9fca8eb16f79de9b72d4a3484dfaec1fc (diff)
downloadbusybox-051665ef69568cf16a445a86a43d5ae74d303add.zip
busybox-051665ef69568cf16a445a86a43d5ae74d303add.tar.gz
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>
-rw-r--r--miscutils/crontab.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/miscutils/crontab.c b/miscutils/crontab.c
index c71d914..411a18a 100644
--- a/miscutils/crontab.c
+++ b/miscutils/crontab.c
@@ -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) */