components/proftpd/patches/proftpd-retry.patch
branchs11u1-sru
changeset 2734 d23b6301c400
parent 554 0ed48135019d
child 1952 edbaa9c65514
equal deleted inserted replaced
2719:8a85b880d7f1 2734:d23b6301c400
     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"),
    81 +    } else
    93 +    } else
    82 +      break;
    94 +      break;
    83    }
    95    }
    84  
    96  
    85    c = pr_inet_openrw(session.pool, session.d, NULL, PR_NETIO_STRM_DATA,
    97    c = pr_inet_openrw(session.pool, session.d, NULL, PR_NETIO_STRM_DATA,
       
    98