nginx-0.3.60-RELEASE import
*) Bugfix: a worker process may got caught in an endless loop while an
error redirection; the bug had appeared in 0.3.59.
diff --git a/docs/xml/nginx/changes.xml b/docs/xml/nginx/changes.xml
index a210750..d2b7921 100644
--- a/docs/xml/nginx/changes.xml
+++ b/docs/xml/nginx/changes.xml
@@ -9,6 +9,23 @@
<title lang="en">nginx changelog</title>
+<changes ver="0.3.60" date="18.08.2006">
+
+<change type="bugfix">
+<para lang="ru">
+×Ï ×ÒÅÍÑ ÐÅÒÅÎÁÐÒÁ×ÌÅÎÉÑ ÏÛÉÂËÉ ÒÁÂÏÞÉÊ ÐÒÏÃÅÓÓ ÍÏÇ ÚÁÃÉËÌÉÔØÓÑ;
+ÏÛÉÂËÁ ÐÏÑ×ÉÌÁÓØ × 0.3.59.
+</para>
+<para lang="en">
+a worker process may got caught in an endless loop
+while an error redirection;
+bug appeared in 0.3.59.
+</para>
+</change>
+
+</changes>
+
+
<changes ver="0.3.59" date="16.08.2006">
<change type="feature">
diff --git a/src/core/nginx.h b/src/core/nginx.h
index 224fb70..1d417fe 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -8,7 +8,7 @@
#define _NGINX_H_INCLUDED_
-#define NGINX_VER "nginx/0.3.59"
+#define NGINX_VER "nginx/0.3.60"
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index b289317..5c19167 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -507,7 +507,7 @@
r->valid_location = 1;
r->uri_changed = 1;
- r->phase = (r == r->main) ? NGX_HTTP_POST_READ_PHASE:
+ r->phase = (!r->internal) ? NGX_HTTP_POST_READ_PHASE:
NGX_HTTP_SERVER_REWRITE_PHASE;
r->phase_handler = 0;
@@ -1324,6 +1324,15 @@
{
ngx_http_core_srv_conf_t *cscf;
+ r->uri_changes--;
+
+ if (r->uri_changes == 0) {
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
+ "rewrite or internal redirection cycle");
+ ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
+ return NGX_DONE;
+ }
+
r->uri = *uri;
if (args) {
@@ -1338,7 +1347,8 @@
"internal redirect: \"%V?%V\"", uri, &r->args);
if (ngx_http_set_exten(r) != NGX_OK) {
- return NGX_HTTP_INTERNAL_SERVER_ERROR;
+ ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
+ return NGX_DONE;
}
/* clear the modules contexts */
@@ -1351,8 +1361,6 @@
r->internal = 1;
- r->uri_changes--;
-
ngx_http_handler(r);
return NGX_DONE;
diff --git a/src/http/ngx_http_special_response.c b/src/http/ngx_http_special_response.c
index abdf624..a44c51c 100644
--- a/src/http/ngx_http_special_response.c
+++ b/src/http/ngx_http_special_response.c
@@ -312,6 +312,7 @@
}
r->headers_out.status = error;
+ r->err_status = error;
if (r->keepalive != 0) {
switch (error) {
@@ -340,7 +341,7 @@
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
- if (clcf->error_pages) {
+ if (r->uri_changes && clcf->error_pages) {
err_page = clcf->error_pages->elts;