Welcome! Log In Create A New Profile

Advanced

[nginx] Upstream: fixed unexpected inheritance into limit_except...

Maxim Dounin
December 09, 2014 10:54AM
details: http://hg.nginx.org/nginx/rev/cd2abf7e7740
branches:
changeset: 5938:cd2abf7e7740
user: Maxim Dounin <mdounin@mdounin.ru>
date: Tue Dec 09 18:22:31 2014 +0300
description:
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.

diffstat:

src/http/modules/ngx_http_fastcgi_module.c | 15 +++++++++------
src/http/modules/ngx_http_proxy_module.c | 17 ++++++++++-------
src/http/modules/ngx_http_scgi_module.c | 15 +++++++++------
src/http/modules/ngx_http_uwsgi_module.c | 15 +++++++++------
4 files changed, 37 insertions(+), 25 deletions(-)

diffs (126 lines):

diff --git a/src/http/modules/ngx_http_fastcgi_module.c b/src/http/modules/ngx_http_fastcgi_module.c
--- a/src/http/modules/ngx_http_fastcgi_module.c
+++ b/src/http/modules/ngx_http_fastcgi_module.c
@@ -2697,17 +2697,20 @@ ngx_http_fastcgi_merge_loc_conf(ngx_conf
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) {
- clcf->handler = ngx_http_fastcgi_handler;
- }
+ if (clcf->lmt_excpt && clcf->handler == NULL
+ && (conf->upstream.upstream || conf->fastcgi_lengths))
+ {
+ clcf->handler = ngx_http_fastcgi_handler;
}

#if (NGX_PCRE)
diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c
--- a/src/http/modules/ngx_http_proxy_module.c
+++ b/src/http/modules/ngx_http_proxy_module.c
@@ -2991,7 +2991,11 @@ ngx_http_proxy_merge_loc_conf(ngx_conf_t
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,12 +3007,11 @@ ngx_http_proxy_merge_loc_conf(ngx_conf_t
#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) {
- clcf->handler = ngx_http_proxy_handler;
- conf->location = prev->location;
- }
+ 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) {
diff --git a/src/http/modules/ngx_http_scgi_module.c b/src/http/modules/ngx_http_scgi_module.c
--- a/src/http/modules/ngx_http_scgi_module.c
+++ b/src/http/modules/ngx_http_scgi_module.c
@@ -1443,17 +1443,20 @@ ngx_http_scgi_merge_loc_conf(ngx_conf_t
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) {
- clcf->handler = ngx_http_scgi_handler;
- }
+ if (clcf->lmt_excpt && clcf->handler == NULL
+ && (conf->upstream.upstream || conf->scgi_lengths))
+ {
+ clcf->handler = ngx_http_scgi_handler;
}

if (conf->params_source == NULL) {
diff --git a/src/http/modules/ngx_http_uwsgi_module.c b/src/http/modules/ngx_http_uwsgi_module.c
--- a/src/http/modules/ngx_http_uwsgi_module.c
+++ b/src/http/modules/ngx_http_uwsgi_module.c
@@ -1698,7 +1698,11 @@ ngx_http_uwsgi_merge_loc_conf(ngx_conf_t
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,11 +1713,10 @@ ngx_http_uwsgi_merge_loc_conf(ngx_conf_t
#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) {
- clcf->handler = ngx_http_uwsgi_handler;
- }
+ 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);

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Upstream: fixed unexpected inheritance into limit_except...

Maxim Dounin 708 December 09, 2014 10:54AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 219
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready