summaryrefslogtreecommitdiff
path: root/src/run/run.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2015-10-07 20:10:48 +0200
committerLennart Poettering <lennart@poettering.net>2015-10-07 20:10:48 +0200
commitae3dde801253b1d5f7363bb9fb06bcb230f00eb8 (patch)
treeedf779f1c847b049a0d6b073d2a0eec0934bbc35 /src/run/run.c
parent660021d371d5698a86e914765239045a669e65fb (diff)
machinectl: fix race when opening new shells with "machinectl shell"
Previously, we'd allocate the TTY, spawn a service on it, but immediately start processing the TTY and forwarding it to whatever the commnd was started on. This is however problematic, as the TTY might get actually opened only much later by the service. We'll hence first get EIOs on the master as the other side is still closed, and hence considered it hung up and terminated the session. With this change we add a flag to the pty forwarding logic: PTY_FORWARD_IGNORE_INITIAL_VHANGUP. If set, we'll ignore all hangups (i.e. EIOs) on the master PTY until the first byte is successfully read. From that point on we consider a hangup/EIO a regular connection termination. This way, we handle the race: when we get EIO initially we'll ignore it, until the connection is properly set up, at which time we start honouring it.
Diffstat (limited to 'src/run/run.c')
-rw-r--r--src/run/run.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/run/run.c b/src/run/run.c
index 62687591f4..bb18dd4383 100644
--- a/src/run/run.c
+++ b/src/run/run.c
@@ -828,7 +828,7 @@ static int start_transient_service(
if (!arg_quiet)
log_info("Running as unit %s.\nPress ^] three times within 1s to disconnect TTY.", service);
- r = pty_forward_new(event, master, false, false, &forward);
+ r = pty_forward_new(event, master, PTY_FORWARD_IGNORE_INITIAL_VHANGUP, &forward);
if (r < 0)
return log_error_errno(r, "Failed to create PTY forwarder: %m");