From owner-freebsd-bugs@FreeBSD.ORG Fri Jan 2 12:50:13 2004 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 1440D16A4CF for ; Fri, 2 Jan 2004 12:50:13 -0800 (PST) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5A3D743D41 for ; Fri, 2 Jan 2004 12:50:08 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) i02Ko8FR085244 for ; Fri, 2 Jan 2004 12:50:08 -0800 (PST) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.10/8.12.10/Submit) id i02Ko87a085243; Fri, 2 Jan 2004 12:50:08 -0800 (PST) (envelope-from gnats) Resent-Date: Fri, 2 Jan 2004 12:50:08 -0800 (PST) Resent-Message-Id: <200401022050.i02Ko87a085243@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Alexander Melkov Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id DCBE116A4CE for ; Fri, 2 Jan 2004 12:49:47 -0800 (PST) Received: from www.freebsd.org (www.freebsd.org [216.136.204.117]) by mx1.FreeBSD.org (Postfix) with ESMTP id ABA3E43D45 for ; Fri, 2 Jan 2004 12:49:46 -0800 (PST) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.12.10/8.12.10) with ESMTP id i02KnkdL053772 for ; Fri, 2 Jan 2004 12:49:46 -0800 (PST) (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.12.10/8.12.10/Submit) id i02Knkmn053771; Fri, 2 Jan 2004 12:49:46 -0800 (PST) (envelope-from nobody) Message-Id: <200401022049.i02Knkmn053771@www.freebsd.org> Date: Fri, 2 Jan 2004 12:49:46 -0800 (PST) From: Alexander Melkov To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-2.0 Subject: misc/60834: ftpd send_data()+oldway: anonymous transfer not logged if client drops conn. [patch] X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Jan 2004 20:50:13 -0000 >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@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: