Copy regex unnamed captures to cloned subrequests.

Previously, unnamed regex captures matched in the parent request, were not
available in a cloned subrequest.  Now 3 fields related to unnamed captures
are copied to a cloned subrequest: r->ncaptures, r->captures and
r->captures_data.  Since r->captures cannot be changed by either request after
creating a clone, a new flag r->realloc_captures is introduced to force
reallocation of r->captures.

The issue was reported as a proxy_cache_background_update misbehavior in
http://mailman.nginx.org/pipermail/nginx/2018-December/057251.html.
This commit is contained in:
Roman Arutyunyan 2018-12-11 13:09:00 +03:00
parent 7b7f7c1458
commit 746fba0d79
3 changed files with 15 additions and 1 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -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;