Skip to content

Commit 3405367

Browse files
NGINX teamkolbyjack
authored andcommitted
Changes with nginx 1.3.0 15 May 2012
*) Feature: the "debug_connection" directive now supports IPv6 addresses and the "unix:" parameter. *) Feature: the "set_real_ip_from" directive and the "proxy" parameter of the "geo" directive now support IPv6 addresses. *) Feature: the "real_ip_recursive", "geoip_proxy", and "geoip_proxy_recursive" directives. *) Feature: the "proxy_recursive" parameter of the "geo" directive. *) Bugfix: a segmentation fault might occur in a worker process if the "resolver" directive was used. *) Bugfix: a segmentation fault might occur in a worker process if the "fastcgi_pass", "scgi_pass", or "uwsgi_pass" directives were used and backend returned incorrect response. *) Bugfix: a segmentation fault might occur in a worker process if the "rewrite" directive was used and new request arguments in a replacement used variables. *) Bugfix: nginx might hog CPU if the open file resource limit was reached. *) Bugfix: nginx might loop infinitely over backends if the "proxy_next_upstream" directive with the "http_404" parameter was used and there were backup servers specified in an upstream block. *) Bugfix: adding the "down" parameter of the "server" directive might cause unneeded client redistribution among backend servers if the "ip_hash" directive was used. *) Bugfix: socket leak. Thanks to Yichun Zhang. *) Bugfix: in the ngx_http_fastcgi_module.
1 parent ceea69f commit 3405367

26 files changed

+666
-429
lines changed

CHANGES

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,45 @@
11

2+
Changes with nginx 1.3.0 15 May 2012
3+
4+
*) Feature: the "debug_connection" directive now supports IPv6 addresses
5+
and the "unix:" parameter.
6+
7+
*) Feature: the "set_real_ip_from" directive and the "proxy" parameter
8+
of the "geo" directive now support IPv6 addresses.
9+
10+
*) Feature: the "real_ip_recursive", "geoip_proxy", and
11+
"geoip_proxy_recursive" directives.
12+
13+
*) Feature: the "proxy_recursive" parameter of the "geo" directive.
14+
15+
*) Bugfix: a segmentation fault might occur in a worker process if the
16+
"resolver" directive was used.
17+
18+
*) Bugfix: a segmentation fault might occur in a worker process if the
19+
"fastcgi_pass", "scgi_pass", or "uwsgi_pass" directives were used and
20+
backend returned incorrect response.
21+
22+
*) Bugfix: a segmentation fault might occur in a worker process if the
23+
"rewrite" directive was used and new request arguments in a
24+
replacement used variables.
25+
26+
*) Bugfix: nginx might hog CPU if the open file resource limit was
27+
reached.
28+
29+
*) Bugfix: nginx might loop infinitely over backends if the
30+
"proxy_next_upstream" directive with the "http_404" parameter was
31+
used and there were backup servers specified in an upstream block.
32+
33+
*) Bugfix: adding the "down" parameter of the "server" directive might
34+
cause unneeded client redistribution among backend servers if the
35+
"ip_hash" directive was used.
36+
37+
*) Bugfix: socket leak.
38+
Thanks to Yichun Zhang.
39+
40+
*) Bugfix: in the ngx_http_fastcgi_module.
41+
42+
243
Changes with nginx 1.2.0 23 Apr 2012
344

445
*) Bugfix: a segmentation fault might occur in a worker process if the

CHANGES.ru

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,45 @@
11

