Index: modules/mod_core.c
===================================================================
RCS file: /cvsroot/proftp/proftpd/modules/mod_core.c,v
retrieving revision 1.420
diff -u -r1.420 mod_core.c
--- modules/mod_core.c 5 Feb 2012 18:08:56 -0000 1.420
+++ modules/mod_core.c 5 Feb 2012 18:24:16 -0000
@@ -3587,6 +3587,27 @@
}
if (pr_netaddr_get_family(session.c->local_addr) == pr_netaddr_get_family(session.c->remote_addr)) {
+
+#ifdef PR_USE_IPV6
+ if (pr_netaddr_use_ipv6()) {
+ /* Make sure that the family is NOT IPv6, even though the family of the
+ * local and remote ends match. The PASV command cannot be used for
+ * IPv6 addresses (Bug#3745).
+ */
+ if (pr_netaddr_get_family(session.c->local_addr) == AF_INET6) {
+ int xerrno = EPERM;
+
+ pr_log_debug(DEBUG0,
+ "Unable to handle PASV for IPv6 address '%s', rejecting command",
+ pr_netaddr_get_ipstr(session.c->local_addr));
+ pr_response_add_err(R_501, "%s: %s", cmd->argv[0], strerror(xerrno));
+
+ errno = xerrno;
+ return PR_ERROR(cmd);
+ }
+ }
+#endif /* PR_USE_IPV6 */
+
bind_addr = session.c->local_addr;
} else {