You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by wr...@apache.org on 2007/12/13 02:42:42 UTC

svn commit: r603800 - in /httpd/mod_ftp/trunk: include/mod_ftp.h modules/ftp/ftp_commands.c modules/ftp/ftp_connection.c modules/ftp/ftp_data_connection.c

Author: wrowe
Date: Wed Dec 12 17:42:34 2007
New Revision: 603800

URL: http://svn.apache.org/viewvc?rev=603800&view=rev
Log:
Implement a single data connection-scoped data_pool, to prevent
memory exhaustion from repeated data connections.

(See also r603706, a premature commit of data_conn references.)

Modified:
    httpd/mod_ftp/trunk/include/mod_ftp.h
    httpd/mod_ftp/trunk/modules/ftp/ftp_commands.c
    httpd/mod_ftp/trunk/modules/ftp/ftp_connection.c
    httpd/mod_ftp/trunk/modules/ftp/ftp_data_connection.c

Modified: httpd/mod_ftp/trunk/include/mod_ftp.h
URL: http://svn.apache.org/viewvc/httpd/mod_ftp/trunk/include/mod_ftp.h?rev=603800&r1=603799&r2=603800&view=diff
==============================================================================
--- httpd/mod_ftp/trunk/include/mod_ftp.h (original)
+++ httpd/mod_ftp/trunk/include/mod_ftp.h Wed Dec 12 17:42:34 2007
@@ -301,6 +301,7 @@
     int filter_mask;          /* Filters required (CRLF, BYTERANGE, etc) */
 
     /* Data channel state */
+    apr_pool_t *data_pool;    /* Child of c->pool reset on every data cmd */
     int all_epsv;             /* EPSV ALL command issued (refuse all others) */
     apr_socket_t *csock;      /* The local data socket we connect/accept on */
     apr_socket_t *datasock;   /* The remote data socket we send/recv on */

Modified: httpd/mod_ftp/trunk/modules/ftp/ftp_commands.c
URL: http://svn.apache.org/viewvc/httpd/mod_ftp/trunk/modules/ftp/ftp_commands.c?rev=603800&r1=603799&r2=603800&view=diff
==============================================================================
--- httpd/mod_ftp/trunk/modules/ftp/ftp_commands.c (original)
+++ httpd/mod_ftp/trunk/modules/ftp/ftp_commands.c Wed Dec 12 17:42:34 2007
@@ -1951,12 +1951,12 @@
     }
 
     rv = apr_sockaddr_info_get(&fc->clientsa, ip_addr, APR_INET,
-                               port, 0, fc->datapool);
+                               port, 0, fc->data_pool);
 
     if (!fc->clientsa || rv) {
         ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                       "Couldn't resolve remote socket address %s"
-                      " (apr or socket stack bug?)", ip_address);
+                      " (apr or socket stack bug?)", ip_addr);
         apr_socket_close(s);
         return FTP_REPLY_CANNOT_OPEN_DATACONN;
     }

Modified: httpd/mod_ftp/trunk/modules/ftp/ftp_connection.c
URL: http://svn.apache.org/viewvc/httpd/mod_ftp/trunk/modules/ftp/ftp_connection.c?rev=603800&r1=603799&r2=603800&view=diff
==============================================================================
--- httpd/mod_ftp/trunk/modules/ftp/ftp_connection.c (original)
+++ httpd/mod_ftp/trunk/modules/ftp/ftp_connection.c Wed Dec 12 17:42:34 2007
@@ -32,11 +32,11 @@
  *
  * Returns: nothing 
  */
