diff options
Diffstat (limited to 'miscutils')
-rw-r--r-- | miscutils/crond.c | 16 | ||||
-rw-r--r-- | miscutils/crontab.c | 31 |
2 files changed, 8 insertions, 39 deletions
diff --git a/miscutils/crond.c b/miscutils/crond.c index 637e09dd8..7915b860a 100644 --- a/miscutils/crond.c +++ b/miscutils/crond.c | |||
@@ -299,6 +299,7 @@ static int | |||
299 | ChangeUser(const char *user) | 299 | ChangeUser(const char *user) |
300 | { | 300 | { |
301 | struct passwd *pas; | 301 | struct passwd *pas; |
302 | const char *err_msg; | ||
302 | 303 | ||
303 | /* | 304 | /* |
304 | * Obtain password entry and change privilages | 305 | * Obtain password entry and change privilages |
@@ -315,18 +316,9 @@ ChangeUser(const char *user) | |||
315 | /* | 316 | /* |
316 | * Change running state to the user in question | 317 | * Change running state to the user in question |
317 | */ | 318 | */ |
318 | 319 | err_msg = change_identity_e2str(pas); | |
319 | if (initgroups(user, pas->pw_gid) < 0) { | 320 | if (err_msg) { |
320 | crondlog("\011initgroups failed: %s %m", user); | 321 | crondlog("\011%s for user %s", err_msg, user); |
321 | return(-1); | ||
322 | } | ||
323 | /* drop all priviledges */ | ||
324 | if (setgid(pas->pw_gid) < 0) { | ||
325 | crondlog("\011setgid failed: %s %d", user, pas->pw_gid); | ||
326 | return(-1); | ||
327 | } | ||
328 | if (setuid(pas->pw_uid) < 0) { | ||
329 | crondlog("\011setuid failed: %s %d", user, pas->pw_uid); | ||
330 | return(-1); | 322 | return(-1); |
331 | } | 323 | } |
332 | if (chdir(pas->pw_dir) < 0) { | 324 | if (chdir(pas->pw_dir) < 0) { |
diff --git a/miscutils/crontab.c b/miscutils/crontab.c index 6c4da95fe..52d08dda3 100644 --- a/miscutils/crontab.c +++ b/miscutils/crontab.c | |||
@@ -333,18 +333,6 @@ EditFile(const char *user, const char *file) | |||
333 | wait4(pid, NULL, 0, NULL); | 333 | wait4(pid, NULL, 0, NULL); |
334 | } | 334 | } |
335 | 335 | ||
336 | static void | ||
337 | log(const char *ctl, ...) | ||
338 | { | ||
339 | va_list va; | ||
340 | char buf[1024]; | ||
341 | |||
342 | va_start(va, ctl); | ||
343 | vsnprintf(buf, sizeof(buf), ctl, va); | ||
344 | syslog(LOG_NOTICE, "%s",buf ); | ||
345 | va_end(va); | ||
346 | } | ||
347 | |||
348 | static int | 336 | static int |
349 | ChangeUser(const char *user, short dochdir) | 337 | ChangeUser(const char *user, short dochdir) |
350 | { | 338 | { |
@@ -355,7 +343,7 @@ ChangeUser(const char *user, short dochdir) | |||
355 | */ | 343 | */ |
356 | 344 | ||
357 | if ((pas = getpwnam(user)) == 0) { | 345 | if ((pas = getpwnam(user)) == 0) { |
358 | log("failed to get uid for %s", user); | 346 | bb_perror_msg_and_die("failed to get uid for %s", user); |
359 | return(-1); | 347 | return(-1); |
360 | } | 348 | } |
361 | setenv("USER", pas->pw_name, 1); | 349 | setenv("USER", pas->pw_name, 1); |
@@ -365,24 +353,13 @@ ChangeUser(const char *user, short dochdir) | |||
365 | /* | 353 | /* |
366 | * Change running state to the user in question | 354 | * Change running state to the user in question |
367 | */ | 355 | */ |
356 | change_identity(pas); | ||
368 | 357 | ||
369 | if (initgroups(user, pas->pw_gid) < 0) { | ||
370 | log("initgroups failed: %s %m", user); | ||
371 | return(-1); | ||
372 | } | ||
373 | if (setregid(pas->pw_gid, pas->pw_gid) < 0) { | ||
374 | log("setregid failed: %s %d", user, pas->pw_gid); | ||
375 | return(-1); | ||
376 | } | ||
377 | if (setreuid(pas->pw_uid, pas->pw_uid) < 0) { | ||
378 | log("setreuid failed: %s %d", user, pas->pw_uid); | ||
379 | return(-1); | ||
380 | } | ||
381 | if (dochdir) { | 358 | if (dochdir) { |
382 | if (chdir(pas->pw_dir) < 0) { | 359 | if (chdir(pas->pw_dir) < 0) { |
360 | bb_perror_msg_and_die("chdir failed: %s %s", user, pas->pw_dir); | ||
383 | if (chdir(TMPDIR) < 0) { | 361 | if (chdir(TMPDIR) < 0) { |
384 | log("chdir failed: %s %s", user, pas->pw_dir); | 362 | bb_perror_msg_and_die("chdir failed: %s %s", user, TMPDIR); |
385 | log("chdir failed: %s " TMPDIR, user); | ||
386 | return(-1); | 363 | return(-1); |
387 | } | 364 | } |
388 | } | 365 | } |