tag 441471 + upstream
forwarded 441471 bugs.proftpd.org
thanks
http://bugs.proftpd.org/attachment.cgi?id=2639&action=view and also
http://bugs.proftpd.org/show_bug.cgi?id=2863
to be checked
On Sun, Sep 09, 2007 at 07:58:29PM -0700, Steve Langasek wrote:
> Package: proftpd
> Version: 1.3.0-24
> Severity: important
> Tags: ipv6
>
> I've run into an issue where, only when using ipv6, apt's ftp download
> method fails to download Packages files from my proftpd-based ftp server.
>
> The reason it fails is as follows:
>
> - because the connection is IPv6, the client issues an EPSV command
> - proftpd opens a socket in response, and sends the port number to the
> client
> - the client connects to the socket
> - the client then issues a RETR command for a non-existent file (I have no
> Packages.bz2 on this server)
> - the server sends back a 550 No such file or directory
> - the client closes the data socket
> - the server does NOT close the data socket, or check that the client has
> done so
> - the client issues a second EPSV request
> - the server returns the same port number as before, believing that its
> existing fd is still valid
> - the client makes a second connection to the server
> - the server never calls accept() for this second connection
> - the client issues a second RETR command
> - the server sends the file back to the client using sendfile() on the
> previously opened socket, which fails at the TCP level with a RST (but the
> sendfile() call appears to succeed)
> - the client sits around waiting for a file it will never receive
>
> So the difference between the behavior of PASV and EPSV seems to be at lines
> 3012-3016 of modules/mod_core.c:core_pasv():
>
> /* If we already have a passive listen data connection open, kill it. */
> if (session.d) {
> pr_inet_close(session.d->pool, session.d);
> session.d = NULL;
> }
>
> There is no corresponding code in the core_epsv() implementation, resulting
> in this problem that nothing checks for the validity of the socket before
> reusing it, and no code exists to accept a second connection on an existing
> socket.
>
> The following naive patch addresses the problem for me, but is probably not
> a correct solution wrt the rest of the code (e.g., there are other possible
> unhandled errors in cmd_pre_xfer), so I have not tagged this bug 'patch'.
>
> --- /tmp/oXwn00RfyV/proftpd-dfsg-1.3.0/modules/mod_xfer.c 2007-04-24
> 05:39:22.000000000 -0700
> +++ /tmp/38tFBn2aXl/proftpd-dfsg-1.3.0/modules/mod_xfer.c 2007-09-09
> 19:24:39.000000000 -0700
> @@ -1570,6 +1570,7 @@
> if (!dir ||
> !dir_check(cmd->tmp_pool, cmd->argv[0], cmd->group, dir, NULL)) {
> pr_response_add_err(R_550, "%s: %s", cmd->arg, strerror(errno));
> + pr_data_close(FALSE);
> return ERROR(cmd);
> }
>
> I have also confirmed this behavior with other ipv6-capable ftp clients, so
> it doesn't appear to be a question of a buggy client.
>
--
Francesco P. Lovergine
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]