aboutsummaryrefslogtreecommitdiff
path: root/src/stream/ngx_stream_upstream_zone_module.c
diff options
context:
space:
mode:
authorRuslan Ermilov <ru@nginx.com>2017-08-01 19:12:10 +0300
committerRuslan Ermilov <ru@nginx.com>2017-08-01 19:12:10 +0300
commitd846f27638525f478ea07f5574b5569ce2ab1ac2 (patch)
tree66119059c9f70eca26859e42dab62d25aafcf607 /src/stream/ngx_stream_upstream_zone_module.c
parentb992f7259ba4763178f9d394b320bcc5de88818b (diff)
downloadnginx-d846f27638525f478ea07f5574b5569ce2ab1ac2.tar.gz
nginx-d846f27638525f478ea07f5574b5569ce2ab1ac2.zip
Upstream zone: store peers->name and its data in shared memory.
The shared objects should generally be allocated from shared memory. While peers->name and the data it points to allocated from cf->pool happened to work on UNIX, it broke on Windows. On UNIX this worked only because the shared memory zone for upstreams is re-created for every new configuration. But on Windows, a worker process does not inherit the address space of the master process, so the peers->name pointed to data allocated from cf->pool by the master process, and was invalid.
Diffstat (limited to 'src/stream/ngx_stream_upstream_zone_module.c')
-rw-r--r--src/stream/ngx_stream_upstream_zone_module.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/stream/ngx_stream_upstream_zone_module.c b/src/stream/ngx_stream_upstream_zone_module.c
index 07ab88dfa..a02d684df 100644
--- a/src/stream/ngx_stream_upstream_zone_module.c
+++ b/src/stream/ngx_stream_upstream_zone_module.c
@@ -182,6 +182,7 @@ static ngx_stream_upstream_rr_peers_t *
ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
ngx_stream_upstream_srv_conf_t *uscf)
{
+ ngx_str_t *name;
ngx_stream_upstream_rr_peer_t *peer, **peerp;
ngx_stream_upstream_rr_peers_t *peers, *backup;
@@ -192,6 +193,21 @@ ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_stream_upstream_rr_peers_t));
+ name = ngx_slab_alloc(shpool, sizeof(ngx_str_t));
+ if (name == NULL) {
+ return NULL;
+ }
+
+ name->data = ngx_slab_alloc(shpool, peers->name->len);
+ if (name->data == NULL) {
+ return NULL;
+ }
+
+ ngx_memcpy(name->data, peers->name->data, peers->name->len);
+ name->len = peers->name->len;
+
+ peers->name = name;
+
peers->shpool = shpool;
for (peerp = &peers->peer; *peerp; peerp = &peer->next) {
@@ -218,6 +234,8 @@ ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
ngx_memcpy(backup, peers->next, sizeof(ngx_stream_upstream_rr_peers_t));
+ backup->name = name;
+
backup->shpool = shpool;
for (peerp = &backup->peer; *peerp; peerp = &peer->next) {