[8.0p1] After the remote ssh command execution, the session does not terminate until an active disconnect

Damien Miller djm at mindrot.org
Tue Aug 20 16:27:16 AEST 2019


On Tue, 20 Aug 2019, Hong Cho wrote:

> Hi,
> 
> We recently upgraded OpenSSH from 7.5p1 to 8.0p1, and received a report
> that there was a behavioral differences where the ssh session did not
> disconnect after a remote background command execution. For example, "ssh
> user at example.com 'tail -f /var/xxx &'
> 
> After looking at the debug logs and comparing the code, it seems there was
> a bug in the portable version during the adaptation of the 1.367 change
> (refactoring) of channels.c.
> 
> The OpenBSD version looks correct, but for the portable version, the exit
> condition of channel_handle_efd_read() didn't get converted correctly, but
> somehow got copy-and-pasted from the rfd version. I couldn't find the
> change history for the portable version, so I can't when/how this happened.
> 
> This should make the "force" condition the same as before the refactoring
> of the portable version of channels.c.
> 
> --- /tmp/tmp.48415.39   2019-08-19 19:24:29.000000000 -0700
> +++ crypto/openssh/channels.c    2019-08-19 19:19:39.000000000 -0700
> @@ -2103,7 +2103,15 @@ channel_handle_efd_read(struct ssh *ssh,
>   ssize_t len;
>   int r, force;
> 
> + force = c->detach_close;
> - force = c->isatty && c->detach_close && c->istate != CHAN_INPUT_CLOSED;

This change wasn't a refactor or a mistake, but an intentional bugfix for
https://bugzilla.mindrot.org/show_bug.cgi?id=2071

Anyway, I don't see any change in behaviour for your testcase between
OpenSSH 7.2 and 8.0 on Linux - they both wait for the tail process to
terminate before dropping the connection. Applying your suggested change
doesn't make any difference either.

The behaviour at close has always been a tricky area and there are
divergences between portable OpenSSH and OpenBSD for a long time, driven
by how more SysV-ish systems like Linux differ from BSDs.

BTW line-by-line change history can be extracted using "git blame"
on a checkout of the portable OpenSSH git tree.

-d


More information about the openssh-unix-dev mailing list