Skip site navigation (1)Skip section navigation (2)
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>