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.

-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
[EMAIL PROTECTED]                                   http://www.debian.org/



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to