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