1 --- proftpd-1.3.3e/src/data.c Thu Mar 3 09:10:03 2011 |
1 --- a/src/data.c |
2 +++ proftpd-1.3.3e/src/data.c Wed Oct 5 08:07:57 2011 |
2 +++ b/src/data.c |
3 @@ -337,44 +337,55 @@ |
3 @@ -333,6 +333,7 @@ static int data_pasv_open(char *reason, off_t size) { |
4 static int data_active_open(char *reason, off_t size) { |
4 static int data_active_open(char *reason, off_t size) { |
5 conn_t *c; |
5 conn_t *c; |
6 int rev; |
6 int rev; |
7 + int retries = 0; |
7 + int retries = 0; |
|
8 pr_netaddr_t *bind_addr; |
8 |
9 |
9 if (!reason && session.xfer.filename) |
10 if (!reason && session.xfer.filename) |
10 reason = session.xfer.filename; |
11 @@ -348,45 +349,55 @@ static int data_active_open(char *reason, off_t size) { |
|
12 bind_addr = pr_netaddr_v6tov4(session.xfer.p, session.c->local_addr); |
|
13 } |
11 |
14 |
12 - session.d = pr_inet_create_conn(session.pool, NULL, -1, |
15 - session.d = pr_inet_create_conn(session.pool, -1, bind_addr, |
13 - session.c->local_addr, session.c->local_port-1, TRUE); |
16 - session.c->local_port-1, TRUE); |
14 + for (;;) { |
17 + for (;;) { |
15 + session.d = pr_inet_create_conn(session.pool, NULL, -1, |
18 + session.d = pr_inet_create_conn(session.pool, -1, bind_addr, |
16 + session.c->local_addr, session.c->local_port-1, TRUE); |
19 + session.c->local_port-1, TRUE); |
17 |
20 |
18 - /* Set the "stalled" timer, if any, to prevent the connection |
21 - /* Set the "stalled" timer, if any, to prevent the connection |
19 - * open from taking too long |
22 - * open from taking too long |
20 - */ |
23 - */ |
21 - if (timeout_stalled) |
24 - if (timeout_stalled) { |
22 - pr_timer_add(timeout_stalled, PR_TIMER_STALLED, NULL, stalled_timeout_cb, |
25 - pr_timer_add(timeout_stalled, PR_TIMER_STALLED, NULL, stalled_timeout_cb, |
23 - "TimeoutStalled"); |
26 - "TimeoutStalled"); |
|
27 - } |
24 + /* Set the "stalled" timer, if any, to prevent the connection |
28 + /* Set the "stalled" timer, if any, to prevent the connection |
25 + * open from taking too long |
29 + * open from taking too long |
26 + */ |
30 + */ |
27 + if (timeout_stalled) |
31 + if (timeout_stalled) { |
28 + pr_timer_add(timeout_stalled, PR_TIMER_STALLED, NULL, stalled_timeout_cb, |
32 + pr_timer_add(timeout_stalled, PR_TIMER_STALLED, NULL, stalled_timeout_cb, |
29 + "TimeoutStalled"); |
33 + "TimeoutStalled"); |
|
34 + } |
30 |
35 |
31 - rev = pr_netaddr_set_reverse_dns(ServerUseReverseDNS); |
36 - rev = pr_netaddr_set_reverse_dns(ServerUseReverseDNS); |
32 + rev = pr_netaddr_set_reverse_dns(ServerUseReverseDNS); |
37 + rev = pr_netaddr_set_reverse_dns(ServerUseReverseDNS); |
33 |
38 |
34 - /* Protocol and socket options should be set before handshaking. */ |
39 - /* Protocol and socket options should be set before handshaking. */ |
35 + /* Protocol and socket options should be set before handshaking. */ |
40 + /* Protocol and socket options should be set before handshaking. */ |
36 |
41 |
37 - if (session.xfer.direction == PR_NETIO_IO_RD) { |
42 - if (session.xfer.direction == PR_NETIO_IO_RD) { |
38 - pr_inet_set_socket_opts(session.d->pool, session.d, |
43 - pr_inet_set_socket_opts(session.d->pool, session.d, |
39 - (main_server->tcp_rcvbuf_override ? main_server->tcp_rcvbuf_len : 0), 0); |
44 - (main_server->tcp_rcvbuf_override ? main_server->tcp_rcvbuf_len : 0), 0); |
40 - pr_inet_set_proto_opts(session.pool, session.d, main_server->tcp_mss_len, 0, |
|
41 - 0, 1, 1); |
|
42 + if (session.xfer.direction == PR_NETIO_IO_RD) { |
45 + if (session.xfer.direction == PR_NETIO_IO_RD) { |
43 + pr_inet_set_socket_opts(session.d->pool, session.d, |
46 + pr_inet_set_socket_opts(session.d->pool, session.d, |
44 + (main_server->tcp_rcvbuf_override ? main_server->tcp_rcvbuf_len : 0), 0); |
47 + (main_server->tcp_rcvbuf_override ? main_server->tcp_rcvbuf_len : 0), 0); |
45 + pr_inet_set_proto_opts(session.pool, session.d, main_server->tcp_mss_len, 0, |
|
46 + 0, 1, 1); |
|
47 |
48 |
48 - } else { |
49 - } else { |
49 - pr_inet_set_socket_opts(session.d->pool, session.d, |
50 - pr_inet_set_socket_opts(session.d->pool, session.d, |
50 - 0, (main_server->tcp_sndbuf_override ? main_server->tcp_sndbuf_len : 0)); |
51 - 0, (main_server->tcp_sndbuf_override ? main_server->tcp_sndbuf_len : 0)); |
51 - pr_inet_set_proto_opts(session.pool, session.d, main_server->tcp_mss_len, 0, |
|
52 - 0, 1, 1); |
|
53 - } |
52 - } |
54 + } else { |
53 + } else { |
55 + pr_inet_set_socket_opts(session.d->pool, session.d, |
54 + pr_inet_set_socket_opts(session.d->pool, session.d, |
56 + 0, (main_server->tcp_sndbuf_override ? main_server->tcp_sndbuf_len : 0)); |
55 + 0, (main_server->tcp_sndbuf_override ? main_server->tcp_sndbuf_len : 0)); |
57 + pr_inet_set_proto_opts(session.pool, session.d, main_server->tcp_mss_len, 0, |
|
58 + 0, 1, 1); |
|
59 + } |
56 + } |
|
57 |
|
58 - /* Make sure that the necessary socket options are set on the socket prior |
|
59 - * to the call to connect(2). |
|
60 - */ |
|
61 - pr_inet_set_proto_opts(session.pool, session.d, main_server->tcp_mss_len, 0, |
|
62 - IPTOS_THROUGHPUT, 1); |
|
63 - pr_inet_generate_socket_event("core.data-connect", main_server, |
|
64 - session.d->local_addr, session.d->listen_fd); |
|
65 + /* Make sure that the necessary socket options are set on the socket prior |
|
66 + * to the call to connect(2). |
|
67 + */ |
|
68 + pr_inet_set_proto_opts(session.pool, session.d, main_server->tcp_mss_len, 0, |
|
69 + IPTOS_THROUGHPUT, 1); |
|
70 + pr_inet_generate_socket_event("core.data-connect", main_server, |
|
71 + session.d->local_addr, session.d->listen_fd); |
60 |
72 |
61 - if (pr_inet_connect(session.d->pool, session.d, &session.data_addr, |
73 - if (pr_inet_connect(session.d->pool, session.d, &session.data_addr, |
62 + if (pr_inet_connect(session.d->pool, session.d, &session.data_addr, |
74 + if (pr_inet_connect(session.d->pool, session.d, &session.data_addr, |
63 session.data_port) == -1) { |
75 session.data_port) == -1) { |
64 - pr_response_add_err(R_425, _("Unable to build data connection: %s"), |
76 - pr_response_add_err(R_425, _("Unable to build data connection: %s"), |