annotate src/stream/ngx_stream_upstream_zone_module.c @ 7674:7731c710796f

Memcached: protect from too long responses. If a memcached response was followed by a correct trailer, and then the NUL character followed by some extra data - this was accepted by the trailer checking code. This in turn resulted in ctx->rest underflow and caused negative size buffer on the next reading from the upstream, followed by the "negative size buf in writer" alert. Fix is to always check for too long responses, so a correct trailer cannot be followed by extra data.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 06 Jul 2020 18:36:17 +0300
parents 3b1b81e248bc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
3 * Copyright (C) Ruslan Ermilov
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
5 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
6
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
7
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
10 #include <ngx_stream.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
11
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
12
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
13 static char *ngx_stream_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
14 void *conf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
15 static ngx_int_t ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
16 void *data);
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
17 static ngx_stream_upstream_rr_peers_t *ngx_stream_upstream_zone_copy_peers(
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
18 ngx_slab_pool_t *shpool, ngx_stream_upstream_srv_conf_t *uscf);
7080
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
19 static ngx_stream_upstream_rr_peer_t *ngx_stream_upstream_zone_copy_peer(
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
20 ngx_stream_upstream_rr_peers_t *peers, ngx_stream_upstream_rr_peer_t *src);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
21
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
22
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
23 static ngx_command_t ngx_stream_upstream_zone_commands[] = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
24
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
25 { ngx_string("zone"),
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
26 NGX_STREAM_UPS_CONF|NGX_CONF_TAKE12,
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
27 ngx_stream_upstream_zone,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
28 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
29 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
30 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
31
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
32 ngx_null_command
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
33 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
34
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
35
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
36 static ngx_stream_module_t ngx_stream_upstream_zone_module_ctx = {
6606
2f41d383c9c7 Stream: added preconfiguration step.
Vladimir Homutov <vl@nginx.com>
parents: 6214
diff changeset
37 NULL, /* preconfiguration */
6174
68c106e6fa0a Stream: added postconfiguration method to stream modules.
Vladimir Homutov <vl@nginx.com>
parents: 6123
diff changeset
38 NULL, /* postconfiguration */
68c106e6fa0a Stream: added postconfiguration method to stream modules.
Vladimir Homutov <vl@nginx.com>
parents: 6123
diff changeset
39
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
40 NULL, /* create main configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
41 NULL, /* init main configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
42
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
43 NULL, /* create server configuration */
6629
8ed51b02f655 Stream: style.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
44 NULL /* merge server configuration */
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
45 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
46
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
47
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
48 ngx_module_t ngx_stream_upstream_zone_module = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
49 NGX_MODULE_V1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
50 &ngx_stream_upstream_zone_module_ctx, /* module context */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
51 ngx_stream_upstream_zone_commands, /* module directives */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
52 NGX_STREAM_MODULE, /* module type */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
53 NULL, /* init master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
54 NULL, /* init module */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
55 NULL, /* init process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
56 NULL, /* init thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
57 NULL, /* exit thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
58 NULL, /* exit process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
59 NULL, /* exit master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
60 NGX_MODULE_V1_PADDING
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
61 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
62
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
63
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
64 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
65 ngx_stream_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
66 {
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
67 ssize_t size;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
68 ngx_str_t *value;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
69 ngx_stream_upstream_srv_conf_t *uscf;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
70 ngx_stream_upstream_main_conf_t *umcf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
71
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
72 uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module);
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
73 umcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_upstream_module);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
74
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
75 value = cf->args->elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
76
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
77 if (!value[1].len) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
78 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
79 "invalid zone name \"%V\"", &value[1]);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
80 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
81 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
82
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
83 if (cf->args->nelts == 3) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
84 size = ngx_parse_size(&value[2]);
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
85
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
86 if (size == NGX_ERROR) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
87 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
88 "invalid zone size \"%V\"", &value[2]);
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
89 return NGX_CONF_ERROR;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
90 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
91
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
92 if (size < (ssize_t) (8 * ngx_pagesize)) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
93 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
94 "zone \"%V\" is too small", &value[1]);
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
95 return NGX_CONF_ERROR;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
96 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
97
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
98 } else {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
99 size = 0;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
100 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
101
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
102 uscf->shm_zone = ngx_shared_memory_add(cf, &value[1], size,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
103 &ngx_stream_upstream_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
104 if (uscf->shm_zone == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
105 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
106 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
107
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
108 uscf->shm_zone->init = ngx_stream_upstream_init_zone;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
109 uscf->shm_zone->data = umcf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
110
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
111 uscf->shm_zone->noreuse = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
112
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
113 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
114 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
116
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
117 static ngx_int_t
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
118 ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
119 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
120 size_t len;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
121 ngx_uint_t i;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
122 ngx_slab_pool_t *shpool;
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
123 ngx_stream_upstream_rr_peers_t *peers, **peersp;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
124 ngx_stream_upstream_srv_conf_t *uscf, **uscfp;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
125 ngx_stream_upstream_main_conf_t *umcf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
126
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
127 shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
128 umcf = shm_zone->data;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
129 uscfp = umcf->upstreams.elts;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
130
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
131 if (shm_zone->shm.exists) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
132 peers = shpool->data;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
133
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
134 for (i = 0; i < umcf->upstreams.nelts; i++) {
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
135 uscf = uscfp[i];
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
136
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
137 if (uscf->shm_zone != shm_zone) {
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
138 continue;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
139 }
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
140
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
141 uscf->peer.data = peers;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
142 peers = peers->zone_next;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
143 }
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
144
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
145 return NGX_OK;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
146 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
147
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
148 len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
149
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
150 shpool->log_ctx = ngx_slab_alloc(shpool, len);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
151 if (shpool->log_ctx == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
152 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
153 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
154
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
155 ngx_sprintf(shpool->log_ctx, " in upstream zone \"%V\"%Z",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
156 &shm_zone->shm.name);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
157
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
158
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
159 /* copy peers to shared memory */
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
160
6214
341e4303d25b Fixed strict aliasing warnings with old GCC versions.
Ruslan Ermilov <ru@nginx.com>
parents: 6198
diff changeset
161 peersp = (ngx_stream_upstream_rr_peers_t **) (void *) &shpool->data;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
162
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
163 for (i = 0; i < umcf->upstreams.nelts; i++) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
164 uscf = uscfp[i];
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
165
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
166 if (uscf->shm_zone != shm_zone) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
167 continue;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
168 }
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
169
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
170 peers = ngx_stream_upstream_zone_copy_peers(shpool, uscf);
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
171 if (peers == NULL) {
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
172 return NGX_ERROR;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
173 }
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
174
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
175 *peersp = peers;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
176 peersp = &peers->zone_next;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
177 }
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
178
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
179 return NGX_OK;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
180 }
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
181
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
182
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
183 static ngx_stream_upstream_rr_peers_t *
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
184 ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
185 ngx_stream_upstream_srv_conf_t *uscf)
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
186 {
7078
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
187 ngx_str_t *name;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
188 ngx_stream_upstream_rr_peer_t *peer, **peerp;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
189 ngx_stream_upstream_rr_peers_t *peers, *backup;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6115
diff changeset
190
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
191 peers = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
192 if (peers == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
193 return NULL;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
194 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
195
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
196 ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_stream_upstream_rr_peers_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
197
7078
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
198 name = ngx_slab_alloc(shpool, sizeof(ngx_str_t));
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
199 if (name == NULL) {
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
200 return NULL;
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
201 }
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
202
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
203 name->data = ngx_slab_alloc(shpool, peers->name->len);
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
204 if (name->data == NULL) {
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
205 return NULL;
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
206 }
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
207
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
208 ngx_memcpy(name->data, peers->name->data, peers->name->len);
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
209 name->len = peers->name->len;
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
210
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
211 peers->name = name;
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
212
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
213 peers->shpool = shpool;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
214
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
215 for (peerp = &peers->peer; *peerp; peerp = &peer->next) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
216 /* pool is unlocked */
7080
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
217 peer = ngx_stream_upstream_zone_copy_peer(peers, *peerp);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
218 if (peer == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
219 return NULL;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
220 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
221
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
222 *peerp = peer;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
223 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
224
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
225 if (peers->next == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
226 goto done;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
227 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
228
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
229 backup = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
230 if (backup == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
231 return NULL;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
232 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
233
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
234 ngx_memcpy(backup, peers->next, sizeof(ngx_stream_upstream_rr_peers_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
235
7078
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
236 backup->name = name;
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6629
diff changeset
237
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
238 backup->shpool = shpool;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
239
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
240 for (peerp = &backup->peer; *peerp; peerp = &peer->next) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
241 /* pool is unlocked */
7080
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
242 peer = ngx_stream_upstream_zone_copy_peer(backup, *peerp);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
243 if (peer == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
244 return NULL;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
245 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
246
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
247 *peerp = peer;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
248 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
249
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
250 peers->next = backup;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
251
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
252 done:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
253
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
254 uscf->peer.data = peers;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
255
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6174
diff changeset
256 return peers;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
257 }
7080
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
258
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
259
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
260 static ngx_stream_upstream_rr_peer_t *
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
261 ngx_stream_upstream_zone_copy_peer(ngx_stream_upstream_rr_peers_t *peers,
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
262 ngx_stream_upstream_rr_peer_t *src)
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
263 {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
264 ngx_slab_pool_t *pool;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
265 ngx_stream_upstream_rr_peer_t *dst;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
266
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
267 pool = peers->shpool;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
268
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
269 dst = ngx_slab_calloc_locked(pool, sizeof(ngx_stream_upstream_rr_peer_t));
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
270 if (dst == NULL) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
271 return NULL;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
272 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
273
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
274 if (src) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
275 ngx_memcpy(dst, src, sizeof(ngx_stream_upstream_rr_peer_t));
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
276 dst->sockaddr = NULL;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
277 dst->name.data = NULL;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
278 dst->server.data = NULL;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
279 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
280
7110
3b1b81e248bc Do not use the obsolete NGX_SOCKADDRLEN macro.
Ruslan Ermilov <ru@nginx.com>
parents: 7080
diff changeset
281 dst->sockaddr = ngx_slab_calloc_locked(pool, sizeof(ngx_sockaddr_t));
7080
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
282 if (dst->sockaddr == NULL) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
283 goto failed;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
284 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
285
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
286 dst->name.data = ngx_slab_calloc_locked(pool, NGX_SOCKADDR_STRLEN);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
287 if (dst->name.data == NULL) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
288 goto failed;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
289 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
290
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
291 if (src) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
292 ngx_memcpy(dst->sockaddr, src->sockaddr, src->socklen);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
293 ngx_memcpy(dst->name.data, src->name.data, src->name.len);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
294
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
295 dst->server.data = ngx_slab_alloc_locked(pool, src->server.len);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
296 if (dst->server.data == NULL) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
297 goto failed;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
298 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
299
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
300 ngx_memcpy(dst->server.data, src->server.data, src->server.len);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
301 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
302
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
303 return dst;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
304
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
305 failed:
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
306
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
307 if (dst->server.data) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
308 ngx_slab_free_locked(pool, dst->server.data);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
309 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
310
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
311 if (dst->name.data) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
312 ngx_slab_free_locked(pool, dst->name.data);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
313 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
314
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
315 if (dst->sockaddr) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
316 ngx_slab_free_locked(pool, dst->sockaddr);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
317 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
318
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
319 ngx_slab_free_locked(pool, dst);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
320
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
321 return NULL;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
322 }