Unverified Commit 70f89aa1 by Christian Brauner Committed by Stéphane Graber

console: fail when we cannot allocate peer tty

There's really no reason not to if it's requested. Signed-off-by: 's avatarChristian Brauner <christian.brauner@ubuntu.com>
parent 4ad9000f
...@@ -415,16 +415,17 @@ void lxc_console_free(struct lxc_conf *conf, int fd) ...@@ -415,16 +415,17 @@ void lxc_console_free(struct lxc_conf *conf, int fd)
} }
} }
static void lxc_console_peer_default(struct lxc_console *console) static int lxc_console_peer_default(struct lxc_console *console)
{ {
struct lxc_tty_state *ts; struct lxc_tty_state *ts;
const char *path = console->path; const char *path = console->path;
int fd;
int ret = 0;
/* if no console was given, try current controlling terminal, there /* If no console was given, try current controlling terminal, there
* won't be one if we were started as a daemon (-d) * won't be one if we were started as a daemon (-d).
*/ */
if (!path && !access("/dev/tty", F_OK)) { if (!path && !access("/dev/tty", F_OK)) {
int fd;
fd = open("/dev/tty", O_RDWR); fd = open("/dev/tty", O_RDWR);
if (fd >= 0) { if (fd >= 0) {
close(fd); close(fd);
...@@ -432,25 +433,29 @@ static void lxc_console_peer_default(struct lxc_console *console) ...@@ -432,25 +433,29 @@ static void lxc_console_peer_default(struct lxc_console *console)
} }
} }
if (!path) if (!path) {
goto out; errno = ENOTTY;
DEBUG("process does not have a controlling terminal");
DEBUG("opening %s for console peer", path);
console->peer = lxc_unpriv(open(path, O_CLOEXEC | O_RDWR | O_CREAT |
O_APPEND, 0600));
if (console->peer < 0)
goto out; goto out;
}
DEBUG("using '%s' as console", path); console->peer = lxc_unpriv(open(path, O_CLOEXEC | O_RDWR | O_CREAT | O_APPEND, 0600));
if (console->peer < 0) {
ERROR("failed to open \"%s\"", path);
return -ENOTTY;
}
DEBUG("using \"%s\" as peer tty device", path);
if (!isatty(console->peer)) if (!isatty(console->peer)) {
goto err1; ERROR("file descriptor for file \"%s\" does not refer to a tty device", path);
goto on_error1;
}
ts = lxc_console_sigwinch_init(console->peer, console->master); ts = lxc_console_sigwinch_init(console->peer, console->master);
console->tty_state = ts; console->tty_state = ts;
if (!ts) { if (!ts) {
WARN("Unable to install SIGWINCH"); WARN("unable to install SIGWINCH handler");
goto err1; goto on_error1;
} }
lxc_console_winsz(console->peer, console->master); lxc_console_winsz(console->peer, console->master);
...@@ -458,23 +463,27 @@ static void lxc_console_peer_default(struct lxc_console *console) ...@@ -458,23 +463,27 @@ static void lxc_console_peer_default(struct lxc_console *console)
console->tios = malloc(sizeof(*console->tios)); console->tios = malloc(sizeof(*console->tios));
if (!console->tios) { if (!console->tios) {
SYSERROR("failed to allocate memory"); SYSERROR("failed to allocate memory");
goto err1; ret = -ENOMEM;
goto on_error1;
} }
if (lxc_setup_tios(console->peer, console->tios) < 0) if (lxc_setup_tios(console->peer, console->tios) < 0)
goto err2; goto on_error2;
else
return; goto out;
err2: on_error2:
free(console->tios); free(console->tios);
console->tios = NULL; console->tios = NULL;
err1: ret = -ENOTTY;
on_error1:
close(console->peer); close(console->peer);
console->peer = -1; console->peer = -1;
ret = -ENOTTY;
out: out:
DEBUG("no console peer"); return ret;
return;
} }
void lxc_console_delete(struct lxc_console *console) void lxc_console_delete(struct lxc_console *console)
...@@ -503,21 +512,24 @@ int lxc_console_create(struct lxc_conf *conf) ...@@ -503,21 +512,24 @@ int lxc_console_create(struct lxc_conf *conf)
int ret; int ret;
if (conf->is_execute) { if (conf->is_execute) {
INFO("no console for lxc-execute."); INFO("not allocating a console device for lxc-execute.");
return 0; return 0;
} }
if (!conf->rootfs.path) if (!conf->rootfs.path) {
INFO("container does not have a rootfs, console device will be shared with the host");
return 0; return 0;
}
if (console->path && !strcmp(console->path, "none")) if (console->path && !strcmp(console->path, "none")) {
INFO("no console requested");
return 0; return 0;
}
process_lock(); process_lock();
ret = openpty(&console->master, &console->slave, ret = openpty(&console->master, &console->slave, console->name, NULL, NULL);
console->name, NULL, NULL);
process_unlock(); process_unlock();
if (ret) { if (ret < 0) {
SYSERROR("failed to allocate a pty"); SYSERROR("failed to allocate a pty");
return -1; return -1;
} }
...@@ -532,17 +544,19 @@ int lxc_console_create(struct lxc_conf *conf) ...@@ -532,17 +544,19 @@ int lxc_console_create(struct lxc_conf *conf)
goto err; goto err;
} }
lxc_console_peer_default(console); ret = lxc_console_peer_default(console);
if (ret < 0) {
ERROR("failed to allocate peer tty device");
goto err;
}
if (console->log_path) { if (console->log_path) {
console->log_fd = lxc_unpriv(open(console->log_path, console->log_fd = lxc_unpriv(open(console->log_path, O_CLOEXEC | O_RDWR | O_CREAT | O_APPEND, 0600));
O_CLOEXEC | O_RDWR |
O_CREAT | O_APPEND, 0600));
if (console->log_fd < 0) { if (console->log_fd < 0) {
SYSERROR("failed to open '%s'", console->log_path); SYSERROR("failed to open console log file \"%s\"", console->log_path);
goto err; goto err;
} }
DEBUG("using '%s' as console log", console->log_path); DEBUG("using \"%s\" as console log file", console->log_path);
} }
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment