aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/http/ngx_http_core_module.c8
-rw-r--r--src/http/ngx_http_request.h4
-rw-r--r--src/http/ngx_http_variables.c4
3 files changed, 15 insertions, 1 deletions
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index c57ec00ce..5e7152f0f 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -2386,6 +2386,14 @@ ngx_http_subrequest(ngx_http_request_t *r,
sr->phase_handler = r->phase_handler;
sr->write_event_handler = ngx_http_core_run_phases;
+#if (NGX_PCRE)
+ sr->ncaptures = r->ncaptures;
+ sr->captures = r->captures;
+ sr->captures_data = r->captures_data;
+ sr->realloc_captures = 1;
+ r->realloc_captures = 1;
+#endif
+
ngx_http_update_location_config(sr);
}
diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h
index 6bfff96ef..fce70efe6 100644
--- a/src/http/ngx_http_request.h
+++ b/src/http/ngx_http_request.h
@@ -499,6 +499,10 @@ struct ngx_http_request_s {
unsigned gzip_vary:1;
#endif
+#if (NGX_PCRE)
+ unsigned realloc_captures:1;
+#endif
+
unsigned proxy:1;
unsigned bypass_cache:1;
unsigned no_cache:1;
diff --git a/src/http/ngx_http_variables.c b/src/http/ngx_http_variables.c
index 2deb9689e..31321b290 100644
--- a/src/http/ngx_http_variables.c
+++ b/src/http/ngx_http_variables.c
@@ -2504,7 +2504,9 @@ ngx_http_regex_exec(ngx_http_request_t *r, ngx_http_regex_t *re, ngx_str_t *s)
if (re->ncaptures) {
len = cmcf->ncaptures;
- if (r->captures == NULL) {
+ if (r->captures == NULL || r->realloc_captures) {
+ r->realloc_captures = 0;
+
r->captures = ngx_palloc(r->pool, len * sizeof(int));
if (r->captures == NULL) {
return NGX_ERROR;