- djm@cvs.openbsd.org 2010/08/12 21:49:44
[ssh.c] close any extra file descriptors inherited from parent at start and reopen stdin/stdout to /dev/null when forking for ControlPersist. prevents tools that fork and run a captive ssh for communication from failing to exit when the ssh completes while they wait for these fds to close. The inherited fds may persist arbitrarily long if a background mux master has been started by ControlPersist. cvs and scp were effected by this. "please commit" markus@
This commit is contained in:
parent
aa74f6754a
commit
00d9ae26db
13
ChangeLog
13
ChangeLog
|
@ -3,6 +3,19 @@
|
||||||
openbsd-compat/openbsd-compat.h openbsd-compat/strptime.c] Add strptime to
|
openbsd-compat/openbsd-compat.h openbsd-compat/strptime.c] Add strptime to
|
||||||
the compat library which helps on platforms like old IRIX. Based on work
|
the compat library which helps on platforms like old IRIX. Based on work
|
||||||
by djm, tested by Tom Christensen.
|
by djm, tested by Tom Christensen.
|
||||||
|
- OpenBSD CVS Sync
|
||||||
|
- djm@cvs.openbsd.org 2010/08/12 21:49:44
|
||||||
|
[ssh.c]
|
||||||
|
close any extra file descriptors inherited from parent at start and
|
||||||
|
reopen stdin/stdout to /dev/null when forking for ControlPersist.
|
||||||
|
|
||||||
|
prevents tools that fork and run a captive ssh for communication from
|
||||||
|
failing to exit when the ssh completes while they wait for these fds to
|
||||||
|
close. The inherited fds may persist arbitrarily long if a background
|
||||||
|
mux master has been started by ControlPersist. cvs and scp were effected
|
||||||
|
by this.
|
||||||
|
|
||||||
|
"please commit" markus@
|
||||||
|
|
||||||
20100812
|
20100812
|
||||||
- (tim) [regress/login-timeout.sh regress/reconfigure.sh regress/reexec.sh
|
- (tim) [regress/login-timeout.sh regress/reconfigure.sh regress/reexec.sh
|
||||||
|
|
19
ssh.c
19
ssh.c
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: ssh.c,v 1.345 2010/08/04 05:42:47 djm Exp $ */
|
/* $OpenBSD: ssh.c,v 1.346 2010/08/12 21:49:44 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -237,6 +237,12 @@ main(int ac, char **av)
|
||||||
__progname = ssh_get_progname(av[0]);
|
__progname = ssh_get_progname(av[0]);
|
||||||
init_rng();
|
init_rng();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Discard other fds that are hanging around. These can cause problem
|
||||||
|
* with backgrounded ssh processes started by ControlPersist.
|
||||||
|
*/
|
||||||
|
closefrom(STDERR_FILENO + 1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save the original real uid. It will be needed later (uid-swapping
|
* Save the original real uid. It will be needed later (uid-swapping
|
||||||
* may clobber the real uid).
|
* may clobber the real uid).
|
||||||
|
@ -898,6 +904,7 @@ static void
|
||||||
control_persist_detach(void)
|
control_persist_detach(void)
|
||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
int devnull;
|
||||||
|
|
||||||
debug("%s: backgrounding master process", __func__);
|
debug("%s: backgrounding master process", __func__);
|
||||||
|
|
||||||
|
@ -924,6 +931,16 @@ control_persist_detach(void)
|
||||||
/* muxclient() doesn't return on success. */
|
/* muxclient() doesn't return on success. */
|
||||||
fatal("Failed to connect to new control master");
|
fatal("Failed to connect to new control master");
|
||||||
}
|
}
|
||||||
|
if ((devnull = open(_PATH_DEVNULL, O_RDWR)) == -1) {
|
||||||
|
error("%s: open(\"/dev/null\"): %s", __func__,
|
||||||
|
strerror(errno));
|
||||||
|
} else {
|
||||||
|
if (dup2(devnull, STDIN_FILENO) == -1 ||
|
||||||
|
dup2(devnull, STDOUT_FILENO) == -1)
|
||||||
|
error("%s: dup2: %s", __func__, strerror(errno));
|
||||||
|
if (devnull > STDERR_FILENO)
|
||||||
|
close(devnull);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do fork() after authentication. Used by "ssh -f" */
|
/* Do fork() after authentication. Used by "ssh -f" */
|
||||||
|
|
Loading…
Reference in New Issue