Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Nov 2003 15:07:50 +0300 (MSK)
From:      Andrey Beresovsky <and@rsu.ru>
To:        FreeBSD-gnats-submit@FreeBSD.org
Cc:        os@rsu.ru
Subject:   bin/59285: [PATCH] /usr/libexec/ftpd has broken ASCII transfer type implementation
Message-ID:  <200311141207.hAEC7oeq001271@moon.cc.rsu.ru>
Resent-Message-ID: <200311141210.hAECAHSt015348@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         59285
>Category:       bin
>Synopsis:       [PATCH] /usr/libexec/ftpd has broken ASCII transfer type implementation
>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:   Fri Nov 14 04:10:16 PST 2003
>Closed-Date:
>Last-Modified:
>Originator:     Andrey Beresovsky
>Release:        FreeBSD 5.1-CURRENT i386
>Organization:
Rostov State University
>Environment:
System: FreeBSD 5.1-CURRENT #2: Fri Nov 7 22:15:49 MSK 2003 i386

>Description:
According to RFC 959 (FILE TRANSFER PROTOCOL) for ASCII transfer type "the <CRLF> sequence
should be used where necessary to denote the end of a line of text" (Chapter 3.1.1.1.).

ftpd server implements ASCII transfer type by inserting <CR> before each <LF> without 
checking that may be <CR> allready exists. It leads to <CR><CR><LF> sequences in 
files which allready had <CR><LF> end of lines (ex.: text files from Windows systems).

Attached patch should fix this problem.

This problem also exists in lukemftp and lukemftpd. I sent PR with patches to NetBSD.
See http://www.NetBSD.org/cgi-bin/query-pr-single.pl?number=23435.

>How-To-Repeat:
1. Create a text file with <CR><LF> end of lines.
2. Receive (GET) this file from FreeBSD ftpd server.
3. You'll get a file with <CR><CR><LF> EOLs on windows and <CRLF> on unixes.

>Fix:
(ftpd.c rev. 1.146)

--- ftpd.c.orig	Thu Nov 13 23:29:54 2003
+++ ftpd.c	Thu Nov 13 23:33:14 2003
@@ -1971,6 +1971,7 @@
 send_data(FILE *instr, FILE *outstr, off_t blksize, off_t filesize, int isreg)
 {
 	int c, filefd, netfd;
+	int d = '\0';
 	char *buf;
 	off_t cnt;
 
@@ -1982,12 +1983,13 @@
 			if (recvurg)
 				goto got_oob;
 			byte_count++;
-			if (c == '\n') {
+			if (c == '\n' && d != '\r') {
 				if (ferror(outstr))
 					goto data_err;
 				(void) putc('\r', outstr);
 			}
 			(void) putc(c, outstr);
+			d = c;
 		}
 		if (recvurg)
 			goto got_oob;
>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200311141207.hAEC7oeq001271>