bin/52072: Wrong behaviour of the ftpd when the OOB data received

Alex Semenyaka alexs at ratmir.ru
Sun May 11 08:30:12 PDT 2003


The following reply was made to PR bin/52072; it has been noted by GNATS.

From: Alex Semenyaka <alexs at ratmir.ru>
To: FreeBSD-gnats-submit at FreeBSD.org, freebsd-bugs at FreeBSD.org
Cc:  
Subject: Re: bin/52072: Wrong behaviour of the ftpd when the OOB data received
Date: Sun, 11 May 2003 19:23:36 +0400

 Small code clean-up. The idea is the same but the code is much more compact.
 New patch:
 
 --- ftpd.c.old	Sun May 11 18:05:55 2003
 +++ ftpd.c	Sun May 11 19:21:10 2003
 @@ -192,4 +192,7 @@
  char	*pid_file = NULL;
  
 +#define NO_ABRT 0
 +#define IS_ABRT 1
 +
  /*
   * Limit number of pathnames that glob can return.
 @@ -247,5 +250,5 @@
  static void	 ack __P((char *));
  static void	 sigurg __P((int));
 -static void	 myoob __P((void));
 +static int	 myoob __P((void));
  static int	 checkuser __P((char *, char *, int, char **));
  static FILE	*dataconn __P((char *, off_t, char *));
 @@ -1979,6 +1982,6 @@
  	case TYPE_A:
  		while ((c = getc(instr)) != EOF) {
 -			if (recvurg)
 -				goto got_oob;
 +			if (recvurg && IS_ABRT == myoob())
 +				return (-1);
  			byte_count++;
  			if (c == '\n') {
 @@ -1989,6 +1992,6 @@
  			(void) putc(c, outstr);
  		}
 -		if (recvurg)
 -			goto got_oob;
 +		if (recvurg && IS_ABRT == myoob())
 +			return (-1);
  		fflush(outstr);
  		transflag = 0;
 @@ -2024,6 +2027,6 @@
  				 */
  				byte_count += cnt;
 -				if (recvurg)
 -					goto got_oob;
 +				if (recvurg && IS_ABRT == myoob())
 +					return (-1);
  				offset += cnt;
  				filesize -= cnt;
 @@ -2077,9 +2080,4 @@
  	return (-1);
  
 -got_oob:
 -	myoob();
 -	recvurg = 0;
 -	transflag = 0;
 -	return (-1);
  }
  
 @@ -2106,12 +2104,12 @@
  	case TYPE_L:
  		while ((cnt = read(fileno(instr), buf, sizeof(buf))) > 0) {
 -			if (recvurg)
 -				goto got_oob;
 +			if (recvurg  && IS_ABRT == myoob())
 +				return (-1);
  			if (write(fileno(outstr), buf, cnt) != cnt)
  				goto file_err;
  			byte_count += cnt;
  		}
 -		if (recvurg)
 -			goto got_oob;
 +		if (recvurg  && IS_ABRT == myoob())
 +			return (-1);
  		if (cnt < 0)
  			goto data_err;
 @@ -2126,6 +2124,6 @@
  	case TYPE_A:
  		while ((c = getc(instr)) != EOF) {
 -			if (recvurg)
 -				goto got_oob;
 +			if (recvurg  && IS_ABRT == myoob())
 +				return (-1);
  			byte_count++;
  			if (c == '\n')
 @@ -2143,6 +2141,6 @@
  	contin2:	;
  		}
 -		if (recvurg)
 -			goto got_oob;
 +		if (recvurg && IS_ABRT == myoob())
 +			return (-1);
  		fflush(outstr);
  		if (ferror(instr))
 @@ -2174,9 +2172,4 @@
  	return (-1);
  
 -got_oob:
 -	myoob();
 -	recvurg = 0;
 -	transflag = 0;
 -	return (-1);
  }
  
 @@ -2633,12 +2626,17 @@
  }
  
 -static void
 +/* Returns IS_ABRT in the case of ABRT */
 +
 +static int
  myoob()
  {
  	char *cp;
 +	int is_abrt = NO_ABRT;
 +
 +	recvurg = 0;
  
  	/* only process if transfer occurring */
  	if (!transflag)
 -		return;
 +		return is_abrt;
  	cp = tmpline;
  	if (getline(cp, 7, stdin) == NULL) {
 @@ -2651,4 +2649,6 @@
  		reply(426, "Transfer aborted. Data connection closed.");
  		reply(226, "Abort successful");
 +		is_abrt = IS_ABRT;
 +		transflag = 0;
  	}
  	if (strcmp(cp, "STAT\r\n") == 0) {
 @@ -2660,4 +2660,5 @@
  			reply(213, "Status: %qd bytes transferred", byte_count);
  	}
 +	return is_abrt;
  }
  
 @@ -3043,10 +3044,6 @@
  			char nbuf[MAXPATHLEN];
  
 -			if (recvurg) {
 -				myoob();
 -				recvurg = 0;
 -				transflag = 0;
 +			if (recvurg && IS_ABRT == myoob())
  				goto out;
 -			}
  
  			if (dir->d_name[0] == '.' && dir->d_namlen == 1)


More information about the freebsd-bugs mailing list