Subject: Re: rfc2228 in ftpd
To: Tomas Svensson <>
From: Aidan Cully <>
List: tech-security
Date: 06/24/2002 07:20:59
On Mon, Jun 24, 2002 at 10:22:11AM +0200, Tomas Svensson wrote:
> Sunday, June 23, 2002, 5:59:52 PM, you wrote:
> AC> fflush is unnecessary with the sec_file structure...  We're using
> AC> read()s and write()s directly, so we have control over the buffering
> AC> strategy.  ferror may be a problem...  It needs investigation.
> How is this buffering strategy, send everything when you get a
> newline? Then implementing a sec_fflush would be better.

I check if we're sending commands or data, and use the appropriate
buffering strategy.  You'll notice in the sec_fwrite routine in
	if ((f->mode & SEC_OPEN_CMD) != 0) {
	    if (sec_send_cmd(f) < 0)
		return -1;
	} else {
	    if (f->buffer.used == f->buffer.size && sec_send_data(f) < 0)
		return -1;
sec_send_cmd looks for the newline, and calls f-> against a
line at a time.  f->, in this case, points to sec_server_io(),
which knows about the 631, 632, and 633 reply codes.

> Also, is there any buffering at all when not using encryption? From
> sec_fwrite:
>     if(f->io.prot == PROT_CLEAR)
>         return (*f->>io, data, length); 

Yes, on data...  It looks like I may have overlooked command buffers
when I wrote that, but the simple fix is to change
if (f->io.prot == PROT_CLEAR)
if ((f->mode & SEC_OPEN_CMD) == 0 && f->io.prot == PROT_CLEAR)
.  For data, f-> points to a routine named 'datawrite' in
ftpd.c, which handles buffering and ratelimiting I/O.  Using this
structure is how I was able to get rid of those
/* XXXLUKEM: rate limit ascii send */ comments...  Everything
eventually gets to datawrite() (or dataread()) which handles