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/12 20:15:18 UTC
svn commit: r603706 - /httpd/mod_ftp/trunk/modules/ftp/ftp_commands.c
Author: wrowe
Date: Wed Dec 12 11:15:17 2007
New Revision: 603706
URL: http://svn.apache.org/viewvc?rev=603706&view=rev
Log:
Handle apr_sockaddr_info_get errors consistently.
Modified:
httpd/mod_ftp/trunk/modules/ftp/ftp_commands.c
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=603706&r1=603705&r2=603706&view=diff
==============================================================================
--- httpd/mod_ftp/trunk/modules/ftp/ftp_commands.c (original)
+++ httpd/mod_ftp/trunk/modules/ftp/ftp_commands.c Wed Dec 12 11:15:17 2007
@@ -1376,14 +1376,22 @@
apr_port_t port;
int tries = 0;
- apr_sockaddr_info_get(&sa, bindaddr, bindfamily, 0, 0, c->pool);
+ rv = apr_sockaddr_info_get(&sa, bindaddr, bindfamily, 0, 0, fc->data_pool);
+
+ if (!sa || rv) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
+ "Couldn't resolve local socket address %s (%d)"
+ " (ftp, apr or socket stack bug?)",
+ bindaddr, bindfamily);
+ return FTP_REPLY_CANNOT_OPEN_DATACONN;
+ }
#if APR_MAJOR_VERSION < 1
rv = apr_socket_create_ex(&s, sa->family, SOCK_STREAM,
- APR_PROTO_TCP, c->pool);
+ APR_PROTO_TCP, fc->data_pool);
#else
rv = apr_socket_create(&s, sa->family, SOCK_STREAM,
- APR_PROTO_TCP, c->pool);
+ APR_PROTO_TCP, fc->data_pool);
#endif
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ERR, rv, c->base_server,
@@ -1704,7 +1712,7 @@
return FTP_REPLY_BAD_SEQUENCE;
}
- arg_tok = apr_pstrdup(c->pool, arg);
+ arg_tok = apr_pstrdup(fc->data_pool, arg);
if ((res = ftp_eprt_decode(&family, &ip_addr, &port, arg_tok))
!= FTP_REPLY_COMMAND_OK) {
fc->response_notes = apr_pstrdup(r->pool, "Invalid EPRT request");
@@ -1723,9 +1731,11 @@
#endif
#if APR_MAJOR_VERSION < 1
- rv = apr_socket_create_ex(&s, family, SOCK_STREAM, APR_PROTO_TCP, c->pool);
+ rv = apr_socket_create_ex(&s, family, SOCK_STREAM, APR_PROTO_TCP,
+ fc->data_pool);
#else
- rv = apr_socket_create(&s, family, SOCK_STREAM, APR_PROTO_TCP, c->pool);
+ rv = apr_socket_create(&s, family, SOCK_STREAM, APR_PROTO_TCP,
+ fc->data_pool);
#endif
if (rv != APR_SUCCESS) {
@@ -1734,7 +1744,7 @@
return FTP_REPLY_CANNOT_OPEN_DATACONN;
}
- sa = apr_palloc(c->pool, sizeof(apr_sockaddr_t));
+ sa = apr_palloc(fc->data_pool, sizeof(apr_sockaddr_t));
memcpy(sa, c->local_addr, sizeof(apr_sockaddr_t));
sa->next = NULL;
if (sa->family == APR_INET)
@@ -1771,17 +1781,17 @@
}
rv = apr_sockaddr_info_get(&fc->clientsa, ip_addr, family,
- port, 0, c->pool);
- if (rv) {
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, c->base_server,
- "Unable to decode EPRT request |%d|%s|%d|",
+ port, 0, fc->data_pool);
+ if (!fc->clientsa || rv) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, c->base_server,
+ "Unable to resolve EPRT address of |%d|%s|%d|",
#if APR_HAVE_IPV6
(family == APR_INET6) ? 2 : 1, ip_addr, port);
#else
1, ip_addr, port);
#endif
fc->response_notes = apr_pstrdup(r->pool,
- "Invalid EPRT command, unable to decode request");
+ "Invalid EPRT command, unable to resolve request");
apr_socket_close(s);
return FTP_REPLY_SYNTAX_ERROR;
}
@@ -1842,7 +1852,7 @@
return FTP_REPLY_SYNTAX_ERROR;
}
- ip_addr = apr_psprintf(c->pool, "%d.%d.%d.%d",
+ ip_addr = apr_psprintf(fc->data_pool, "%d.%d.%d.%d",
val[0], val[1], val[2], val[3]);
port = ((val[4] << 8) + val[5]);
@@ -1877,9 +1887,11 @@
#endif
#if APR_MAJOR_VERSION < 1
- rv = apr_socket_create_ex(&s, APR_INET, SOCK_STREAM, APR_PROTO_TCP, c->pool);
+ rv = apr_socket_create_ex(&s, APR_INET, SOCK_STREAM, APR_PROTO_TCP,
+ fc->data_pool);
#else
- rv = apr_socket_create(&s, APR_INET, SOCK_STREAM, APR_PROTO_TCP, c->pool);
+ rv = apr_socket_create(&s, APR_INET, SOCK_STREAM, APR_PROTO_TCP,
+ fc->data_pool);
#endif
if (rv != APR_SUCCESS) {
@@ -1898,24 +1910,25 @@
}
if (c->local_addr->family == APR_INET) {
- apr_sockaddr_info_get(&sa, c->local_ip, APR_INET,
- local_port, 0, c->pool);
- if (!sa) {
+ rv = apr_sockaddr_info_get(&sa, c->local_ip, APR_INET,
+ local_port, 0, fc->data_pool);
+ if (!sa || rv) {
ap_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r,
"Couldn't resolve explicit local socket address"
- " (apr or socket stack bug?) Retrying");
- apr_sockaddr_info_get(&sa, NULL, APR_INET,
- local_port, 0, c->pool);
+ " %s (apr or socket stack bug?) Retrying",
+ c->local_ip);
+ rv = apr_sockaddr_info_get(&sa, NULL, APR_INET,
+ local_port, 0, fc->data_pool);
}
}
else {
- apr_sockaddr_info_get(&sa, NULL, APR_INET,
- local_port, 0, c->pool);
+ rv = apr_sockaddr_info_get(&sa, NULL, APR_INET,
+ local_port, 0, fc->data_pool);
}
- if (!sa) {
+ if (!sa || rv) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
- "Couldn't resolve local socket address"
+ "Couldn't resolve emphemeral local socket address"
" (apr or socket stack bug?) Giving up");
apr_socket_close(s);
return FTP_REPLY_CANNOT_OPEN_DATACONN;
@@ -1937,8 +1950,16 @@
return FTP_REPLY_CANNOT_OPEN_DATACONN;
}
- apr_sockaddr_info_get(&fc->clientsa, ip_addr, APR_INET,
- port, 0, c->pool);
+ rv = apr_sockaddr_info_get(&fc->clientsa, ip_addr, APR_INET,
+ port, 0, fc->datapool);
+
+ 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_socket_close(s);
+ return FTP_REPLY_CANNOT_OPEN_DATACONN;
+ }
fc->response_notes = apr_psprintf(r->pool, FTP_MSG_SUCCESS, r->method);
fc->csock = s;