diff options
Diffstat (limited to 'miscutils/crontab.c')
-rw-r--r-- | miscutils/crontab.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/miscutils/crontab.c b/miscutils/crontab.c index 743ac74ae..39d3aae41 100644 --- a/miscutils/crontab.c +++ b/miscutils/crontab.c | |||
@@ -156,6 +156,7 @@ int crontab_main(int ac, char **av) | |||
156 | break; | 156 | break; |
157 | case EDIT: | 157 | case EDIT: |
158 | { | 158 | { |
159 | /* FIXME: messy code here! we have file copying helpers for this! */ | ||
159 | FILE *fi; | 160 | FILE *fi; |
160 | int fd; | 161 | int fd; |
161 | int n; | 162 | int n; |
@@ -163,11 +164,12 @@ int crontab_main(int ac, char **av) | |||
163 | 164 | ||
164 | snprintf(tmp, sizeof(tmp), TMPDIR "/crontab.%d", getpid()); | 165 | snprintf(tmp, sizeof(tmp), TMPDIR "/crontab.%d", getpid()); |
165 | fd = xopen3(tmp, O_RDWR|O_CREAT|O_TRUNC|O_EXCL, 0600); | 166 | fd = xopen3(tmp, O_RDWR|O_CREAT|O_TRUNC|O_EXCL, 0600); |
167 | /* race, use fchown */ | ||
166 | chown(tmp, getuid(), getgid()); | 168 | chown(tmp, getuid(), getgid()); |
167 | fi = fopen(pas->pw_name, "r"); | 169 | fi = fopen(pas->pw_name, "r"); |
168 | if (fi) { | 170 | if (fi) { |
169 | while ((n = fread(buf, 1, sizeof(buf), fi)) > 0) | 171 | while ((n = fread(buf, 1, sizeof(buf), fi)) > 0) |
170 | write(fd, buf, n); | 172 | full_write(fd, buf, n); |
171 | } | 173 | } |
172 | EditFile(caller, tmp); | 174 | EditFile(caller, tmp); |
173 | remove(tmp); | 175 | remove(tmp); |
@@ -178,6 +180,7 @@ int crontab_main(int ac, char **av) | |||
178 | /* fall through */ | 180 | /* fall through */ |
179 | case REPLACE: | 181 | case REPLACE: |
180 | { | 182 | { |
183 | /* same here */ | ||
181 | char path[1024]; | 184 | char path[1024]; |
182 | int fd; | 185 | int fd; |
183 | int n; | 186 | int n; |
@@ -186,7 +189,7 @@ int crontab_main(int ac, char **av) | |||
186 | fd = open(path, O_CREAT|O_TRUNC|O_APPEND|O_WRONLY, 0600); | 189 | fd = open(path, O_CREAT|O_TRUNC|O_APPEND|O_WRONLY, 0600); |
187 | if (fd >= 0) { | 190 | if (fd >= 0) { |
188 | while ((n = read(repFd, buf, sizeof(buf))) > 0) { | 191 | while ((n = read(repFd, buf, sizeof(buf))) > 0) { |
189 | write(fd, buf, n); | 192 | full_write(fd, buf, n); |
190 | } | 193 | } |
191 | close(fd); | 194 | close(fd); |
192 | rename(path, pas->pw_name); | 195 | rename(path, pas->pw_name); |