Commit acf79dc1 authored by Ruediger Pluem's avatar Ruediger Pluem
Browse files

* Prevent Header edit from processing only the first header it should

  edit and deleting the remaining ones by iterating over all headers
  with the same name.

PR: 45333


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@674000 13f79535-47bb-0310-9956-ffa450edef68
parent a6753c19
Loading
Loading
Loading
Loading
+5 −0
Changes for CHANGES: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -2,6 +2,11 @@
Changes with Apache 2.3.0
[ When backported to 2.2.x, remove entry from this file ]


  *) mod_headers: Prevent Header edit from processing only the first header
     of possibly multiple headers with the same name and deleting the
     remaining ones. PR 45333.  [Ruediger Pluem]

  *) mod_auth_digest: Detect during startup when AuthDigestProvider
     is configured to use an incompatible provider via AuthnProviderAlias.
     PR 45196 [Eric Covener] 
+33 −4
Changes for modules/metadata/mod_headers.c: 33 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -133,6 +133,13 @@ typedef struct {
    header_entry *hdr;
} echo_do;

/* edit_do is used for Header edit to iterate through the request headers */
typedef struct {
    apr_pool_t *p;
    header_entry *hdr;
    apr_table_t *t;
} edit_do;

/*
 * headers_conf is our per-module configuration. This is used as both
 * a per-dir and per-server config
@@ -578,6 +585,22 @@ static int echo_header(echo_do *v, const char *key, const char *val)
    return 1;
}

static int edit_header(void *v, const char *key, const char *val)
{
    edit_do *ed = (edit_do *)v;

    apr_table_addn(ed->t, key, process_regexp(ed->hdr, val, ed->p));
    return 1;
}

static int add_them_all(void *v, const char *key, const char *val)
{
    apr_table_t *headers = (apr_table_t *)v;

    apr_table_addn(headers, key, val);
    return 1;
}

static void do_headers_fixup(request_rec *r, apr_table_t *headers,
                             apr_array_header_t *fixup, int early)
{
@@ -669,10 +692,16 @@ static void do_headers_fixup(request_rec *r, apr_table_t *headers,
                         echo_header, (void *) &v, r->headers_in, NULL);
            break;
        case hdr_edit:
            val = apr_table_get(headers, hdr->header);
            if (val != NULL) {
                apr_table_setn(headers, hdr->header,
                               process_regexp(hdr, val, r->pool));
            if (apr_table_get(headers, hdr->header)) {
                edit_do ed;

                ed.p = r->pool;
                ed.hdr = hdr;
                ed.t = apr_table_make(r->pool, 5);
                apr_table_do(edit_header, (void *) &ed, headers, hdr->header,
                             NULL);
                apr_table_unset(headers, hdr->header);
                apr_table_do(add_them_all, (void *) headers, ed.t, NULL);
            }
            break;
        }