2+
Изменения в nginx 1.3.0 15.05.2012
3+
4+
*) Добавление: директива debug_connection теперь поддерживает
5+
IPv6-адреса и параметр "unix:".
6+
7+
*) Добавление: директива set_real_ip_from и параметр proxy директивы geo
8+
теперь поддерживают IPv6-адреса.
9+
10+
*) Добавление: директивы real_ip_recursive, geoip_proxy и
11+
geoip_proxy_recursive.
12+
13+
*) Добавление: параметр proxy_recursive директивы geo.
14+
15+
*) Исправление: в рабочем процессе мог произойти segmentation fault,
16+
если использовалась директива resolver.
17+
18+
*) Исправление: в рабочем процессе мог произойти segmentation fault,
19+
если использовались директивы fastcgi_pass, scgi_pass или uwsgi_pass
20+
и бэкенд возвращал некорректный ответ.
21+
22+
*) Исправление: в рабочем процессе мог произойти segmentation fault,
23+
если использовалась директива rewrite и в новых аргументах запроса в
24+
строке замены использовались переменные.
25+
26+
*) Исправление: nginx мог нагружать процессор, если было достигнуто
27+
ограничение на количество открытых файлов.
28+
29+
*) Исправление: при использовании директивы proxy_next_upstream с
30+
параметром http_404 nginx мог бесконечно перебирать бэкенды, если в
31+
блоке upstream был хотя бы один сервер с флагом backup.
32+
33+
*) Исправление: при использовании директивы ip_hash установка параметра
34+
down директивы server могла приводить к ненужному перераспределению
35+
клиентов между бэкендами.
36+
37+
*) Исправление: утечки сокетов.
38+
Спасибо Yichun Zhang.
39+
40+
*) Исправление: в модуле ngx_http_fastcgi_module.
41+
42+
243
Изменения в nginx 1.2.0 23.04.2012
344

445
*) Исправление: в рабочем процессе мог произойти segmentation fault,

src/core/nginx.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
#define _NGINX_H_INCLUDED_
1010

1111

12-
#define nginx_version 1002000
13-
#define NGINX_VERSION "1.2.0"
12+
#define nginx_version 1003000
13+
#define NGINX_VERSION "1.3.0"
1414
#define NGINX_VER "nginx/" NGINX_VERSION
1515

1616
#define NGINX_VAR "NGINX"

src/core/ngx_resolver.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,10 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
513513

514514
/* lock alloc mutex */
515515

516-
ngx_resolver_free_locked(r, rn->query);
517-
rn->query = NULL;
516+
if (rn->query) {
517+
ngx_resolver_free_locked(r, rn->query);
518+
rn->query = NULL;
519+
}
518520

519521
if (rn->cnlen) {
520522
ngx_resolver_free_locked(r, rn->u.cname);
@@ -1409,6 +1411,9 @@ ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t last,
14091411
ngx_resolver_free(r, addrs);
14101412
}
14111413

1414+
ngx_resolver_free(r, rn->query);
1415+
rn->query = NULL;
1416+
14121417
return;
14131418

14141419
} else if (cname) {
@@ -1441,6 +1446,9 @@ ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t last,
14411446
(void) ngx_resolve_name_locked(r, ctx);
14421447
}
14431448

1449+
ngx_resolver_free(r, rn->query);
1450+
rn->query = NULL;
1451+
14441452
return;
14451453
}
14461454

@@ -1834,6 +1842,10 @@ ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx)
18341842
p--;
18351843
*p-- = '\0';
18361844

1845+
if (ctx->name.len == 0) {
1846+
return NGX_DECLINED;
1847+
}
1848+
18371849
for (s = ctx->name.data + ctx->name.len - 1; s >= ctx->name.data; s--) {
18381850
if (*s != '.') {
18391851
*p = *s;

src/event/ngx_event.c

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,38 +1064,34 @@ ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
10641064

10651065
ngx_int_t rc;
10661066
ngx_str_t *value;
1067-
ngx_event_debug_t *dc;
10681067
struct hostent *h;
1069-
ngx_cidr_t cidr;
1068+
ngx_cidr_t *cidr;
10701069

10711070
value = cf->args->elts;
10721071

1073-
dc = ngx_array_push(&ecf->debug_connection);
1074-
if (dc == NULL) {
1072+
cidr = ngx_array_push(&ecf->debug_connection);
1073+
if (cidr == NULL) {
10751074
return NGX_CONF_ERROR;
10761075
}
10771076

1078-
rc = ngx_ptocidr(&value[1], &cidr);
1077+
#if (NGX_HAVE_UNIX_DOMAIN)
1078+
1079+
if (ngx_strcmp(value[1].data, "unix:") == 0) {
1080+
cidr->family = AF_UNIX;
1081+
return NGX_CONF_OK;
1082+
}
1083+
1084+
#endif
1085+
1086+
rc = ngx_ptocidr(&value[1], cidr);
10791087

10801088
if (rc == NGX_DONE) {
10811089
ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
10821090
"low address bits of %V are meaningless", &value[1]);
1083-
rc = NGX_OK;
1091+
return NGX_CONF_OK;
10841092
}
10851093

10861094
if (rc == NGX_OK) {
1087-
1088-
/* AF_INET only */
1089-
1090-
if (cidr.family != AF_INET) {
1091-
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1092-
"\"debug_connection\" supports IPv4 only");
1093-
return NGX_CONF_ERROR;
1094-
}
1095-
1096-
dc->mask = cidr.u.in.mask;
1097-
dc->addr = cidr.u.in.addr;
1098-
10991095
return NGX_CONF_OK;
11001096
}
11011097

@@ -1107,8 +1103,9 @@ ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
11071103
return NGX_CONF_ERROR;
11081104
}
11091105

