From owner-freebsd-bugs Wed Jul 19 11:40:20 2000 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (Postfix) with ESMTP id 4A41F37BF92 for ; Wed, 19 Jul 2000 11:40:01 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.3/8.9.2) id LAA75142; Wed, 19 Jul 2000 11:40:01 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from mail.site.uottawa.ca (mail.site.uottawa.ca [137.122.24.142]) by hub.freebsd.org (Postfix) with ESMTP id C2E4F37BFFE for ; Wed, 19 Jul 2000 11:32:20 -0700 (PDT) (envelope-from Keith.White@site.uottawa.ca) Received: (from kwhite@localhost) by mail.site.uottawa.ca (8.9.3/8.9.3) id OAA22009; Wed, 19 Jul 2000 14:32:14 -0400 (EDT) Message-Id: <200007191832.OAA22009@mail.site.uottawa.ca> Date: Wed, 19 Jul 2000 14:32:14 -0400 (EDT) From: kwhite@uottawa.ca Reply-To: kwhite@uottawa.ca To: FreeBSD-gnats-submit@freebsd.org X-Send-Pr-Version: 3.2 Subject: bin/20042: "rsh -t" doesn't timeout if rcmd(3) never returns [patch included] Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >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