misc/60834: ftpd send_data()+oldway: anonymous transfer not logged if client drops conn. [patch]

Alexander Melkov melkov at comptek.ru
Fri Jan 2 12:50:13 PST 2004


>Number:         60834
>Category:       misc
>Synopsis:       ftpd send_data()+oldway: anonymous transfer not logged if client drops conn. [patch]
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jan 02 12:50:07 PST 2004
>Closed-Date:
>Last-Modified:
>Originator:     Alexander Melkov
>Release:        4.9-STABLE
>Organization:
>Environment:
FreeBSD melkov.ru 4.9-STABLE FreeBSD 4.9-STABLE #2: Thu Jan  1 08:50:39 MSK 2004     root at melkov.ru:/usr/obj/usr/src/sys/MELKOV  i386
>Description:
Ftpd sends a file using 'oldway' (not sendfile), when sendfile is 
not available, for example, the file is on a mounted nfs or smbfs
filesystem.
If the client ungracefully terminates the connection, ftpd receives a
signal and dies, so the transfer does not appear in /var/log/ftpd.

>How-To-Repeat:
(a)
run /usr/libexec/ftpd -ADllS

create /var/log/ftpd file

Mount a NFS or SMBFS filesystem under anonymous ftp root.
Get a file from that filesystem via some ftp client.
While file transfer is in progress, terminate the ftp client.
See tail /var/log/ftpd

(b)
Look into ftpd.c file
- at send_data() function, label oldway:.
- at lostconn(), sigquit() and dologout() functions.
The problem should be apparent :)

>Fix:
ftpd.c is 1.62.2.51
melkov:/usr/src/libexec/ftpd# diff ftpd.c.orig ftpd.c
222a223,227
> char *xfer_name;           /* to be able to call logxfer() from dologout() */
> off_t xfer_size;
> time_t xfer_start;
> int xfer_log_progress = 0; /* whether transfer is in progress */
> 
264c269
< static void      logxfer __P((char *, off_t, time_t));
---
> static void      logxfer __P((void));
1655a1661,1664
> 	xfer_name = name;
> 	xfer_size = st.st_size;
> 	xfer_start = start;
> 	xfer_log_progress = cmd == 0 && guest && stats;
1657a1667
> 	xfer_log_progress = 0;
1659c1669
< 		logxfer(name, st.st_size, start);
---
> 		logxfer();
2604a2615,2620
> 
> 	if (statfd >= 0 && xfer_log_progress) {
> 		xfer_log_progress = 0;
> 		logxfer();
> 	}
> 
3140,3143c3156
< logxfer(name, size, start)
< 	char *name;
< 	off_t size;
< 	time_t start;
---
> logxfer()
3153,3154c3166,3167
< 			path, name, (long long)size,
< 			(long)(now - start + (now == start)));
---
> 			path, xfer_name, (long long)xfer_size,
> 			(long)(now - xfer_start + (now == xfer_start)));

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list