Date: Wed, 19 Jul 2000 14:32:14 -0400 (EDT) From: kwhite@uottawa.ca To: FreeBSD-gnats-submit@freebsd.org Subject: bin/20042: "rsh -t" doesn't timeout if rcmd(3) never returns [patch included] Message-ID: <200007191832.OAA22009@mail.site.uottawa.ca>
next in thread | raw e-mail | index | archive | help
>Number: 20042
>Category: bin
>Synopsis: "rsh -t" doesn't timeout if rcmd(3) never returns [patch included]
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Jul 19 11:40:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: Keith White
>Release: FreeBSD 4.0-RELEASE i386
>Organization:
SITE, University of Ottawa
>Environment:
Any release up to and including 4.0.
$ ident /usr/bin/rsh
/usr/bin/rsh:
$FreeBSD: src/usr.bin/rsh/rsh.c,v 1.21 2000/02/24 21:06:19 markm Exp $
>Description:
The documentation for rsh(1) leads you to believe that you can use
the "-t" flag to timeout if nothing happens for the specified
number of seconds. This doesn't always work.
The rcmd(3) call will never return if the target machine is in a hung
state. The rsh commmand will wait forever, even with the "-t" flag.
>How-To-Repeat:
Place a machine (server, say) in a hung state. On another machine
(client, say) execute an rsh -t. Notice that the rsh never times out.
client$ rsh -t 60 server
wait...
>Fix:
The following patch fixes the problem. You'll need to add
considerable salt and pepper to taste...
$ ident /usr/src/usr.bin/rsh/rsh.c
/usr/src/usr.bin/rsh/rsh.c:
$FreeBSD: src/usr.bin/rsh/rsh.c,v 1.21 2000/02/24 21:06:19 markm Exp $
---cut here---
*** rsh.c.orig Thu Feb 24 16:06:19 2000
--- rsh.c Wed Jul 19 14:27:01 2000
***************
*** 89,94 ****
--- 89,97 ----
char *copyargs __P((char **));
void sendsig __P((int));
+ #ifndef NOKSW
+ void connect_timeout __P((int));
+ #endif
void talk __P((int, long, pid_t, int, int));
void usage __P((void));
***************
*** 283,290 ****
--- 286,305 ----
&rfd2, family);
}
#else
+ #ifndef NOKSW
+ if (timeout) {
+ signal(SIGALRM, connect_timeout);
+ alarm(timeout);
+ }
+ #endif
rem = rcmd_af(&host, sp->s_port, pw->pw_name, user, args, &rfd2,
family);
+ #ifndef NOKSW
+ if (timeout) {
+ signal(SIGALRM, SIG_DFL);
+ alarm(0);
+ }
+ #endif
#endif
if (rem < 0)
***************
*** 445,450 ****
--- 460,474 ----
}
} while (FD_ISSET(rfd2, &readfrom) || FD_ISSET(rem, &readfrom));
}
+
+ #ifndef NOKSW
+ void
+ connect_timeout(sig)
+ int sig;
+ {
+ errx(1, "timeout reached before connection completed.");
+ }
+ #endif
void
sendsig(sig)
---cut here---
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200007191832.OAA22009>