-static void initialize_ftp_connection(conn_rec *c, ftp_connection *fc)
+static apr_status_t initialize_ftp_connection(conn_rec *c, ftp_connection *fc)
 {
     /* The ftp_connection structure is calloc'ed so only initalize
-     * the members that we need to. */
-
+     * the members that we need to.
+     */
     fc->connection       = c;
     fc->user             = "unknown";
     fc->auth             = FTP_AUTH_NONE;
@@ -44,9 +44,10 @@
     fc->cwd              = "/";
     fc->type             = TYPE_A;
     fc->passive_created  = -1;
-
     fc->orig_server      = c->base_server;
-    fc->cntlsock = ap_get_module_config(c->conn_config, &core_module);
+
+    fc->cntlsock  = ap_get_module_config(c->conn_config, &core_module);
+    return apr_pool_create(&fc->data_pool, c->pool);
 }
 
 /* ftp_ssl_init: Fakes a read on the SSL filters to force initialization.
@@ -104,7 +105,7 @@
     /* Check if a login message has been configured */
     if (fsc->banner_message) {
         if (fsc->banner_message_isfile) {
-            rv = ftp_show_file(c->output_filters, c->pool, 
+            rv = ftp_show_file(c->output_filters, fc->data_pool, 
                                FTP_REPLY_SERVICE_READY, fc, 
                                fsc->banner_message);
             if (rv != APR_SUCCESS) {
@@ -117,7 +118,7 @@
             ftp_message_generate(fc, fsc->banner_message,
                                  outbuf, sizeof(outbuf));
 
-            rv = ftp_reply(fc, c->output_filters, c->pool,
+            rv = ftp_reply(fc, c->output_filters, fc->data_pool,
                            FTP_REPLY_SERVICE_READY, 1, outbuf); 
 
             if (rv != APR_SUCCESS) {
@@ -126,7 +127,8 @@
         }
     }
 
-    rv = ftp_reply(fc, c->output_filters, c->pool, FTP_REPLY_SERVICE_READY, 0,
+    rv = ftp_reply(fc, c->output_filters, fc->data_pool,
+                   FTP_REPLY_SERVICE_READY, 0,
                    "%s FTP Server (%s) ready.",
                    c->base_server->server_hostname,
                    ap_get_server_version());
@@ -157,14 +159,19 @@
         ftp_get_module_config(c->base_server->module_config);
 
     if (!fsc->enabled) {
-        return DECLINED;
+        return OK;
     }
 
     /*
      * Allocate for FTP connection structure, and initialize 
      */
     fc = apr_pcalloc(c->pool, sizeof(*fc));
-    initialize_ftp_connection(c, fc);
+    if ((rv = initialize_ftp_connection(c, fc)) != APR_SUCCESS) {
+        /* Failure creating the data subpool */
+        ap_log_error(APLOG_MARK, APLOG_CRIT, rv, c->base_server,
+                     "Failure initializing FTP connection pool.");
+        return OK;
+    }
 
     /* Check for implicit security on the control connection */
     if (!fsc->implicit_ssl) {

Modified: httpd/mod_ftp/trunk/modules/ftp/ftp_data_connection.c
URL: http://svn.apache.org/viewvc/httpd/mod_ftp/trunk/modules/ftp/ftp_data_connection.c?rev=603800&r1=603799&r2=603800&view=diff
==============================================================================
--- httpd/mod_ftp/trunk/modules/ftp/ftp_data_connection.c (original)
+++ httpd/mod_ftp/trunk/modules/ftp/ftp_data_connection.c Wed Dec 12 17:42:34 2007
@@ -35,6 +35,7 @@
     }
     fc->clientsa = NULL;
     fc->passive_created = -1;
+    apr_pool_clear(fc->data_pool);
 }
 
 /*
@@ -109,7 +110,7 @@
         }
 
         /* activity on client socket, attempt an accept() */
-        rv = apr_socket_accept(&s, fc->csock, c->pool);
+        rv = apr_socket_accept(&s, fc->csock, fc->data_pool);
 
         res = apr_socket_close(fc->csock);
         fc->csock = NULL;
@@ -247,8 +248,9 @@
                 core_net_rec *net = f->ctx;
                 apr_bucket *e;
 
-                net->in_ctx = apr_pcalloc(f->c->pool, sizeof(*net->in_ctx));
-                net->in_ctx->b = apr_brigade_create(f->c->pool, f->c->bucket_alloc);
+                net->in_ctx = apr_pcalloc(fc->data_pool, sizeof(*net->in_ctx));
+                net->in_ctx->b = apr_brigade_create(fc->data_pool,
+                                                    f->c->bucket_alloc);
                 net->in_ctx->tmpbb = 
                     apr_brigade_create(net->in_ctx->b->p,
                                        net->in_ctx->b->bucket_alloc);