Skip to content

Commit

Permalink
All known output headers can be linked lists now.
Browse files Browse the repository at this point in the history
The h->next pointer properly provided as NULL in all cases where known
output headers are added.

Note that there are 3rd party modules which might not do this, and it
might be risky to rely on this for arbitrary headers.
  • Loading branch information
mdounin committed May 30, 2022
1 parent bbf8ed4 commit e59c209
Show file tree
Hide file tree
Showing 14 changed files with 25 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/http/modules/ngx_http_auth_basic_module.c
Expand Up @@ -339,6 +339,7 @@ ngx_http_auth_basic_set_realm(ngx_http_request_t *r, ngx_str_t *realm)
*p = '"';

r->headers_out.www_authenticate->hash = 1;
r->headers_out.www_authenticate->next = NULL;
ngx_str_set(&r->headers_out.www_authenticate->key, "WWW-Authenticate");
r->headers_out.www_authenticate->value.data = basic;
r->headers_out.www_authenticate->value.len = len;
Expand Down
1 change: 1 addition & 0 deletions src/http/modules/ngx_http_auth_request_module.c
Expand Up @@ -154,6 +154,7 @@ ngx_http_auth_request_handler(ngx_http_request_t *r)
}

*ho = *h;
ho->next = NULL;

r->headers_out.www_authenticate = ho;
}
Expand Down
1 change: 1 addition & 0 deletions src/http/modules/ngx_http_dav_module.c
Expand Up @@ -1082,6 +1082,7 @@ ngx_http_dav_location(ngx_http_request_t *r)
}

r->headers_out.location->hash = 1;
r->headers_out.location->next = NULL;
ngx_str_set(&r->headers_out.location->key, "Location");

escape = 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len, NGX_ESCAPE_URI);
Expand Down
1 change: 1 addition & 0 deletions src/http/modules/ngx_http_gzip_filter_module.c
Expand Up @@ -280,6 +280,7 @@ ngx_http_gzip_header_filter(ngx_http_request_t *r)
}

h->hash = 1;
h->next = NULL;
ngx_str_set(&h->key, "Content-Encoding");
ngx_str_set(&h->value, "gzip");
r->headers_out.content_encoding = h;
Expand Down
1 change: 1 addition & 0 deletions src/http/modules/ngx_http_gzip_static_module.c
Expand Up @@ -242,6 +242,7 @@ ngx_http_gzip_static_handler(ngx_http_request_t *r)
}

h->hash = 1;
h->next = NULL;
ngx_str_set(&h->key, "Content-Encoding");
ngx_str_set(&h->value, "gzip");
r->headers_out.content_encoding = h;
Expand Down
2 changes: 2 additions & 0 deletions src/http/modules/ngx_http_headers_filter_module.c
Expand Up @@ -362,6 +362,7 @@ ngx_http_set_expires(ngx_http_request_t *r, ngx_http_headers_conf_t *conf)
}

r->headers_out.expires = e;
e->next = NULL;

e->hash = 1;
ngx_str_set(&e->key, "Expires");
Expand Down Expand Up @@ -621,6 +622,7 @@ ngx_http_set_response_header(ngx_http_request_t *r, ngx_http_header_val_t *hv,
}

*old = h;
h->next = NULL;
}

h->hash = 1;
Expand Down
1 change: 1 addition & 0 deletions src/http/modules/ngx_http_memcached_module.c
Expand Up @@ -401,6 +401,7 @@ ngx_http_memcached_process_header(ngx_http_request_t *r)
}

h->hash = 1;
h->next = NULL;
ngx_str_set(&h->key, "Content-Encoding");
ngx_str_set(&h->value, "gzip");
r->headers_out.content_encoding = h;
Expand Down
3 changes: 3 additions & 0 deletions src/http/modules/ngx_http_range_filter_module.c
Expand Up @@ -258,6 +258,7 @@ ngx_http_range_header_filter(ngx_http_request_t *r)
}

r->headers_out.accept_ranges->hash = 1;
r->headers_out.accept_ranges->next = NULL;
ngx_str_set(&r->headers_out.accept_ranges->key, "Accept-Ranges");
ngx_str_set(&r->headers_out.accept_ranges->value, "bytes");