1110-
dc->mask = 0xffffffff;
1111-
dc->addr = *(in_addr_t *)(h->h_addr_list[0]);
1106+
cidr->family = AF_INET;
1107+
cidr->u.in.mask = 0xffffffff;
1108+
cidr->u.in.addr = *(in_addr_t *)(h->h_addr_list[0]);
11121109

11131110
#else
11141111

@@ -1142,7 +1139,7 @@ ngx_event_core_create_conf(ngx_cycle_t *cycle)
11421139
#if (NGX_DEBUG)
11431140

11441141
if (ngx_array_init(&ecf->debug_connection, cycle->pool, 4,
1145-
sizeof(ngx_event_debug_t)) == NGX_ERROR)
1142+
sizeof(ngx_cidr_t)) == NGX_ERROR)
11461143
{
11471144
return NULL;
11481145
}

src/event/ngx_event.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -221,12 +221,6 @@ struct ngx_event_aio_s {
221221
#endif
222222

223223

224-
typedef struct {
225-
in_addr_t mask;
226-
in_addr_t addr;
227-
} ngx_event_debug_t;
228-
229-
230224
typedef struct {
231225
ngx_int_t (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
232226
ngx_int_t (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);

src/event/ngx_event_accept.c

Lines changed: 90 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ ngx_event_accept(ngx_event_t *ev)
2121
socklen_t socklen;
2222
ngx_err_t err;
2323
ngx_log_t *log;
24+
ngx_uint_t level;
2425
ngx_socket_t s;
2526
ngx_event_t *rev, *wev;
2627
ngx_listening_t *ls;
@@ -31,6 +32,14 @@ ngx_event_accept(ngx_event_t *ev)
3132
static ngx_uint_t use_accept4 = 1;
3233
#endif
3334

35+
if (ev->timedout) {
36+
if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) {
37+
return;
38+
}
39+
40+
ev->timedout = 0;
41+
}
42+
3443
ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);
3544

3645
if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
@@ -70,10 +79,17 @@ ngx_event_accept(ngx_event_t *ev)
7079
return;
7180
}
7281

82+
level = NGX_LOG_ALERT;
83+
84+
if (err == NGX_ECONNABORTED) {
85+
level = NGX_LOG_ERR;
86+
87+
} else if (err == NGX_EMFILE || err == NGX_ENFILE) {
88+
level = NGX_LOG_CRIT;
89+
}
90+
7391
#if (NGX_HAVE_ACCEPT4)
74-
ngx_log_error((ngx_uint_t) ((err == NGX_ECONNABORTED) ?
75-
NGX_LOG_ERR : NGX_LOG_ALERT),
76-
ev->log, err,
92+
ngx_log_error(level, ev->log, err,
7793
use_accept4 ? "accept4() failed" : "accept() failed");
7894

7995
if (use_accept4 && err == NGX_ENOSYS) {
@@ -82,9 +98,7 @@ ngx_event_accept(ngx_event_t *ev)
8298
continue;
8399
}
84100
#else
85-
ngx_log_error((ngx_uint_t) ((err == NGX_ECONNABORTED) ?
86-
NGX_LOG_ERR : NGX_LOG_ALERT),
87-
ev->log, err, "accept() failed");
101+
ngx_log_error(level, ev->log, err, "accept() failed");
88102
#endif
89103

90104
if (err == NGX_ECONNABORTED) {
@@ -97,6 +111,26 @@ ngx_event_accept(ngx_event_t *ev)
97111
}
98112
}
99113

