aports/main/nginx/nginx-module-vts~fixes.patch
Jakub Jirutka f3dbbda9f6 main/nginx: backport bugfixes for multiple third-party modules
The most important are bugfixes for http-shibboleth (segfault)
and http-lua (probably segfault too).
2023-05-26 14:23:20 +00:00

193 lines
7.6 KiB
Diff

git diff v0.2.1..bf64dbfabfc49a574eb361f34b2401f880b5a324 src/
--
commit bf64dbfabfc49a574eb361f34b2401f880b5a324
Merge: a98a4b8 30a38c5
Author: Y.Horie <u5.horie@gmail.com>
Date: Mon Apr 17 22:46:33 2023 +0900
Merge pull request #270 from u5surf/issue-269
Fix vtsn.len type #269
commit 30a38c5ad5c18dd14137d78f0593c5f74c0e39c7
Author: u5surf <u5.horie@gmail.com>
Date: Sun Apr 16 17:06:06 2023 +0900
Fix vtsn.len type #269
commit 4b4dd60bb6eefdb932b80813bfe0a435009555af
Author: u5surf <u5.horie@gmail.com>
Date: Sun Mar 26 07:47:15 2023 +0900
Fix conditions of the pointer pa
commit a2961efa253ae2471a27c6c429278594cbcb701e
Author: u5surf <u5.horie@gmail.com>
Date: Sun Mar 19 00:33:22 2023 +0900
Fix ngx_utf8_decode
* it is necessary while the below patch is released officially.
* https://github.com/nginx/nginx/commit/2c5fccd4693c0a68e1c72d65e016ba83e861120e
commit fcc3c1575e102fa1c52a982d46abe14a10dc2097
Author: u5surf <u5.horie@gmail.com>
Date: Mon Feb 20 08:45:12 2023 +0900
Fix escaping filter_key in prometheus output
* Fixes #142
* it can be escaped the 2 - 4 bytes character
commit 4bbac923842c5e12a89168e208d77f0da6b91f9b
Author: u5surf <u5.horie@gmail.com>
Date: Tue Oct 18 17:38:59 2022 +0900
Bugfix: fixed issues/228 Change the reffered source of upstream_states in shm_add_upstream()
commit 1277c0121bc19603cf7554d6316fa3303feba6f3
Author: YoungJoo.Kim <vozltx@gmail.com>
Date: Mon Sep 26 23:35:38 2022 +0900
Bugfix: fixed issues/248 Shared memory (lock|unlock) is set when using the ngx_http_vhost_traffic_status_display_get_size() function
commit 319fe4c84390c4628e558bb248ea7ffc540d4b7e
Author: u5surf <u5.horie@gmail.com>
Date: Mon Sep 26 21:03:16 2022 +0900
bugfix: Add shmtx unlock
--
diff --git a/src/ngx_http_vhost_traffic_status_display.c b/src/ngx_http_vhost_traffic_status_display.c
index 17b35fc..4f4c01f 100644
--- a/src/ngx_http_vhost_traffic_status_display.c
+++ b/src/ngx_http_vhost_traffic_status_display.c
@@ -524,15 +524,25 @@ ngx_http_vhost_traffic_status_display_get_size(ngx_http_request_t *r,
ngx_int_t format)
{
ngx_uint_t size, un;
+ ngx_slab_pool_t *shpool;
+ ngx_http_vhost_traffic_status_loc_conf_t *vtscf;
ngx_http_vhost_traffic_status_shm_info_t *shm_info;
+ vtscf = ngx_http_get_module_loc_conf(r, ngx_http_vhost_traffic_status_module);
+ shpool = (ngx_slab_pool_t *) vtscf->shm_zone->shm.addr;
+
shm_info = ngx_pcalloc(r->pool, sizeof(ngx_http_vhost_traffic_status_shm_info_t));
if (shm_info == NULL) {
return NGX_ERROR;
}
+ /* Caveat: Do not use duplicate ngx_shmtx_lock() before this function. */
+ ngx_shmtx_lock(&shpool->mutex);
+
ngx_http_vhost_traffic_status_shm_info(r, shm_info);
+ ngx_shmtx_unlock(&shpool->mutex);
+
/* allocate memory for the upstream groups even if upstream node not exists */
un = shm_info->used_node
+ (ngx_uint_t) ngx_http_vhost_traffic_status_display_get_upstream_nelts(r);
diff --git a/src/ngx_http_vhost_traffic_status_dump.c b/src/ngx_http_vhost_traffic_status_dump.c
index fafe60c..5f31629 100644
--- a/src/ngx_http_vhost_traffic_status_dump.c
+++ b/src/ngx_http_vhost_traffic_status_dump.c
@@ -393,7 +393,7 @@ ngx_http_vhost_traffic_status_dump_restore(ngx_event_t *ev)
/* read: data */
offset += n;
n = ngx_read_file(&file, buf, vtsn.len, offset);
- if (n != vtsn.len) {
+ if (n >= 0 && vtsn.len <= SSIZE_MAX && n != (ssize_t) vtsn.len) {
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,
"dump_restore::ngx_read_file() read:%z, data:%z failed",
n, vtsn.len);
diff --git a/src/ngx_http_vhost_traffic_status_node.h b/src/ngx_http_vhost_traffic_status_node.h
index 3bbb53e..9cc4a0e 100644
--- a/src/ngx_http_vhost_traffic_status_node.h
+++ b/src/ngx_http_vhost_traffic_status_node.h
@@ -100,7 +100,7 @@ typedef struct {
#endif
ngx_http_vhost_traffic_status_node_upstream_t stat_upstream;
- u_short len;
+ size_t len;
u_char data[1];
} ngx_http_vhost_traffic_status_node_t;
diff --git a/src/ngx_http_vhost_traffic_status_shm.c b/src/ngx_http_vhost_traffic_status_shm.c
index 31f73e1..78d181c 100644
--- a/src/ngx_http_vhost_traffic_status_shm.c
+++ b/src/ngx_http_vhost_traffic_status_shm.c
@@ -130,6 +130,7 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r,
if (node == NULL) {
shm_info = ngx_pcalloc(r->pool, sizeof(ngx_http_vhost_traffic_status_shm_info_t));
if (shm_info == NULL) {
+ ngx_shmtx_unlock(&shpool->mutex);
return NGX_ERROR;
}
@@ -147,7 +148,7 @@ ngx_http_vhost_traffic_status_shm_add_node(ngx_http_request_t *r,
vtsn = (ngx_http_vhost_traffic_status_node_t *) &node->color;
node->key = hash;
- vtsn->len = (u_short) key->len;
+ vtsn->len = key->len;
ngx_http_vhost_traffic_status_node_init(r, vtsn);
vtsn->stat_upstream.type = type;
ngx_memcpy(vtsn->data, key->data, key->len);
@@ -480,14 +481,14 @@ ngx_http_vhost_traffic_status_shm_add_upstream(ngx_http_request_t *r)
found:
- state = r->upstream_states->elts;
- if (state[0].peer == NULL) {
+ state = u->state;
+ if (state->peer == NULL) {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"shm_add_upstream::peer failed");
return NGX_ERROR;
}
- dst.len = (uscf->port ? 0 : uscf->host.len + sizeof("@") - 1) + state[0].peer->len;
+ dst.len = (uscf->port ? 0 : uscf->host.len + sizeof("@") - 1) + state->peer->len;
dst.data = ngx_pnalloc(r->pool, dst.len);
if (dst.data == NULL) {
return NGX_ERROR;
@@ -495,13 +496,13 @@ found:
p = dst.data;
if (uscf->port) {
- p = ngx_cpymem(p, state[0].peer->data, state[0].peer->len);
+ p = ngx_cpymem(p, state->peer->data, state->peer->len);
type = NGX_HTTP_VHOST_TRAFFIC_STATUS_UPSTREAM_UA;
} else {
p = ngx_cpymem(p, uscf->host.data, uscf->host.len);
*p++ = NGX_HTTP_VHOST_TRAFFIC_STATUS_KEY_SEPARATOR;
- p = ngx_cpymem(p, state[0].peer->data, state[0].peer->len);
+ p = ngx_cpymem(p, state->peer->data, state->peer->len);
type = NGX_HTTP_VHOST_TRAFFIC_STATUS_UPSTREAM_UG;
}
diff --git a/src/ngx_http_vhost_traffic_status_string.c b/src/ngx_http_vhost_traffic_status_string.c
index f582b56..cc64e61 100644
--- a/src/ngx_http_vhost_traffic_status_string.c
+++ b/src/ngx_http_vhost_traffic_status_string.c
@@ -187,7 +187,7 @@ ngx_http_vhost_traffic_status_escape_prometheus(ngx_pool_t *pool, ngx_str_t *buf
}
} else {
char_end = pa;
- if (ngx_utf8_decode(&char_end, last - pa) > 0x10ffff) {
+ if (*pa >= 0xf8 || ngx_utf8_decode(&char_end, last - pa) > 0x10ffff) {
break;
} else {
pa = char_end;
@@ -237,7 +237,7 @@ ngx_http_vhost_traffic_status_escape_prometheus(ngx_pool_t *pool, ngx_str_t *buf
}
} else {
char_end = pa;
- if (ngx_utf8_decode(&char_end, last - pa) > 0x10ffff) {
+ if (*pa >= 0xf8 || ngx_utf8_decode(&char_end, last - pa) > 0x10ffff) {
/* invalid UTF-8 - escape single char to allow resynchronization */
c = *pa++;
/* two slashes are required to be valid encoding for prometheus*/