From: Stefan Eissing Date: Thu, 5 Jul 2018 10:21:00 +0000 (+0000) Subject: On the trunk: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=96b83022b96ee30736a08a10d9cb714fa7848367;p=apache On the trunk: * silencing gcc uninitialized warning * refrainning from apr_table_addn() use since pool debug assumptions are in conflict * adding more assertions * copy-porting changes to base64 encoding code from mod_md git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1835118 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/http2/h2_bucket_beam.c b/modules/http2/h2_bucket_beam.c index 9f6fa824f6..f79cbe3356 100644 --- a/modules/http2/h2_bucket_beam.c +++ b/modules/http2/h2_bucket_beam.c @@ -775,7 +775,7 @@ static apr_status_t append_bucket(h2_bucket_beam *beam, const char *data; apr_size_t len; apr_status_t status; - int can_beam, check_len; + int can_beam = 0, check_len; if (beam->aborted) { return APR_ECONNABORTED; diff --git a/modules/http2/h2_from_h1.c b/modules/http2/h2_from_h1.c index ae264a9341..dd6ad90302 100644 --- a/modules/http2/h2_from_h1.c +++ b/modules/http2/h2_from_h1.c @@ -164,7 +164,7 @@ static int copy_header(void *ctx, const char *name, const char *value) { apr_table_t *headers = ctx; - apr_table_addn(headers, name, value); + apr_table_add(headers, name, value); return 1; } @@ -250,7 +250,7 @@ static h2_headers *create_response(h2_task *task, request_rec *r) if (r->no_cache && !apr_table_get(r->headers_out, "Expires")) { char *date = apr_palloc(r->pool, APR_RFC822_DATE_LEN); ap_recent_rfc822_date(date, r->request_time); - apr_table_addn(r->headers_out, "Expires", date); + apr_table_add(r->headers_out, "Expires", date); } /* This is a hack, but I can't find anyway around it. The idea is that diff --git a/modules/http2/h2_h2.c b/modules/http2/h2_h2.c index 72e938c029..0e87b03f71 100644 --- a/modules/http2/h2_h2.c +++ b/modules/http2/h2_h2.c @@ -696,7 +696,7 @@ static void check_push(request_rec *r, const char *tag) tag, conf->push_list->nelts); for (i = 0; i < conf->push_list->nelts; ++i) { h2_push_res *push = &APR_ARRAY_IDX(conf->push_list, i, h2_push_res); - apr_table_addn(r->headers_out, "Link", + apr_table_add(r->headers_out, "Link", apr_psprintf(r->pool, "<%s>; rel=preload%s", push->uri_ref, push->critical? "; critical" : "")); } diff --git a/modules/http2/h2_headers.c b/modules/http2/h2_headers.c index f01ab88aab..8b7add6230 100644 --- a/modules/http2/h2_headers.c +++ b/modules/http2/h2_headers.c @@ -116,9 +116,9 @@ h2_headers *h2_headers_create(int status, apr_table_t *headers_in, { h2_headers *headers = apr_pcalloc(pool, sizeof(h2_headers)); headers->status = status; - headers->headers = (headers_in? apr_table_copy(pool, headers_in) + headers->headers = (headers_in? apr_table_clone(pool, headers_in) : apr_table_make(pool, 5)); - headers->notes = (notes? apr_table_copy(pool, notes) + headers->notes = (notes? apr_table_clone(pool, notes) : apr_table_make(pool, 5)); return headers; } @@ -149,8 +149,7 @@ h2_headers *h2_headers_rcreate(request_rec *r, int status, h2_headers *h2_headers_copy(apr_pool_t *pool, h2_headers *h) { - return h2_headers_create(h->status, apr_table_copy(pool, h->headers), - apr_table_copy(pool, h->notes), h->raw_bytes, pool); + return h2_headers_create(h->status, h->headers, h->notes, h->raw_bytes, pool); } h2_headers *h2_headers_die(apr_status_t type, diff --git a/modules/http2/h2_mplx.c b/modules/http2/h2_mplx.c index 05667abe03..0fae117b4f 100644 --- a/modules/http2/h2_mplx.c +++ b/modules/http2/h2_mplx.c @@ -473,6 +473,7 @@ void h2_mplx_release_and_join(h2_mplx *m, apr_thread_cond_t *wait) h2_ihash_iter(m->shold, report_stream_iter, m); } } + ap_assert(m->tasks_active == 0); m->join_wait = NULL; /* 4. close the h2_req_enginge shed */ @@ -762,6 +763,9 @@ apr_status_t h2_mplx_pop_task(h2_mplx *m, h2_task **ptask) apr_status_t rv = APR_EOF; *ptask = NULL; + ap_assert(m); + ap_assert(m->lock); + if (APR_SUCCESS != (rv = apr_thread_mutex_lock(m->lock))) { return rv; } diff --git a/modules/http2/h2_proxy_session.c b/modules/http2/h2_proxy_session.c index 952d24e2bb..996bc659e9 100644 --- a/modules/http2/h2_proxy_session.c +++ b/modules/http2/h2_proxy_session.c @@ -237,7 +237,7 @@ static int before_frame_send(nghttp2_session *ngh2, static int add_header(void *table, const char *n, const char *v) { - apr_table_addn(table, n, v); + apr_table_add(table, n, v); return 1; } @@ -361,7 +361,7 @@ static void h2_proxy_stream_end_headers_out(h2_proxy_stream *stream) } /* create a "Via:" response header entry and merge it */ - apr_table_addn(r->headers_out, "Via", + apr_table_add(r->headers_out, "Via", (session->conf->viaopt == via_full) ? apr_psprintf(p, "%d.%d %s%s (%s)", HTTP_VERSION_MAJOR(r->proto_num), diff --git a/modules/http2/h2_util.c b/modules/http2/h2_util.c index 624e9d9f95..0059edf121 100644 --- a/modules/http2/h2_util.c +++ b/modules/http2/h2_util.c @@ -115,26 +115,28 @@ void h2_util_camel_case_header(char *s, size_t len) /* base64 url encoding */ -static const int BASE64URL_UINT6[] = { +#define N6 (unsigned int)-1 + +static const unsigned int BASE64URL_UINT6[] = { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0 */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 1 */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, /* 2 */ - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, /* 3 */ - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 4 */ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, /* 5 */ - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, /* 6 */ - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, /* 7 */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 8 */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 9 */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* a */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* b */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* c */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* d */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* e */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* f */ + N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, /* 0 */ + N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, /* 1 */ + N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, 62, N6, N6, /* 2 */ + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, N6, N6, N6, N6, N6, N6, /* 3 */ + N6, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 4 */ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, N6, N6, N6, N6, 63, /* 5 */ + N6, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, /* 6 */ + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, N6, N6, N6, N6, N6, /* 7 */ + N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, /* 8 */ + N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, /* 9 */ + N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, /* a */ + N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, /* b */ + N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, /* c */ + N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, /* d */ + N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, /* e */ + N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6, N6 /* f */ }; -static const char BASE64URL_CHARS[] = { +static const unsigned char BASE64URL_CHARS[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0 - 9 */ 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10 - 19 */ 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20 - 29 */ @@ -144,21 +146,23 @@ static const char BASE64URL_CHARS[] = { '8', '9', '-', '_', ' ', ' ', ' ', ' ', ' ', ' ', /* 60 - 69 */ }; +#define BASE64URL_CHAR(x) BASE64URL_CHARS[ (unsigned int)(x) & 0x3fu ] + apr_size_t h2_util_base64url_decode(const char **decoded, const char *encoded, apr_pool_t *pool) { const unsigned char *e = (const unsigned char *)encoded; const unsigned char *p = e; unsigned char *d; - int n; - apr_size_t len, mlen, remain, i; + unsigned int n; + long len, mlen, remain, i; - while (*p && BASE64URL_UINT6[ *p ] != -1) { + while (*p && BASE64URL_UINT6[ *p ] != N6) { ++p; } - len = p - e; + len = (int)(p - e); mlen = (len/4)*4; - *decoded = apr_pcalloc(pool, len+1); + *decoded = apr_pcalloc(pool, (apr_size_t)len + 1); i = 0; d = (unsigned char*)*decoded; @@ -167,60 +171,60 @@ apr_size_t h2_util_base64url_decode(const char **decoded, const char *encoded, (BASE64URL_UINT6[ e[i+1] ] << 12) + (BASE64URL_UINT6[ e[i+2] ] << 6) + (BASE64URL_UINT6[ e[i+3] ])); - *d++ = n >> 16; - *d++ = n >> 8 & 0xffu; - *d++ = n & 0xffu; + *d++ = (unsigned char)(n >> 16); + *d++ = (unsigned char)(n >> 8 & 0xffu); + *d++ = (unsigned char)(n & 0xffu); } remain = len - mlen; switch (remain) { case 2: n = ((BASE64URL_UINT6[ e[mlen+0] ] << 18) + (BASE64URL_UINT6[ e[mlen+1] ] << 12)); - *d++ = n >> 16; + *d++ = (unsigned char)(n >> 16); remain = 1; break; case 3: n = ((BASE64URL_UINT6[ e[mlen+0] ] << 18) + (BASE64URL_UINT6[ e[mlen+1] ] << 12) + (BASE64URL_UINT6[ e[mlen+2] ] << 6)); - *d++ = n >> 16; - *d++ = n >> 8 & 0xffu; + *d++ = (unsigned char)(n >> 16); + *d++ = (unsigned char)(n >> 8 & 0xffu); remain = 2; break; default: /* do nothing */ break; } - return mlen/4*3 + remain; + return (apr_size_t)(mlen/4*3 + remain); } const char *h2_util_base64url_encode(const char *data, apr_size_t dlen, apr_pool_t *pool) { - long i, len = (int)dlen; + int i, len = (int)dlen; apr_size_t slen = ((dlen+2)/3)*4 + 1; /* 0 terminated */ const unsigned char *udata = (const unsigned char*)data; - char *enc, *p = apr_pcalloc(pool, slen); + unsigned char *enc, *p = apr_pcalloc(pool, slen); enc = p; for (i = 0; i < len-2; i+= 3) { - *p++ = BASE64URL_CHARS[ (udata[i] >> 2) & 0x3fu ]; - *p++ = BASE64URL_CHARS[ ((udata[i] << 4) + (udata[i+1] >> 4)) & 0x3fu ]; - *p++ = BASE64URL_CHARS[ ((udata[i+1] << 2) + (udata[i+2] >> 6)) & 0x3fu ]; - *p++ = BASE64URL_CHARS[ udata[i+2] & 0x3fu ]; + *p++ = BASE64URL_CHAR( (udata[i] >> 2) ); + *p++ = BASE64URL_CHAR( (udata[i] << 4) + (udata[i+1] >> 4) ); + *p++ = BASE64URL_CHAR( (udata[i+1] << 2) + (udata[i+2] >> 6) ); + *p++ = BASE64URL_CHAR( (udata[i+2]) ); } if (i < len) { - *p++ = BASE64URL_CHARS[ (udata[i] >> 2) & 0x3fu ]; + *p++ = BASE64URL_CHAR( (udata[i] >> 2) ); if (i == (len - 1)) { - *p++ = BASE64URL_CHARS[ (udata[i] << 4) & 0x3fu ]; + *p++ = BASE64URL_CHARS[ ((unsigned int)udata[i] << 4) & 0x3fu ]; } else { - *p++ = BASE64URL_CHARS[ ((udata[i] << 4) + (udata[i+1] >> 4)) & 0x3fu ]; - *p++ = BASE64URL_CHARS[ (udata[i+1] << 2) & 0x3fu ]; + *p++ = BASE64URL_CHAR( (udata[i] << 4) + (udata[i+1] >> 4) ); + *p++ = BASE64URL_CHAR( (udata[i+1] << 2) ); } } *p++ = '\0'; - return enc; + return (char *)enc; } /*******************************************************************************