patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
		
			
				
	
	
		
			135 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Index: contrib/lukemftpd/src/ftpcmd.y
 | |
| ===================================================================
 | |
| --- contrib/lukemftpd/src/ftpcmd.y	(revision 186403)
 | |
| +++ contrib/lukemftpd/src/ftpcmd.y	(working copy)
 | |
| @@ -1363,8 +1363,12 @@
 | |
|  
 | |
|  /*
 | |
|   * getline - a hacked up version of fgets to ignore TELNET escape codes.
 | |
| + *	`s' is the buffer to read into.
 | |
| + *	`n' is the 1 less than the size of the buffer, to allow trailing NUL
 | |
| + *	`iop' is the FILE to read from.
 | |
| + *	Returns 0 on success, -1 on EOF, -2 if the command was too long.
 | |
|   */
 | |
| -char *
 | |
| +int
 | |
|  getline(char *s, int n, FILE *iop)
 | |
|  {
 | |
|  	int c;
 | |
| @@ -1379,7 +1383,7 @@
 | |
|  			if (ftpd_debug)
 | |
|  				syslog(LOG_DEBUG, "command: %s", s);
 | |
|  			tmpline[0] = '\0';
 | |
| -			return(s);
 | |
| +			return(0);
 | |
|  		}
 | |
|  		if (c == 0)
 | |
|  			tmpline[0] = '\0';
 | |
| @@ -1418,11 +1422,25 @@
 | |
|  		    }
 | |
|  		}
 | |
|  		*cs++ = c;
 | |
| -		if (--n <= 0 || c == '\n')
 | |
| +		if (--n <= 0) {
 | |
| +			/*
 | |
| +			 * If command doesn't fit into buffer, discard the
 | |
| +			 * rest of the command and indicate truncation.
 | |
| +			 * This prevents the command to be split up into
 | |
| +			 * multiple commands.
 | |
| +			 */
 | |
| +			if (ftpd_debug)
 | |
| +				syslog(LOG_DEBUG,
 | |
| +				    "command too long, last char: %d", c);
 | |
| +			while (c != '\n' && (c = getc(iop)) != EOF)
 | |
| +				continue;
 | |
| +			return (-2);
 | |
| +		}
 | |
| +		if (c == '\n')
 | |
|  			break;
 | |
|  	}
 | |
|  	if (c == EOF && cs == s)
 | |
| -		return (NULL);
 | |
| +		return (-1);
 | |
|  	*cs++ = '\0';
 | |
|  	if (ftpd_debug) {
 | |
|  		if ((curclass.type != CLASS_GUEST &&
 | |
| @@ -1444,7 +1462,7 @@
 | |
|  			syslog(LOG_DEBUG, "command: %.*s", len, s);
 | |
|  		}
 | |
|  	}
 | |
| -	return (s);
 | |
| +	return (0);
 | |
|  }
 | |
|  
 | |
|  void
 | |
| @@ -1458,15 +1476,20 @@
 | |
|  void
 | |
|  ftp_loop(void)
 | |
|  {
 | |
| +	int ret;
 | |
|  
 | |
|  	while (1) {
 | |
|  		(void) alarm(curclass.timeout);
 | |
| -		if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
 | |
| +		ret = getline(cbuf, sizeof(cbuf)-1, stdin);
 | |
| +		(void) alarm(0);
 | |
| +		if (ret == -1) {
 | |
|  			reply(221, "You could at least say goodbye.");
 | |
|  			dologout(0);
 | |
| +		} else if (ret == -2) {
 | |
| +			reply(500, "Command too long.");
 | |
| +		} else {
 | |
| +			ftp_handle_line(cbuf);
 | |
|  		}
 | |
| -		(void) alarm(0);
 | |
| -		ftp_handle_line(cbuf);
 | |
|  	}
 | |
|  	/*NOTREACHED*/
 | |
|  }
 | |
| Index: contrib/lukemftpd/src/extern.h
 | |
| ===================================================================
 | |
| --- contrib/lukemftpd/src/extern.h	(revision 186403)
 | |
| +++ contrib/lukemftpd/src/extern.h	(working copy)
 | |
| @@ -139,7 +139,7 @@
 | |
|  void	format_path(char *, const char *);
 | |
|  int	ftpd_pclose(FILE *);
 | |
|  FILE   *ftpd_popen(char *[], const char *, int);
 | |
| -char   *getline(char *, int, FILE *);
 | |
| +int	getline(char *, int, FILE *);
 | |
|  void	init_curclass(void);
 | |
|  void	logxfer(const char *, off_t, const char *, const char *,
 | |
|  	    const struct timeval *, const char *);
 | |
| Index: contrib/lukemftpd/src/ftpd.c
 | |
| ===================================================================
 | |
| --- contrib/lukemftpd/src/ftpd.c	(revision 186403)
 | |
| +++ contrib/lukemftpd/src/ftpd.c	(working copy)
 | |
| @@ -1,4 +1,4 @@
 | |
| -/*	$NetBSD: ftpd.c,v 1.176 2006/05/09 20:18:06 mrg Exp $	*/
 | |
| +/*	$NetBSD: ftpd.c,v 1.187 2008/09/13 03:30:35 lukem Exp $	*/
 | |
|  
 | |
|  /*
 | |
|   * Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
 | |
| @@ -2896,6 +2896,7 @@
 | |
|  handleoobcmd()
 | |
|  {
 | |
|  	char *cp;
 | |
| +	int ret;
 | |
|  
 | |
|  	if (!urgflag)
 | |
|  		return (0);
 | |
| @@ -2904,9 +2905,14 @@
 | |
|  	if (!transflag)
 | |
|  		return (0);
 | |
|  	cp = tmpline;
 | |
| -	if (getline(cp, sizeof(tmpline), stdin) == NULL) {
 | |
| +	ret = getline(cp, sizeof(tmpline)-1, stdin);
 | |
| +	if (ret == -1) {
 | |
|  		reply(221, "You could at least say goodbye.");
 | |
|  		dologout(0);
 | |
| +	} else if (ret == -2) {
 | |
| +		/* Ignore truncated command */
 | |
| +		/* XXX: abort xfer with "500 command too long", & return 1 ? */
 | |
| +		return 0;
 | |
|  	}
 | |
|  		/*
 | |
|  		 * Manually parse OOB commands, because we can't
 |