Upstream: fixed unexpected inheritance into limit_except blocks.

The proxy_pass directive and other handlers are not expected to be inherited
into nested locations, but there is a special code to inherit upstream
handlers into limit_except blocks, as well as a configuration into if{}
blocks.  This caused incorrect behaviour in configurations with nested
locations and limit_except blocks, like this:

    location / {
        proxy_pass http://u;

        location /inner/ {
            # no proxy_pass here

            limit_except GET {
                # nothing
            }
        }
    }

In such a configuration the limit_except block inside "location /inner/"
unexpectedly used proxy_pass defined in "location /", while it shouldn't.
Fix is to avoid inheritance of conf->upstream.upstream (and
conf->proxy_lengths) into locations which don't have noname flag.
This commit is contained in:
Maxim Dounin 2014-12-09 18:22:31 +03:00
parent c863e1b3b5
commit 8d7c6491fe
4 changed files with 37 additions and 25 deletions

View File

@ -2697,18 +2697,21 @@ ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
return NGX_CONF_ERROR;
}
if (conf->upstream.upstream == NULL && conf->fastcgi_lengths == NULL) {
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
if (clcf->noname
&& conf->upstream.upstream == NULL && conf->fastcgi_lengths == NULL)
{
conf->upstream.upstream = prev->upstream.upstream;
conf->fastcgi_lengths = prev->fastcgi_lengths;
conf->fastcgi_values = prev->fastcgi_values;
}
if (conf->upstream.upstream || conf->fastcgi_lengths) {
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
if (clcf->handler == NULL && clcf->lmt_excpt) {
if (clcf->lmt_excpt && clcf->handler == NULL
&& (conf->upstream.upstream || conf->fastcgi_lengths))
{
clcf->handler = ngx_http_fastcgi_handler;
}
}
#if (NGX_PCRE)
if (conf->split_regex == NULL) {

View File

@ -2991,7 +2991,11 @@ ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
return NGX_CONF_ERROR;
}
if (conf->upstream.upstream == NULL && conf->proxy_lengths == NULL) {
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
if (clcf->noname
&& conf->upstream.upstream == NULL && conf->proxy_lengths == NULL)
{
conf->upstream.upstream = prev->upstream.upstream;
conf->vars = prev->vars;
@ -3003,13 +3007,12 @@ ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
#endif
}
if (conf->upstream.upstream || conf->proxy_lengths) {
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
if (clcf->handler == NULL && clcf->lmt_excpt) {
if (clcf->lmt_excpt && clcf->handler == NULL
&& (conf->upstream.upstream || conf->proxy_lengths))
{
clcf->handler = ngx_http_proxy_handler;
conf->location = prev->location;
}
}
if (conf->body_source.data == NULL) {
conf->body_flushes = prev->body_flushes;

View File

@ -1443,18 +1443,21 @@ ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
return NGX_CONF_ERROR;
}
if (conf->upstream.upstream == NULL && conf->scgi_lengths == NULL) {
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
if (clcf->noname
&& conf->upstream.upstream == NULL && conf->scgi_lengths == NULL)
{
conf->upstream.upstream = prev->upstream.upstream;
conf->scgi_lengths = prev->scgi_lengths;
conf->scgi_values = prev->scgi_values;
}
if (conf->upstream.upstream || conf->scgi_lengths) {
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
if (clcf->handler == NULL && clcf->lmt_excpt) {
if (clcf->lmt_excpt && clcf->handler == NULL
&& (conf->upstream.upstream || conf->scgi_lengths))
{
clcf->handler = ngx_http_scgi_handler;
}
}
if (conf->params_source == NULL) {
conf->params = prev->params;

View File

@ -1698,7 +1698,11 @@ ngx_http_uwsgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
return NGX_CONF_ERROR;
}
if (conf->upstream.upstream == NULL && conf->uwsgi_lengths == NULL) {
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
if (clcf->noname
&& conf->upstream.upstream == NULL && conf->uwsgi_lengths == NULL)
{
conf->upstream.upstream = prev->upstream.upstream;
conf->uwsgi_lengths = prev->uwsgi_lengths;
@ -1709,12 +1713,11 @@ ngx_http_uwsgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
#endif
}
if (conf->upstream.upstream || conf->uwsgi_lengths) {
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
if (clcf->handler == NULL && clcf->lmt_excpt) {
if (clcf->lmt_excpt && clcf->handler == NULL
&& (conf->upstream.upstream || conf->uwsgi_lengths))
{
clcf->handler = ngx_http_uwsgi_handler;
}
}
ngx_conf_merge_uint_value(conf->modifier1, prev->modifier1, 0);
ngx_conf_merge_uint_value(conf->modifier2, prev->modifier2, 0);