Two patches for OpenSSH 3.1p1 (fwd)
Austin Gonyou
austin at coremetrics.com
Sat Mar 30 07:05:51 EST 2002
I will try the patch later today. What version does this apply to?
On Fri, 2002-03-29 at 12:26, Ben Lindstrom wrote:
>
>
> Can I get people from other platforms to test the waitpid.patch to see
> if it solves hang-on-exit on their platform?
>
> I can confirm Solaris at this moment (but I've not done heavy testing at
> this moment) that is works like a charm (Solaris 7). It handles 'sleep
> 90&' vs 'nohup sleep 90&' correctly (killed, vs left).
>
> thanks.
>
> - Ben
>
> ---------- Forwarded message ----------
> Date: Tue, 26 Mar 2002 22:21:31 +0100 (MET)
> From: Peter Eriksson <peter at ifm.liu.se>
> To: openssh-unix-dev at mindrot.org
> Subject: Two patches for OpenSSH 3.1p1
>
> Please find enclosed two patches for OpenSSH 3.1p1.
>
> The first patch solves a problem where sessions will be left "hanging"
> when you normally exit from a ssh shell (for example by logging out from
> the remote host via "exit" or "logout"). The problem seems to be that
> sshd
> (and some other parts of OpenSSH) doesn't check the return code and
> errno
> from waitpid() for errno == EINTR and thus fails to collect the started
> subprocess correctly. This problem occurs atleast on Solaris 2 and
> UNICOS
> systems but it should probably exist on all other SysV based systems...
> (It doesn't occur all the time so it can be quite hard to test for).
>
> The other patch adds a "-I" command line option to allow sshd to be
> correctly started (and automatically restarted) by "init" (via the
> /etc/inittab file) on systems with a SysV-style "init".
>
> It is *not* sufficent to just use the "-D" (no daemon) flag since that
> doesn't correctly handle log file output, closing of stdin/stdout/stderr
> or the setsid() call to drop the controlling TTY.
>
> Trying to start sshd via inittab and using "-D" will cause sshd to
> terminate if the Console connection (for example if using a serial
> terminal) gets dropped...
>
> --
> Peter Eriksson <peter at ifm.liu.se> Phone: +46 13 28 2786
> Computer Systems Manager/BOFH Cell/GSM: +46 705 18 2786
> Physics Department, Linköping University Room: Building F, F203
> SE-581 83 Linköping, Sweden
> http://www.ifm.liu.se/~peter
>
> ----
>
> diff -r -c openssh-3.1p1/entropy.c openssh-3.1p1-peter/entropy.c
> *** openssh-3.1p1/entropy.c Tue Jan 22 11:57:54 2002
> --- openssh-3.1p1-peter/entropy.c Mon Mar 18 22:00:10 2002
> ***************
> *** 110,118 ****
>
> close(p[0]);
>
> ! if (waitpid(pid, &ret, 0) == -1)
> ! fatal("Couldn't wait for ssh-rand-helper completion: %s",
> strerror(errno));
>
> /* We don't mind if the child exits upon a SIGPIPE */
> if (!WIFEXITED(ret) &&
> --- 110,124 ----
>
> close(p[0]);
>
> ! {
> ! int code;
> !
> ! while ((code = waitpid(pid, &ret, 0)) == -1 && errno == EINTR)
> ! ;
> ! if (code < 0)
> ! fatal("Couldn't wait for ssh-rand-helper completion: %s",
> strerror(errno));
> + }
>
> /* We don't mind if the child exits upon a SIGPIPE */
> if (!WIFEXITED(ret) &&
> Only in openssh-3.1p1/scard: Ssh.bin
> diff -r -c openssh-3.1p1/serverloop.c openssh-3.1p1-peter/serverloop.c
> *** openssh-3.1p1/serverloop.c Fri Feb 8 12:07:17 2002
> --- openssh-3.1p1-peter/serverloop.c Mon Mar 18 22:01:02 2002
> ***************
> *** 673,679 ****
> /* We no longer want our SIGCHLD handler to be called. */
> mysignal(SIGCHLD, SIG_DFL);
>
> ! wait_pid = waitpid(-1, &wait_status, 0);
> if (wait_pid == -1)
> packet_disconnect("wait: %.100s", strerror(errno));
> else if (wait_pid != pid)
> --- 673,681 ----
> /* We no longer want our SIGCHLD handler to be called. */
> mysignal(SIGCHLD, SIG_DFL);
>
> ! while ((wait_pid = waitpid(-1, &wait_status, 0)) < 0 && errno == EINTR)
> ! ;
> !
> if (wait_pid == -1)
> packet_disconnect("wait: %.100s", strerror(errno));
> else if (wait_pid != pid)
> diff -r -c openssh-3.1p1/sftp-int.c openssh-3.1p1-peter/sftp-int.c
> *** openssh-3.1p1/sftp-int.c Wed Feb 13 04:10:33 2002
> --- openssh-3.1p1-peter/sftp-int.c Mon Mar 18 22:02:38 2002
> ***************
> *** 176,183 ****
> strerror(errno));
> _exit(1);
> }
> ! if (waitpid(pid, &status, 0) == -1)
> fatal("Couldn't wait for child: %s", strerror(errno));
> if (!WIFEXITED(status))
> error("Shell exited abormally");
> else if (WEXITSTATUS(status))
> --- 176,192 ----
> strerror(errno));
> _exit(1);
> }
> ! {
> ! int code;
> !
> !
> ! while ((code = waitpid(pid, &status, 0)) == -1 && errno == EINTR)
> ! ;
> !
> ! if (code < 0)
> fatal("Couldn't wait for child: %s", strerror(errno));
> + }
> +
> if (!WIFEXITED(status))
> error("Shell exited abormally");
> else if (WEXITSTATUS(status))
> diff -r -c openssh-3.1p1/sftp.c openssh-3.1p1-peter/sftp.c
> *** openssh-3.1p1/sftp.c Wed Feb 13 04:03:57 2002
> --- openssh-3.1p1-peter/sftp.c Mon Mar 18 22:01:49 2002
> ***************
> *** 246,253 ****
> if (infile != stdin)
> fclose(infile);
>
> ! if (waitpid(sshpid, NULL, 0) == -1)
> fatal("Couldn't wait for ssh process: %s", strerror(errno));
>
> exit(0);
> }
> --- 246,261 ----
> if (infile != stdin)
> fclose(infile);
>
> ! {
> ! int code;
> !
> !
> ! while ((code = waitpid(sshpid, NULL, 0)) == -1 && errno == EINTR)
> ! ;
> !
> ! if (code < 0)
> fatal("Couldn't wait for ssh process: %s", strerror(errno));
> + }
>
> exit(0);
> }
> diff -r -c openssh-3.1p1/ssh-rand-helper.c openssh-3.1p1-peter/ssh-rand-helper.c
> *** openssh-3.1p1/ssh-rand-helper.c Sun Feb 10 08:32:30 2002
> --- openssh-3.1p1-peter/ssh-rand-helper.c Mon Mar 18 22:04:34 2002
> ***************
> *** 389,398 ****
>
> debug3("Time elapsed: %d msec", msec_elapsed);
>
> ! if (waitpid(pid, &status, 0) == -1) {
> error("Couldn't wait for child '%s' completion: %s",
> src->cmdstring, strerror(errno));
> return 0.0;
> }
>
> RAND_add(&status, sizeof(&status), 0.0);
> --- 389,406 ----
>
> debug3("Time elapsed: %d msec", msec_elapsed);
>
> ! {
> ! int code;
> !
> ! while ((code = waitpid(pid, &status, 0)) == -1 && errno == EINTR)
> ! ;
> !
> ! if (code < 0)
> ! {
> error("Couldn't wait for child '%s' completion: %s",
> src->cmdstring, strerror(errno));
> return 0.0;
> + }
> }
>
> RAND_add(&status, sizeof(&status), 0.0);
> diff -r -c openssh-3.1p1/sshd.c openssh-3.1p1-peter/sshd.c
> *** openssh-3.1p1/sshd.c Tue Mar 5 02:31:30 2002
> --- openssh-3.1p1-peter/sshd.c Mon Mar 18 22:03:37 2002
> ***************
> *** 264,273 ****
> main_sigchld_handler(int sig)
> {
> int save_errno = errno;
> ! int status;
>
> ! while (waitpid(-1, &status, WNOHANG) > 0)
> ! ;
>
> signal(SIGCHLD, main_sigchld_handler);
> errno = save_errno;
> --- 264,274 ----
> main_sigchld_handler(int sig)
> {
> int save_errno = errno;
> ! int status, code;
>
> !
> ! while ((code = waitpid(-1, &status, WNOHANG)) < 0 && errno == EINTR || code > 0)
> ! ;
>
> signal(SIGCHLD, main_sigchld_handler);
> errno = save_errno;
--
Austin Gonyou
Systems Architect, CCNA
Coremetrics, Inc.
Phone: 512-698-7250
email: austin at coremetrics.com
"It is the part of a good shepherd to shear his flock, not to skin it."
Latin Proverb
More information about the openssh-unix-dev
mailing list