components/proftpd/patches/proftpd-retry.patch
author Tomas Klacko <tomas.klacko@oracle.com>
Thu, 19 Jun 2014 02:03:25 -0700
changeset 1952 edbaa9c65514
parent 1343 a66d36656846
permissions -rw-r--r--
18771389 Update proftpd to 1.3.5 18845170 fix for 17599705 breaks "NLST-a" ("ls -a") of current directory
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1343
a66d36656846 16191277 problem in SERVICE/FTP-SERVER
Tomas Klacko <tomas.klacko@oracle.com>
parents: 554
diff changeset
     1
--- a/src/data.c
a66d36656846 16191277 problem in SERVICE/FTP-SERVER
Tomas Klacko <tomas.klacko@oracle.com>
parents: 554
diff changeset
     2
+++ b/src/data.c
1952
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
     3
@@ -337,6 +337,7 @@ static int data_pasv_open(char *reason, off_t size) {
554
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
     4
 static int data_active_open(char *reason, off_t size) {
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
     5
   conn_t *c;
1952
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
     6
   int bind_port, rev;
554
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
     7
+  int retries = 0;
1343
a66d36656846 16191277 problem in SERVICE/FTP-SERVER
Tomas Klacko <tomas.klacko@oracle.com>
parents: 554
diff changeset
     8
   pr_netaddr_t *bind_addr;
1952
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
     9
   unsigned char *root_revoke = NULL;
554
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
    10
 
1952
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    11
@@ -368,7 +369,9 @@ static int data_active_open(char *reason, off_t size) {
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    12
     bind_port = INPORT_ANY;
1343
a66d36656846 16191277 problem in SERVICE/FTP-SERVER
Tomas Klacko <tomas.klacko@oracle.com>
parents: 554
diff changeset
    13
   }
554
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
    14
 
1952
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    15
-  session.d = pr_inet_create_conn(session.pool, -1, bind_addr, bind_port, TRUE);
554
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
    16
+  for (;;) {
1952
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    17
+    session.d = pr_inet_create_conn(session.pool, -1, bind_addr, bind_port,
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    18
+      TRUE);
554
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
    19
 
1952
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    20
   /* Default remote address to which to connect for an active transfer,
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    21
    * if the client has not specified a different address via PORT/EPRT,
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    22
@@ -416,6 +419,15 @@ static int data_active_open(char *reason, off_t size) {
554
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
    23
 
1952
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    24
   if (pr_inet_connect(session.d->pool, session.d, &session.data_addr,
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    25
       session.data_port) == -1) {
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    26
+
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    27
+    if (session.d->xerrno == EADDRINUSE && retries < 16) {
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    28
+      destroy_pool(session.d->pool);
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    29
+      pr_signals_handle();
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    30
+      /* Wait up to MSL to avoid TIME_WAIT. */
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    31
+      sleep(retries++);
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    32
+      continue;
554
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
    33
+    }
1952
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    34
+
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    35
     pr_log_debug(DEBUG6,
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    36
       "Error connecting to %s#%u for active data transfer: %s",
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    37
       pr_netaddr_get_ipstr(&session.data_addr), session.data_port,
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    38
@@ -427,6 +439,9 @@ static int data_active_open(char *reason, off_t size) {
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    39
     destroy_pool(session.d->pool);
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    40
     session.d = NULL;
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    41
     return -1;
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    42
+  } else
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    43
+    break;
edbaa9c65514 18771389 Update proftpd to 1.3.5
Tomas Klacko <tomas.klacko@oracle.com>
parents: 1343
diff changeset
    44
+
554
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
    45
   }
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
    46
 
0ed48135019d 7095498 Unable to build data connection: Address already in use
Milan Jurik <Milan.Jurik@oracle.com>
parents:
diff changeset
    47
   c = pr_inet_openrw(session.pool, session.d, NULL, PR_NETIO_STRM_DATA,
1343
a66d36656846 16191277 problem in SERVICE/FTP-SERVER
Tomas Klacko <tomas.klacko@oracle.com>
parents: 554
diff changeset
    48