114+
if (err == NGX_EMFILE || err == NGX_ENFILE) {
115+
if (ngx_disable_accept_events((ngx_cycle_t *) ngx_cycle)
116+
!= NGX_OK)
117+
{
118+
return;
119+
}
120+
121+
if (ngx_use_accept_mutex) {
122+
if (ngx_accept_mutex_held) {
123+
ngx_shmtx_unlock(&ngx_accept_mutex);
124+
ngx_accept_mutex_held = 0;
125+
}
126+
127+
ngx_accept_disabled = 1;
128+
129+
} else {
130+
ngx_add_timer(ev, ecf->accept_mutex_delay);
131+
}
132+
}
133+
100134
return;
101135
}
102136

@@ -252,17 +286,56 @@ ngx_event_accept(ngx_event_t *ev)
252286
#if (NGX_DEBUG)
253287
{
254288

255-
in_addr_t i;
256-
ngx_event_debug_t *dc;
257-
struct sockaddr_in *sin;
289+
struct sockaddr_in *sin;
290+
ngx_cidr_t *cidr;
291+
ngx_uint_t i;
292+
#if (NGX_HAVE_INET6)
293+
struct sockaddr_in6 *sin6;
294+
ngx_uint_t n;
295+
#endif
258296

259-
sin = (struct sockaddr_in *) sa;
260-
dc = ecf->debug_connection.elts;
297+
cidr = ecf->debug_connection.elts;
261298
for (i = 0; i < ecf->debug_connection.nelts; i++) {
262-
if ((sin->sin_addr.s_addr & dc[i].mask) == dc[i].addr) {
263-
log->log_level = NGX_LOG_DEBUG_CONNECTION|NGX_LOG_DEBUG_ALL;
299+
if (cidr[i].family != c->sockaddr->sa_family) {
300+
goto next;
301+
}
302+
303+
switch (cidr[i].family) {
304+
305+
#if (NGX_HAVE_INET6)
306+
case AF_INET6:
307+
sin6 = (struct sockaddr_in6 *) c->sockaddr;
308+
for (n = 0; n < 16; n++) {
309+
if ((sin6->sin6_addr.s6_addr[n]
310+
& cidr[i].u.in6.mask.s6_addr[n])
311+
!= cidr[i].u.in6.addr.s6_addr[n])
312+
{
313+
goto next;
314+
}
315+
}
316+
break;
317+
#endif
318+
319+
#if (NGX_HAVE_UNIX_DOMAIN)
320+
case AF_UNIX:
321+
break;
322+
#endif
323+
324+
default: /* AF_INET */
325+
sin = (struct sockaddr_in *) c->sockaddr;
326+
if ((sin->sin_addr.s_addr & cidr[i].u.in.mask)
327+
!= cidr[i].u.in.addr)
328+
{
329+
goto next;
330+
}
264331
break;
265332
}
333+
334+
log->log_level = NGX_LOG_DEBUG_CONNECTION|NGX_LOG_DEBUG_ALL;
335+
break;
336+
337+
next:
338+
continue;
266339
}
267340

268341
}
@@ -344,6 +417,10 @@ ngx_enable_accept_events(ngx_cycle_t *cycle)
344417

345418
c = ls[i].connection;
346419

420+
if (c->read->active) {
421+
continue;
422+
}
423+
347424
if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
348425

349426
if (ngx_add_conn(c) == NGX_ERROR) {

src/event/ngx_event_openssl.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -995,6 +995,7 @@ ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
995995
}
996996

997997
in->buf->pos += n;
998+
c->sent += n;
998999

9991000
if (in->buf->pos == in->buf->last) {
10001001
in = in->next;

0 commit comments

Comments
 (0)