From: William A. Rowe Jr Date: Thu, 22 Dec 2016 18:57:26 +0000 (+0000) Subject: Backports: r1178566 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=750f7852f8192bb32a6ab258af7d9425c207f5f1;p=thirdparty%2Fapache%2Fhttpd.git Backports: r1178566 Submitted by: sf Enforce LimitRequestFieldSize after multiple headers with the same name have been merged. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x-merge-http-strict@1775699 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 400717da69f..5557aba1965 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,9 @@ Changes with Apache 2.2.32 *) Core: reject NULLs in request line or request headers. PR 43039 [Nick Kew] + *) core: Enforce LimitRequestFieldSize after multiple headers with the same + name have been merged. [Stefan Fritsch] + Changes with Apache 2.2.31 *) Correct win32 build issues for mod_proxy exports, OpenSSL 1.0.x headers. diff --git a/server/protocol.c b/server/protocol.c index b96d9c760f4..f0faf0f2613 100644 --- a/server/protocol.c +++ b/server/protocol.c @@ -688,6 +688,23 @@ static int field_name_len(const char *field) return end - field; } +static int table_do_fn_check_lengths(void *r_, const char *key, + const char *value) +{ + request_rec *r = r_; + if (value == NULL || r->server->limit_req_fieldsize >= strlen(value) ) + return 1; + + r->status = HTTP_BAD_REQUEST; + apr_table_setn(r->notes, "error-notes", + apr_pstrcat(r->pool, "Size of a request header field " + "after merging exceeds server limit.
" + "\n
\n",
+                               ap_escape_html(r->pool, key),
+                               "
\n", NULL)); + return 0; +} + AP_DECLARE(void) ap_get_mime_headers_core(request_rec *r, apr_bucket_brigade *bb) { char *last_field = NULL; @@ -867,6 +884,9 @@ AP_DECLARE(void) ap_get_mime_headers_core(request_rec *r, apr_bucket_brigade *bb * field-name, following RFC 2616, 4.2. */ apr_table_compress(r->headers_in, APR_OVERLAP_TABLES_MERGE); + + /* enforce LimitRequestFieldSize for merged headers */ + apr_table_do(table_do_fn_check_lengths, r, r->headers_in, NULL); } AP_DECLARE(void) ap_get_mime_headers(request_rec *r)