You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by po...@apache.org on 2010/08/30 18:09:50 UTC
svn commit: r990844 - in /httpd/httpd/trunk: CHANGES server/vhost.c
Author: poirier
Date: Mon Aug 30 16:09:50 2010
New Revision: 990844
URL: http://svn.apache.org/viewvc?rev=990844&view=rev
Log:
Fail startup for vhost configuration problems, rather than
running with a configuration with undefined behavior.
Modified:
httpd/httpd/trunk/CHANGES
httpd/httpd/trunk/server/vhost.c
Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=990844&r1=990843&r2=990844&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Mon Aug 30 16:09:50 2010
@@ -2,6 +2,14 @@
Changes with Apache 2.3.9
+ *) vhosts: Do not allow _default_ in NameVirtualHost, or mixing *
+ and non-* ports on NameVirtualHost, or multiple NameVirtualHost
+ directives for the same address:port, or NameVirtualHost
+ directives with no matching VirtualHosts, or multiple ip-based
+ VirtualHost sections for the same address:port. These were
+ previously accepted with a warning, but the behavior was
+ undefined. [Dan Poirier]
+
*) mod_remoteip: Fix a segfaulti when using mod_remoteip in conjunction with
Allow/Deny. PR 49838. [Andrew Skalski <voltara gmail.com>]
Modified: httpd/httpd/trunk/server/vhost.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/vhost.c?rev=990844&r1=990843&r2=990844&view=diff
==============================================================================
--- httpd/httpd/trunk/server/vhost.c (original)
+++ httpd/httpd/trunk/server/vhost.c Mon Aug 30 16:09:50 2010
@@ -97,6 +97,13 @@ static ipaddr_chain *default_list;
static server_addr_rec *name_vhost_list;
static server_addr_rec **name_vhost_list_tail;
+/* whether a config error was seen */
+static int config_error = 0;
+
+/* config check function */
+static int vhost_check_config(apr_pool_t *p, apr_pool_t *plog,
+ apr_pool_t *ptemp, server_rec *s);
+
/*
* How it's used:
*
@@ -127,6 +134,7 @@ AP_DECLARE(void) ap_init_vhost_config(ap
default_list = NULL;
name_vhost_list = NULL;
name_vhost_list_tail = &name_vhost_list;
+ ap_hook_check_config(vhost_check_config, NULL, NULL, APR_HOOK_MIDDLE);
}
@@ -255,6 +263,11 @@ AP_DECLARE_NONSTD(const char *)ap_set_na
void *dummy,
const char *arg)
{
+ if (0 == strcasecmp(arg, "_default_")
+ || 0 == strncasecmp(arg, "_default_:", 10)) {
+ return "_default_ is not allowed in NameVirtualHost directive";
+ }
+
/* use whatever port the main server has at this point */
return get_addresses(cmd->pool, arg, &name_vhost_list_tail,
cmd->server->port);
@@ -510,9 +523,9 @@ static int add_name_vhost_config(apr_poo
ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_s,
"VirtualHost %s:%u -- mixing * "
"ports and non-* ports with "
- "a NameVirtualHost address is not supported,"
- " proceeding with undefined results",
+ "a NameVirtualHost address is not supported",
sar->virthost, sar->host_port);
+ config_error = 1;
}
return 1;
}
@@ -528,11 +541,12 @@ static void remove_unused_name_vhosts(se
ipaddr_chain *ic = *pic;
if (ic->server == NULL) {
- ap_log_error(APLOG_MARK, APLOG_WARNING, 0, main_s,
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_s,
"Either NameVirtualHost %s:%u has no VirtualHosts,"
" or there is more than one identical NameVirtualHost line,"
" or your VirtualHost declarations do not match the NameVirtualHost line",
ic->sar->virthost, ic->sar->host_port);
+ config_error = 1;
*pic = ic->next;
}
else {
@@ -610,10 +624,10 @@ AP_DECLARE(void) ap_fini_vhost_config(ap
ic = find_default_server(sar->host_port);
if (!ic || !add_name_vhost_config(p, main_s, s, sar, ic)) {
if (ic && ic->sar->host_port != 0) {
- ap_log_error(APLOG_MARK, APLOG_WARNING,
+ ap_log_error(APLOG_MARK, APLOG_ERR,
0, main_s, "_default_ VirtualHost "
- "overlap on port %u, the first has "
- "precedence", sar->host_port);
+ "overlap on port %u", sar->host_port);
+ config_error = 1;
}
ic = new_ipaddr_chain(p, s, sar);
ic->next = default_list;
@@ -633,13 +647,14 @@ AP_DECLARE(void) ap_fini_vhost_config(ap
*iphash_table_tail[bucket] = ic;
}
else if (!add_name_vhost_config(p, main_s, s, sar, ic)) {
- ap_log_error(APLOG_MARK, APLOG_WARNING,
+ ap_log_error(APLOG_MARK, APLOG_ERR,
0, main_s, "VirtualHost %s:%u overlaps "
"with VirtualHost %s:%u, the first has "
"precedence, perhaps you need a "
"NameVirtualHost directive",
sar->virthost, sar->host_port,
ic->sar->virthost, ic->sar->host_port);
+ config_error = 1;
ic->sar = sar;
ic->server = s;
}
@@ -706,6 +721,11 @@ AP_DECLARE(void) ap_fini_vhost_config(ap
}
}
+static int vhost_check_config(apr_pool_t *p, apr_pool_t *plog,
+ apr_pool_t *ptemp, server_rec *s)
+{
+ return config_error ? !OK : OK;
+}
/*****************************************************************************
* run-time vhost matching functions