From nobody  Tue Feb  9 13:39:24 1999
Received: (from nobody@localhost)
          by hub.freebsd.org (8.8.8/8.8.8) id NAA11115;
          Tue, 9 Feb 1999 13:39:24 -0800 (PST)
          (envelope-from nobody)
Message-Id: <199902092139.NAA11115@hub.freebsd.org>
Date: Tue, 9 Feb 1999 13:39:24 -0800 (PST)
From: hansen@cmu.edu
To: freebsd-gnats-submit@freebsd.org
Subject: rsh hangs when called by system() from process with eleven open files.
X-Send-Pr-Version: www-1.0

>Number:         9986
>Category:       bin
>Synopsis:       rsh hangs when called by system() from process with eleven open files.
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    des
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Feb  9 13:40:00 PST 1999
>Closed-Date:    Wed Feb 10 10:38:20 PST 1999
>Last-Modified:  Wed Feb 10 10:38:51 PST 1999
>Originator:     Jeffery Hansen
>Release:        3.0
>Organization:
Carnegie Mellon University
>Environment:
FreeBSD gadoid.ices.cmu.edu 3.0-RELEASE FreeBSD 3.0-RELEASE #0:
Mon Dec  7 09:56:02 EST 1998     
hansen@gadoid.ices.cmu.edu:/usr/src/sys/compile/SAWAKO  i386

>Description:
When rsh is invoked using system(), the call to system() will hang
indefinately if too many (eleven or more in addition to stdin, etc.)
files are open.  More specifically the problem occurs when fewer than
three of the file descriptors in the range 0-15 are unused.


>How-To-Repeat:
   for (i = 0;i < 11;i++)           /* OK if 10 or lower */
      fopen("/dev/null","r");

   system("rsh foo.bar.org any-command");

>Fix:
The problem appears to be the hard-coded value of 16 for nfds in the
calls to select() in rsh.c.  This needs to be fixed to reflect the
actual values of the file descriptors selected on.

>Release-Note:
>Audit-Trail:
State-Changed-From-To: open->feedback 
State-Changed-By: des 
State-Changed-When: Wed Feb 10 05:35:27 PST 1999 
State-Changed-Why:  
Patch sent to originator. 


Responsible-Changed-From-To: freebsd-bugs->des 
Responsible-Changed-By: des 
Responsible-Changed-When: Wed Feb 10 05:35:27 PST 1999 
Responsible-Changed-Why:  
I'm handling it. 

From: Dag-Erling Smorgrav <des@flood.ping.uio.no>
To: hansen@cmu.edu
Cc: freebsd-gnats-submit@FreeBSD.ORG
Subject: Re: bin/9986: rsh hangs when called by system() from process with eleven open files.
Date: 10 Feb 1999 14:37:04 +0100

 hansen@cmu.edu writes:
 > The problem appears to be the hard-coded value of 16 for nfds in the
 > calls to select() in rsh.c.  This needs to be fixed to reflect the
 > actual values of the file descriptors selected on.
 
 Let me know if the attached patch fixes the bug.
 
 DES
 -- 
 Dag-Erling Smorgrav - des@flood.ping.uio.no
 
 Index: rsh.c
 ===================================================================
 RCS file: /home/ncvs/src/usr.bin/rsh/rsh.c,v
 retrieving revision 1.16
 diff -u -r1.16 rsh.c
 --- rsh.c	1998/10/09 06:47:57	1.16
 +++ rsh.c	1999/02/10 13:35:21
 @@ -45,7 +45,7 @@
  	"$Id: rsh.c,v 1.16 1998/10/09 06:47:57 markm Exp $";
  #endif /* not lint */
  
 -#include <sys/types.h>
 +#include <sys/param.h>
  #include <sys/signal.h>
  #include <sys/socket.h>
  #include <sys/ioctl.h>
 @@ -332,7 +332,7 @@
  	fd_set readfrom, ready, rembits;
  	char *bp, buf[BUFSIZ];
  	struct timeval tvtimeout;
 -	int srval;
 +	int nfds, srval;
  
  	if (!nflag && pid == 0) {
  		(void)close(rfd2);
 @@ -345,7 +345,8 @@
  rewrite:
  		FD_ZERO(&rembits);
  		FD_SET(rem, &rembits);
 -		if (select(16, 0, &rembits, 0, 0) < 0) {
 +		nfds = rem + 1;
 +		if (select(nfds, 0, &rembits, 0, 0) < 0) {
  			if (errno != EINTR)
  				err(1, "select");
  			goto rewrite;
 @@ -382,12 +383,13 @@
  	FD_ZERO(&readfrom);
  	FD_SET(rfd2, &readfrom);
  	FD_SET(rem, &readfrom);
 +	nfds = MAX(rfd2+1, rem+1);
  	do {
  		ready = readfrom;
  		if (timeout) {
 -			srval = select(16, &ready, 0, 0, &tvtimeout);
 +			srval = select(nfds, &ready, 0, 0, &tvtimeout);
  		} else {
 -			srval = select(16, &ready, 0, 0, 0);
 +			srval = select(nfds, &ready, 0, 0, 0);
  		}
  
  		if (srval < 0) {
State-Changed-From-To: feedback->closed 
State-Changed-By: des 
State-Changed-When: Wed Feb 10 10:38:20 PST 1999 
State-Changed-Why:  
Fixed, thanks. 
>Unformatted:
