1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-25 23:21:33 +03:00

switch-root: reopen /dev/console before we switch root

This commit is contained in:
Lennart Poettering 2012-07-10 19:19:59 +02:00
parent 94163dd543
commit cd3bd60a2e
4 changed files with 37 additions and 23 deletions

View File

@ -164,16 +164,11 @@ _noreturn_ static void crash(int sig) {
sa.sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART; sa.sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART;
assert_se(sigaction(SIGCHLD, &sa, NULL) == 0); assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
if ((pid = fork()) < 0) pid = fork();
if (pid < 0)
log_error("Failed to fork off crash shell: %s", strerror(errno)); log_error("Failed to fork off crash shell: %s", strerror(errno));
else if (pid == 0) { else if (pid == 0) {
int fd, r; make_console_stdio();
if ((fd = acquire_terminal("/dev/console", false, true, true, (usec_t) -1)) < 0)
log_error("Failed to acquire terminal: %s", strerror(-fd));
else if ((r = make_stdio(fd)) < 0)
log_error("Failed to duplicate terminal fd: %s", strerror(-r));
execl("/bin/sh", "/bin/sh", NULL); execl("/bin/sh", "/bin/sh", NULL);
log_error("execl() failed: %s", strerror(errno)); log_error("execl() failed: %s", strerror(errno));
@ -1677,6 +1672,9 @@ finish:
* rebooted while we do that */ * rebooted while we do that */
watchdog_close(true); watchdog_close(true);
/* Reopen the console */
make_console_stdio();
if (switch_root_dir) { if (switch_root_dir) {
r = switch_root(switch_root_dir); r = switch_root(switch_root_dir);
if (r < 0) if (r < 0)

View File

@ -267,9 +267,10 @@ static int prepare_new_root(void) {
} }
static int pivot_to_new_root(void) { static int pivot_to_new_root(void) {
int fd; if (chdir("/run/initramfs") < 0) {
log_error("Failed to change directory to /run/initramfs: %m");
chdir("/run/initramfs"); return -errno;
}
/* /*
In case some evil process made "/" MS_SHARED In case some evil process made "/" MS_SHARED
@ -288,18 +289,11 @@ static int pivot_to_new_root(void) {
} }
chroot("."); chroot(".");
log_info("Successfully changed into root pivot.");
fd = open("/dev/console", O_RDWR);
if (fd < 0)
log_error("Failed to open /dev/console: %m");
else {
make_stdio(fd);
/* Initialize the controlling terminal */
setsid(); setsid();
ioctl(STDIN_FILENO, TIOCSCTTY, NULL); make_console_stdio();
}
log_info("Successfully changed into root pivot.");
return 0; return 0;
} }

View File

@ -2940,7 +2940,8 @@ int make_stdio(int fd) {
int make_null_stdio(void) { int make_null_stdio(void) {
int null_fd; int null_fd;
if ((null_fd = open("/dev/null", O_RDWR|O_NOCTTY)) < 0) null_fd = open("/dev/null", O_RDWR|O_NOCTTY);
if (null_fd < 0)
return -errno; return -errno;
return make_stdio(null_fd); return make_stdio(null_fd);
@ -5844,3 +5845,23 @@ void warn_melody(void) {
ioctl(fd, KIOCSOUND, 0); ioctl(fd, KIOCSOUND, 0);
close_nointr_nofail(fd); close_nointr_nofail(fd);
} }
int make_console_stdio(void) {
int fd, r;
/* Make /dev/console the controlling terminal and stdin/stdout/stderr */
fd = acquire_terminal("/dev/console", false, true, true, (usec_t) -1);
if (fd < 0) {
log_error("Failed to acquire terminal: %s", strerror(-fd));
return fd;
}
r = make_stdio(fd);
if (r < 0) {
log_error("Failed to duplicate terminal fd: %s", strerror(-r));
return r;
}
return 0;
}

View File

@ -278,6 +278,7 @@ char *format_timespan(char *buf, size_t l, usec_t t);
int make_stdio(int fd); int make_stdio(int fd);
int make_null_stdio(void); int make_null_stdio(void);
int make_console_stdio(void);
unsigned long long random_ull(void); unsigned long long random_ull(void);