From 35655e3c45a5c500a54680a40f02962bd1a37887 Mon Sep 17 00:00:00 2001 From: Ian Dowse Date: Tue, 13 Aug 2002 16:25:38 +0000 Subject: [PATCH] If a timeout is specified, make sure that rcmd() completes within the specified time. Previously, rsh could potentially hang indefinitely at this point even when a timeout was set, for example if the server accepts the connection and then never sends any reply. PR: bin/20042 Submitted by: Keith White MFC after: 1 week --- usr.bin/rsh/rsh.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/usr.bin/rsh/rsh.c b/usr.bin/rsh/rsh.c index 394a19b96e36..0b52be417f0b 100644 --- a/usr.bin/rsh/rsh.c +++ b/usr.bin/rsh/rsh.c @@ -93,6 +93,7 @@ int rfd2; int family = PF_UNSPEC; char rlogin[] = "rlogin"; +void connect_timeout(int); char *copyargs(char * const *); void sendsig(int); void talk(int, long, pid_t, int, int); @@ -287,8 +288,16 @@ main(int argc, char *argv[]) &rfd2, family); } #else + if (timeout) { + signal(SIGALRM, connect_timeout); + alarm(timeout); + } rem = rcmd_af(&host, sp->s_port, pw->pw_name, user, args, &rfd2, family); + if (timeout) { + signal(SIGALRM, SIG_DFL); + alarm(0); + } #endif if (rem < 0) @@ -449,6 +458,15 @@ reread: errno = 0; } while (FD_ISSET(rfd2, &readfrom) || FD_ISSET(rem, &readfrom)); } +void +connect_timeout(int sig) +{ + char message[] = "timeout reached before connection completed.\n"; + + write(STDERR_FILENO, message, sizeof(message) - 1); + _exit(1); +} + void sendsig(int sig) {