components/proftpd/patches/004.proftpd-retry.patch
author Niveditha Rau <Niveditha.Rau@Oracle.COM>
Mon, 24 Oct 2016 18:44:19 -0700
changeset 7205 27c5215213bf
parent 6413 3d1d422367d4
permissions -rw-r--r--
23245623 Deliver folks 0.11.1 in Solaris PSARC/2016/413 GNOME 3 Web Bundle
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6413
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
     1
Source: In-House
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
     2
Reason: Solaris leave socket in TIME_WAIT status
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
     3
Reasonable to upstream?: Not much for Linux.
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
     4
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
     5
Note: This patch do not look "pretty" but its code
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
     6
is re-used from the original patch which colided
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
     7
with the proftpd-1.3.6 code. During proftpd update
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
     8
the binaries were tested on huge # of small files
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
     9
(!passive) it looked good so the original patch was
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    10
removed.
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    11
Now it has returned as regression from supercluster
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    12
testing.
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    13
Final fix of this problem on Solaris will need further
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    14
discussion with community then it will be probably fixed
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    15
by a proftpd update.
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    16
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    17
--- a//src/data.c	2016-03-10 17:04:32.000000000 -0800
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    18
+++ b/src/data.c	2016-06-23 05:41:37.547107933 -0700
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    19
@@ -337,6 +337,7 @@
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    20
 static int data_active_open(char *reason, off_t size) {
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    21
   conn_t *c;
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    22
   int bind_port, rev;
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    23
+  int retries = 0;
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    24
   pr_netaddr_t *bind_addr;
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    25
   unsigned char *root_revoke = NULL;
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    26
 
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    27
@@ -384,6 +385,7 @@
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    28
     }
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    29
   }
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    30
 
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    31
+  for(;;) { /* begin of endless loop */
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    32
   session.d = pr_inet_create_conn(session.pool, -1, bind_addr, bind_port, TRUE);
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    33
   if (session.d == NULL) {
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    34
     int xerrno = errno;
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    35
@@ -425,7 +427,7 @@
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    36
     pr_inet_set_socket_opts(session.d->pool, session.d,
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    37
       (main_server->tcp_rcvbuf_override ? main_server->tcp_rcvbuf_len : 0), 0,
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    38
       main_server->tcp_keepalive);
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    39
-    
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    40
+
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    41
   } else {
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    42
     pr_inet_set_socket_opts(session.d->pool, session.d,
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    43
       0, (main_server->tcp_sndbuf_override ? main_server->tcp_sndbuf_len : 0),
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    44
@@ -442,6 +444,13 @@
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    45
 
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    46
   if (pr_inet_connect(session.d->pool, session.d, &session.data_addr,
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    47
       session.data_port) == -1) {
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    48
+    if (session.d->xerrno == EADDRINUSE && retries < 16) {
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    49
+      destroy_pool(session.d->pool);
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    50
+      pr_signals_handle();
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    51
+      /* Wait up to MSL to avoid TIME_WAIT. */
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    52
+      sleep(retries++);
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    53
+      continue; /* continue in endless loop */
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    54
+    }
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    55
     pr_log_debug(DEBUG6,
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    56
       "Error connecting to %s#%u for active data transfer: %s",
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    57
       pr_netaddr_get_ipstr(&session.data_addr), session.data_port,
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    58
@@ -453,7 +462,8 @@
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    59
     destroy_pool(session.d->pool);
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    60
     session.d = NULL;
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    61
     return -1;
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    62
-  }
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    63
+  } else break; /* finish the endless loop */
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    64
+  } /* end of endless loop */
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    65
 
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    66
   c = pr_inet_openrw(session.pool, session.d, NULL, PR_NETIO_STRM_DATA,
3d1d422367d4 23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff changeset
    67
     session.d->listen_fd, -1, -1, TRUE);