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/14 04:40:53 UTC
svn commit: r604093 - in /httpd/mod_ftp/trunk: include/mod_ftp.h
modules/ftp/ftp_commands.c modules/ftp/ftp_connection.c
Author: wrowe
Date: Thu Dec 13 19:40:50 2007
New Revision: 604093
URL: http://svn.apache.org/viewvc?rev=604093&view=rev
Log:
convert ->cwd and ->rename_from elements from pointers greedly
allocated from the connection pool into fixed APR_PATH_MAX+1 string
buffers for the life of the connection, avoid incrementally eating memory.
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
Modified: httpd/mod_ftp/trunk/include/mod_ftp.h
URL: http://svn.apache.org/viewvc/httpd/mod_ftp/trunk/include/mod_ftp.h?rev=604093&r1=604092&r2=604093&view=diff
==============================================================================
--- httpd/mod_ftp/trunk/include/mod_ftp.h (original)
+++ httpd/mod_ftp/trunk/include/mod_ftp.h Thu Dec 13 19:40:50 2007
@@ -294,8 +294,8 @@
apr_off_t traffic; /* Total data channel traffic, plus HELP */
/* Command state */
- const char *cwd; /* Directory information */
- const char *rename_from; /* Storage for the RNFR command. */
+ char *cwd; /* APR_PATH_MAX+1 buffer for Current Directory */
+ char *rename_from; /* APR_PATH_MAX+1 buffer for the RNFR command */
int type; /* FTP transmission (TYPE_A/TYPE_I) */
apr_off_t restart_point; /* For data transfers */
int filter_mask; /* Filters required (CRLF, BYTERANGE, etc) */
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=604093&r1=604092&r2=604093&view=diff
==============================================================================
--- httpd/mod_ftp/trunk/modules/ftp/ftp_commands.c (original)
+++ httpd/mod_ftp/trunk/modules/ftp/ftp_commands.c Thu Dec 13 19:40:50 2007
@@ -322,7 +322,7 @@
/* Handle special case where the URI is / */
if (r->uri[0] == '/' && !r->uri[1]) {
- fc->cwd = apr_pstrdup(c->pool, r->uri);
+ apr_cpystrn(fc->cwd, r->uri, APR_PATH_MAX + 1);
if (dconf->readme) {
@@ -371,7 +371,7 @@
response = FTP_REPLY_FILE_NOT_FOUND;
}
else {
- fc->cwd = apr_pstrdup(c->pool, r->parsed_uri.path);
+ apr_cpystrn(fc->cwd, r->parsed_uri.path, APR_PATH_MAX + 1);
if (dconf->readme) {
/* We do not inherit readme messages. If this readme was
@@ -1016,6 +1016,7 @@
char *userpass;
server_rec *ftpserver;
apr_status_t rv;
+ char *tmppath;
ftp_server_config *fsc =
ftp_get_module_config(c->base_server->module_config);
@@ -1024,7 +1025,7 @@
* with each attempt to finish logging in.
*/
c->base_server = fc->orig_server;
- fc->cwd = "/";
+ apr_cpystrn(fc->cwd, "/", APR_PATH_MAX + 1);
/* By this point we have already extracted the arguments, so rewrite
* the original request to not include the password */
@@ -1091,7 +1092,6 @@
if (fsc->docrootenv) {
const char *docroot;
- char *newroot;
/* Invoke a request that forces auth to occur,
* Then check for an fsc->docrootenv that translates
@@ -1107,11 +1107,11 @@
"was empty or not found, using default DocumentRoot",
fsc->docrootenv);
}
- else if (((rv = apr_filepath_merge(&newroot, NULL, docroot,
+ else if (((rv = apr_filepath_merge(&tmppath, NULL, docroot,
APR_FILEPATH_TRUENAME
| APR_FILEPATH_NOTRELATIVE,
c->pool)) != APR_SUCCESS)
- || (rv = APR_ENOTDIR, !ap_is_directory(r->pool, newroot))) {
+ || (rv = APR_ENOTDIR, !ap_is_directory(r->pool, tmppath))) {
ap_log_perror(APLOG_MARK, APLOG_WARNING, rv,
r->pool,
"Warning: Document Root [%s] from FTPDocRootEnv [%s] "
@@ -1119,7 +1119,7 @@
docroot, fsc->docrootenv);
}
else {
- ftpcore->ap_document_root = newroot;
+ ftpcore->ap_document_root = tmppath;
}
ap_destroy_sub_req(rr);
@@ -1137,8 +1137,8 @@
if (rr->finfo.filetype == APR_DIR &&
(rr->status == HTTP_OK ||
rr->status == HTTP_MOVED_PERMANENTLY)) {
-
- fc->cwd = apr_pstrcat(c->pool, userdir, "/", NULL);
+ tmppath = apr_pstrcat(r->pool, userdir, "/", NULL);
+ apr_cpystrn(fc->cwd, tmppath, APR_PATH_MAX + 1);
}
else if (rr->status == HTTP_OK &&
rr->finfo.filetype == APR_NOFILE) {
@@ -1162,7 +1162,8 @@
}
else {
/* The new directory was created. */
- fc->cwd = apr_pstrcat(c->pool, userdir, "/", NULL);
+ tmppath = apr_pstrcat(r->pool, userdir, "/", NULL);
+ apr_cpystrn(fc->cwd, tmppath, APR_PATH_MAX + 1);
ap_log_error(APLOG_MARK, APLOG_INFO|APLOG_NOERRNO,
0, c->base_server, "Created home "
"directory (%s) for user %s",
@@ -1204,7 +1205,7 @@
}
ftpcore->ap_document_root = apr_pstrcat(c->pool,
ftpcore->ap_document_root, userdir, NULL);
- fc->cwd = apr_pstrdup(c->pool, "/");
+ apr_cpystrn(fc->cwd, "/", APR_PATH_MAX + 1);
}
/* Our document_root and cwd are now constructed for the user... */
@@ -2219,7 +2220,6 @@
{
ftp_connection *fc = ftp_get_module_config(r->request_config);
request_rec *rr;
- conn_rec *c = r->connection;
apr_status_t res;
int response;
@@ -2237,7 +2237,7 @@
else if (rr->finfo.filetype != APR_NOFILE) {
fc->response_notes = apr_pstrdup(r->pool, "File exists, ready for "
"destination name");
- fc->rename_from = apr_pstrdup(c->pool, r->filename);
+ apr_cpystrn(fc->rename_from, r->filename, APR_PATH_MAX + 1);
response = FTP_REPLY_PENDING;
}
else {
@@ -2259,7 +2259,7 @@
request_rec *rr;
if ((res = ftp_set_uri(r, arg))) {
- fc->rename_from = NULL;
+ fc->rename_from[0] = '\0';
return res;
}
@@ -2275,7 +2275,7 @@
ap_destroy_sub_req(rr);
/* RNTO *must* be preceeded by RNFR */
- if (fc->rename_from == NULL) {
+ if (fc->rename_from[0] == '\0') {
return FTP_REPLY_BAD_SEQUENCE;
}
@@ -2288,7 +2288,7 @@
response = FTP_REPLY_COMPLETED;
}
- fc->rename_from = NULL;
+ fc->rename_from[0] = '\0';
return response;
}
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=604093&r1=604092&r2=604093&view=diff
==============================================================================
--- httpd/mod_ftp/trunk/modules/ftp/ftp_connection.c (original)
+++ httpd/mod_ftp/trunk/modules/ftp/ftp_connection.c Thu Dec 13 19:40:50 2007
@@ -41,10 +41,16 @@
fc->user = "unknown";
fc->auth = FTP_AUTH_NONE;
fc->prot = FTP_PROT_CLEAR;
- fc->cwd = "/";
fc->type = TYPE_A;
fc->passive_created = -1;
fc->orig_server = c->base_server;
+
+ fc->cwd = apr_palloc(c->pool, APR_PATH_MAX + 1);
+ fc->cwd[0] = '/';
+ fc->cwd[1] = '\0';
+
+ fc->rename_from = apr_palloc(c->pool, APR_PATH_MAX + 1);
+ fc->rename_from[0] = '\0';
fc->cntlsock = ap_get_module_config(c->conn_config, &core_module);
return apr_pool_create(&fc->data_pool, c->pool);