Expand Down Expand Up @@ -427,6 +428,7 @@ ngx_http_range_singlepart_header(ngx_http_request_t *r,
r->headers_out.content_range = content_range;

content_range->hash = 1;
content_range->next = NULL;
ngx_str_set(&content_range->key, "Content-Range");

content_range->value.data = ngx_pnalloc(r->pool,
Expand Down Expand Up @@ -599,6 +601,7 @@ ngx_http_range_not_satisfiable(ngx_http_request_t *r)
r->headers_out.content_range = content_range;

content_range->hash = 1;
content_range->next = NULL;
ngx_str_set(&content_range->key, "Content-Range");

content_range->value.data = ngx_pnalloc(r->pool,
Expand Down
1 change: 1 addition & 0 deletions src/http/modules/ngx_http_static_module.c
Expand Up @@ -195,6 +195,7 @@ ngx_http_static_handler(ngx_http_request_t *r)
}

r->headers_out.location->hash = 1;
r->headers_out.location->next = NULL;
ngx_str_set(&r->headers_out.location->key, "Location");
r->headers_out.location->value.len = len;
r->headers_out.location->value.data = location;
Expand Down
1 change: 1 addition & 0 deletions src/http/modules/perl/nginx.xs
Expand Up @@ -573,6 +573,7 @@ header_out(r, key, value)
}

header->hash = 1;
header->next = NULL;

if (ngx_http_perl_sv2str(aTHX_ r, &header->key, key) != NGX_OK) {
header->hash = 0;
Expand Down
3 changes: 3 additions & 0 deletions src/http/ngx_http_core_module.c
Expand Up @@ -1007,6 +1007,7 @@ ngx_http_core_find_config_phase(ngx_http_request_t *r,
}

r->headers_out.location->hash = 1;
r->headers_out.location->next = NULL;
ngx_str_set(&r->headers_out.location->key, "Location");

if (r->args.len == 0) {
Expand Down Expand Up @@ -1687,6 +1688,7 @@ ngx_http_set_etag(ngx_http_request_t *r)
}

etag->hash = 1;
etag->next = NULL;
ngx_str_set(&etag->key, "ETag");

etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3);
Expand Down Expand Up @@ -1781,6 +1783,7 @@ ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,
}

r->headers_out.location->hash = 1;
r->headers_out.location->next = NULL;
ngx_str_set(&r->headers_out.location->key, "Location");
r->headers_out.location->value = val;

Expand Down
1 change: 1 addition & 0 deletions src/http/ngx_http_script.c
Expand Up @@ -1243,6 +1243,7 @@ ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)
}

r->headers_out.location->hash = 1;
r->headers_out.location->next = NULL;
ngx_str_set(&r->headers_out.location->key, "Location");
r->headers_out.location->value = e->buf;

Expand Down
1 change: 1 addition & 0 deletions src/http/ngx_http_special_response.c
Expand Up @@ -649,6 +649,7 @@ ngx_http_send_error_page(ngx_http_request_t *r, ngx_http_err_page_t *err_page)
}

location->hash = 1;
location->next = NULL;
ngx_str_set(&location->key, "Location");
location->value = uri;

Expand Down
7 changes: 7 additions & 0 deletions src/http/ngx_http_upstream.c
Expand Up @@ -2681,6 +2681,7 @@ ngx_http_upstream_intercept_errors(ngx_http_request_t *r,
}

*h = *u->headers_in.www_authenticate;
h->next = NULL;

r->headers_out.www_authenticate = h;
}
Expand Down Expand Up @@ -5075,6 +5076,7 @@ ngx_http_upstream_copy_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,
if (offset) {
ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset);
*ph = ho;
ho->next = NULL;
}

return NGX_OK;
Expand Down Expand Up @@ -5169,6 +5171,7 @@ ngx_http_upstream_copy_last_modified(ngx_http_request_t *r, ngx_table_elt_t *h,
}

*ho = *h;
ho->next = NULL;

r->headers_out.last_modified = ho;
r->headers_out.last_modified_time =
Expand All @@ -5191,6 +5194,7 @@ ngx_http_upstream_rewrite_location(ngx_http_request_t *r, ngx_table_elt_t *h,
}

*ho = *h;
ho->next = NULL;

if (r->upstream->rewrite_redirect) {
rc = r->upstream->rewrite_redirect(r, ho, 0);
Expand Down Expand Up @@ -5236,6 +5240,7 @@ ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, ngx_table_elt_t *h,
}

*ho = *h;
ho->next = NULL;

if (r->upstream->rewrite_redirect) {

Expand Down Expand Up @@ -5281,6 +5286,7 @@ ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h,
}

*ho = *h;
ho->next = NULL;

if (r->upstream->rewrite_cookie) {
rc = r->upstream->rewrite_cookie(r, ho);
Expand Down Expand Up @@ -5334,6 +5340,7 @@ ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,
}

*ho = *h;
ho->next = NULL;

r->headers_out.accept_ranges = ho;

Expand Down

0 comments on commit e59c209

Please sign in to comment.