diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2009-02-02 00:15:00 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2009-02-02 00:15:00 +0000 |
| commit | 4eff8efa591ae4b91e2f453ec63b4ca36a17c256 (patch) | |
| tree | 3650406207b72705cf8b156eb63a12186f4fc69b | |
| parent | 73121c3c8c28d299280a2f1360e038e93f0b254f (diff) | |
| download | busybox-w32-4eff8efa591ae4b91e2f453ec63b4ca36a17c256.tar.gz busybox-w32-4eff8efa591ae4b91e2f453ec63b4ca36a17c256.tar.bz2 busybox-w32-4eff8efa591ae4b91e2f453ec63b4ca36a17c256.zip | |
login: cleanup work by Walter Harms. No logic changes.
| -rw-r--r-- | loginutils/login.c | 102 |
1 files changed, 56 insertions, 46 deletions
diff --git a/loginutils/login.c b/loginutils/login.c index af871436a..d9e9b532b 100644 --- a/loginutils/login.c +++ b/loginutils/login.c | |||
| @@ -165,6 +165,56 @@ static int check_securetty(void) | |||
| 165 | static ALWAYS_INLINE int check_securetty(void) { return 1; } | 165 | static ALWAYS_INLINE int check_securetty(void) { return 1; } |
| 166 | #endif | 166 | #endif |
| 167 | 167 | ||
| 168 | #if ENABLE_SELINUX | ||
| 169 | static void initselinux(char *username, char *full_tty, | ||
| 170 | security_context_t *user_sid) | ||
| 171 | { | ||
| 172 | security_context_t old_tty_sid, new_tty_sid; | ||
| 173 | |||
| 174 | if (!is_selinux_enabled()) | ||
| 175 | return; | ||
| 176 | |||
| 177 | if (get_default_context(username, NULL, user_sid)) { | ||
| 178 | bb_error_msg_and_die("cannot get SID for %s", username); | ||
| 179 | } | ||
| 180 | if (getfilecon(full_tty, &old_tty_sid) < 0) { | ||
| 181 | bb_perror_msg_and_die("getfilecon(%s) failed", full_tty); | ||
| 182 | } | ||
| 183 | if (security_compute_relabel(user_sid, old_tty_sid, | ||
| 184 | SECCLASS_CHR_FILE, &new_tty_sid) != 0) { | ||
| 185 | bb_perror_msg_and_die("security_change_sid(%s) failed", full_tty); | ||
| 186 | } | ||
| 187 | if (setfilecon(full_tty, new_tty_sid) != 0) { | ||
| 188 | bb_perror_msg_and_die("chsid(%s, %s) failed", full_tty, new_tty_sid); | ||
| 189 | } | ||
| 190 | } | ||
| 191 | #endif | ||
| 192 | |||
| 193 | #if ENABLE_LOGIN_SCRIPTS | ||
| 194 | static void run_login_script(struct passwd *pw, char *full_tty) | ||
| 195 | { | ||
| 196 | char *t_argv[2]; | ||
| 197 | |||
| 198 | t_argv[0] = getenv("LOGIN_PRE_SUID_SCRIPT"); | ||
| 199 | if (t_argv[0]) { | ||
| 200 | t_argv[1] = NULL; | ||
| 201 | xsetenv("LOGIN_TTY", full_tty); | ||
| 202 | xsetenv("LOGIN_USER", pw->pw_name); | ||
| 203 | xsetenv("LOGIN_UID", utoa(pw->pw_uid)); | ||
| 204 | xsetenv("LOGIN_GID", utoa(pw->pw_gid)); | ||
| 205 | xsetenv("LOGIN_SHELL", pw->pw_shell); | ||
| 206 | spawn_and_wait(t_argv); /* NOMMU-friendly */ | ||
| 207 | unsetenv("LOGIN_TTY"); | ||
| 208 | unsetenv("LOGIN_USER"); | ||
| 209 | unsetenv("LOGIN_UID"); | ||
| 210 | unsetenv("LOGIN_GID"); | ||
| 211 | unsetenv("LOGIN_SHELL"); | ||
| 212 | } | ||
| 213 | } | ||
| 214 | #else | ||
| 215 | void run_login_script(struct passwd *pw, char *full_tty); | ||
| 216 | #endif | ||
| 217 | |||
| 168 | static void get_username_or_die(char *buf, int size_buf) | 218 | static void get_username_or_die(char *buf, int size_buf) |
| 169 | { | 219 | { |
| 170 | int c, cntdown; | 220 | int c, cntdown; |
| @@ -285,8 +335,7 @@ int login_main(int argc UNUSED_PARAM, char **argv) | |||
| 285 | read_or_build_utent(&utent, run_by_root); | 335 | read_or_build_utent(&utent, run_by_root); |
| 286 | 336 | ||
| 287 | if (opt & LOGIN_OPT_h) { | 337 | if (opt & LOGIN_OPT_h) { |
| 288 | if (ENABLE_FEATURE_UTMP) | 338 | USE_FEATURE_UTMP(safe_strncpy(utent.ut_host, opt_host, sizeof(utent.ut_host));) |
| 289 | safe_strncpy(utent.ut_host, opt_host, sizeof(utent.ut_host)); | ||
| 290 | fromhost = xasprintf(" on '%s' from '%s'", short_tty, opt_host); | 339 | fromhost = xasprintf(" on '%s' from '%s'", short_tty, opt_host); |
| 291 | } else { | 340 | } else { |
| 292 | fromhost = xasprintf(" on '%s'", short_tty); | 341 | fromhost = xasprintf(" on '%s'", short_tty); |
| @@ -410,54 +459,16 @@ int login_main(int argc UNUSED_PARAM, char **argv) | |||
| 410 | 459 | ||
| 411 | write_utent(&utent, username); | 460 | write_utent(&utent, username); |
| 412 | 461 | ||
| 413 | #if ENABLE_SELINUX | 462 | USE_SELINUX(initselinux(username, full_tty, &user_sid)); |
| 414 | if (is_selinux_enabled()) { | ||
| 415 | security_context_t old_tty_sid, new_tty_sid; | ||
| 416 | 463 | ||
| 417 | if (get_default_context(username, NULL, &user_sid)) { | ||
| 418 | bb_error_msg_and_die("cannot get SID for %s", | ||
| 419 | username); | ||
| 420 | } | ||
| 421 | if (getfilecon(full_tty, &old_tty_sid) < 0) { | ||
| 422 | bb_perror_msg_and_die("getfilecon(%s) failed", | ||
| 423 | full_tty); | ||
| 424 | } | ||
| 425 | if (security_compute_relabel(user_sid, old_tty_sid, | ||
| 426 | SECCLASS_CHR_FILE, &new_tty_sid) != 0) { | ||
| 427 | bb_perror_msg_and_die("security_change_sid(%s) failed", | ||
| 428 | full_tty); | ||
| 429 | } | ||
| 430 | if (setfilecon(full_tty, new_tty_sid) != 0) { | ||
| 431 | bb_perror_msg_and_die("chsid(%s, %s) failed", | ||
| 432 | full_tty, new_tty_sid); | ||
| 433 | } | ||
| 434 | } | ||
| 435 | #endif | ||
| 436 | /* Try these, but don't complain if they fail. | 464 | /* Try these, but don't complain if they fail. |
| 437 | * _f_chown is safe wrt race t=ttyname(0);...;chown(t); */ | 465 | * _f_chown is safe wrt race t=ttyname(0);...;chown(t); */ |
| 438 | fchown(0, pw->pw_uid, pw->pw_gid); | 466 | fchown(0, pw->pw_uid, pw->pw_gid); |
| 439 | fchmod(0, 0600); | 467 | fchmod(0, 0600); |
| 440 | 468 | ||
| 441 | /* We trust environment only if we run by root */ | 469 | /* We trust environment only if we run by root */ |
| 442 | if (ENABLE_LOGIN_SCRIPTS && run_by_root) { | 470 | if (ENABLE_LOGIN_SCRIPTS && run_by_root) |
| 443 | char *t_argv[2]; | 471 | run_login_script(pw, full_tty); |
| 444 | |||
| 445 | t_argv[0] = getenv("LOGIN_PRE_SUID_SCRIPT"); | ||
| 446 | if (t_argv[0]) { | ||
| 447 | t_argv[1] = NULL; | ||
| 448 | xsetenv("LOGIN_TTY", full_tty); | ||
| 449 | xsetenv("LOGIN_USER", pw->pw_name); | ||
| 450 | xsetenv("LOGIN_UID", utoa(pw->pw_uid)); | ||
| 451 | xsetenv("LOGIN_GID", utoa(pw->pw_gid)); | ||
| 452 | xsetenv("LOGIN_SHELL", pw->pw_shell); | ||
| 453 | spawn_and_wait(t_argv); /* NOMMU-friendly */ | ||
| 454 | unsetenv("LOGIN_TTY" ); | ||
| 455 | unsetenv("LOGIN_USER" ); | ||
| 456 | unsetenv("LOGIN_UID" ); | ||
| 457 | unsetenv("LOGIN_GID" ); | ||
| 458 | unsetenv("LOGIN_SHELL"); | ||
| 459 | } | ||
| 460 | } | ||
| 461 | 472 | ||
| 462 | change_identity(pw); | 473 | change_identity(pw); |
| 463 | tmp = pw->pw_shell; | 474 | tmp = pw->pw_shell; |
| @@ -470,11 +481,10 @@ int login_main(int argc UNUSED_PARAM, char **argv) | |||
| 470 | 481 | ||
| 471 | if (pw->pw_uid == 0) | 482 | if (pw->pw_uid == 0) |
| 472 | syslog(LOG_INFO, "root login%s", fromhost); | 483 | syslog(LOG_INFO, "root login%s", fromhost); |
| 473 | #if ENABLE_SELINUX | 484 | |
| 474 | /* well, a simple setexeccon() here would do the job as well, | 485 | /* well, a simple setexeccon() here would do the job as well, |
| 475 | * but let's play the game for now */ | 486 | * but let's play the game for now */ |
| 476 | set_current_security_context(user_sid); | 487 | USE_SELINUX(set_current_security_context(user_sid);) |
| 477 | #endif | ||
| 478 | 488 | ||
| 479 | // util-linux login also does: | 489 | // util-linux login also does: |
| 480 | // /* start new session */ | 490 | // /* start new session */ |
