Skip to content

Commit 9526873

Browse files
committed
nginx 1.23.3
1 parent 5cd8aff commit 9526873

19 files changed

+193
-61
lines changed

nginx/CHANGES

+17
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,21 @@
11

2+
Changes with nginx 1.23.3 13 Dec 2022
3+
4+
*) Bugfix: an error might occur when reading PROXY protocol version 2
5+
header with large number of TLVs.
6+
7+
*) Bugfix: a segmentation fault might occur in a worker process if SSI
8+
was used to process subrequests created by other modules.
9+
Thanks to Ciel Zhao.
10+
11+
*) Workaround: when a hostname used in the "listen" directive resolves
12+
to multiple addresses, nginx now ignores duplicates within these
13+
addresses.
14+
15+
*) Bugfix: nginx might hog CPU during unbuffered proxying if SSL
16+
connections to backends were used.
17+
18+
219
Changes with nginx 1.23.2 19 Oct 2022
320

421
*) Security: processing of a specially crafted mp4 file by the

nginx/CHANGES.ru

+18
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,22 @@
11

2+
Изменения в nginx 1.23.3 13.12.2022
3+
4+
*) Исправление: при чтении заголовка протокола PROXY версии 2,
5+
содержащего большое количество TLV, могла возникать ошибка.
6+
7+
*) Исправление: при использовании SSI для обработки подзапросов,
8+
созданных другими модулями, в рабочем процессе мог произойти
9+
segmentation fault.
10+
Спасибо Ciel Zhao.
11+
12+
*) Изменение: теперь, если при преобразовании в адреса имени хоста,
13+
указанного в директиве listen, возвращается несколько адресов, nginx
14+
игнорирует дубликаты среди этих адресов.
15+
16+
*) Исправление: nginx мог нагружать процессор при небуферизированном
17+
проксировании, если использовались SSL-соединения с бэкендами.
18+
19+
220
Изменения в nginx 1.23.2 19.10.2022
321

422
*) Безопасность: обработка специально созданного mp4-файла модулем

nginx/src/core/nginx.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
#define _NGINX_H_INCLUDED_
1010

1111

12-
#define nginx_version 1023002
13-
#define NGINX_VERSION "1.23.2"
12+
#define nginx_version 1023003
13+
#define NGINX_VERSION "1.23.3"
1414
#define NGINX_VER "nginx/" NGINX_VERSION
1515

1616
#ifdef NGX_BUILD

nginx/src/core/ngx_proxy_protocol.c

+8-6
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf, u_char *last)
109109
len = last - buf;
110110

111111
if (len >= sizeof(ngx_proxy_protocol_header_t)
112-
&& memcmp(p, signature, sizeof(signature) - 1) == 0)
112+
&& ngx_memcmp(p, signature, sizeof(signature) - 1) == 0)
113113
{
114114
return ngx_proxy_protocol_v2_read(c, buf, last);
115115
}
@@ -281,7 +281,9 @@ ngx_proxy_protocol_write(ngx_connection_t *c, u_char *buf, u_char *last)
281281
{
282282
ngx_uint_t port, lport;
283283

284-
if (last - buf < NGX_PROXY_PROTOCOL_MAX_HEADER) {
284+
if (last - buf < NGX_PROXY_PROTOCOL_V1_MAX_HEADER) {
285+
ngx_log_error(NGX_LOG_ALERT, c->log, 0,
286+
"too small buffer for PROXY protocol");
285287
return NULL;
286288
}
287289

@@ -394,11 +396,11 @@ ngx_proxy_protocol_v2_read(ngx_connection_t *c, u_char *buf, u_char *last)
394396

395397
src_sockaddr.sockaddr_in.sin_family = AF_INET;
396398
src_sockaddr.sockaddr_in.sin_port = 0;
397-
memcpy(&src_sockaddr.sockaddr_in.sin_addr, in->src_addr, 4);
399+
ngx_memcpy(&src_sockaddr.sockaddr_in.sin_addr, in->src_addr, 4);
398400

399401
dst_sockaddr.sockaddr_in.sin_family = AF_INET;
400402
dst_sockaddr.sockaddr_in.sin_port = 0;
401-
memcpy(&dst_sockaddr.sockaddr_in.sin_addr, in->dst_addr, 4);
403+
ngx_memcpy(&dst_sockaddr.sockaddr_in.sin_addr, in->dst_addr, 4);
402404

403405
pp->src_port = ngx_proxy_protocol_parse_uint16(in->src_port);
404406
pp->dst_port = ngx_proxy_protocol_parse_uint16(in->dst_port);
@@ -421,11 +423,11 @@ ngx_proxy_protocol_v2_read(ngx_connection_t *c, u_char *buf, u_char *last)
421423

422424
src_sockaddr.sockaddr_in6.sin6_family = AF_INET6;
423425
src_sockaddr.sockaddr_in6.sin6_port = 0;
424-
memcpy(&src_sockaddr.sockaddr_in6.sin6_addr, in6->src_addr, 16);
426+
ngx_memcpy(&src_sockaddr.sockaddr_in6.sin6_addr, in6->src_addr, 16);
425427

426428
dst_sockaddr.sockaddr_in6.sin6_family = AF_INET6;
427429
dst_sockaddr.sockaddr_in6.sin6_port = 0;
428-
memcpy(&dst_sockaddr.sockaddr_in6.sin6_addr, in6->dst_addr, 16);
430+
ngx_memcpy(&dst_sockaddr.sockaddr_in6.sin6_addr, in6->dst_addr, 16);
429431

430432
pp->src_port = ngx_proxy_protocol_parse_uint16(in6->src_port);
431433
pp->dst_port = ngx_proxy_protocol_parse_uint16(in6->dst_port);

nginx/src/core/ngx_proxy_protocol.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
#include <ngx_core.h>
1414

1515

16-
#define NGX_PROXY_PROTOCOL_MAX_HEADER 107
16+
#define NGX_PROXY_PROTOCOL_V1_MAX_HEADER 107
17+
#define NGX_PROXY_PROTOCOL_MAX_HEADER 4096
1718

1819

1920
struct ngx_proxy_protocol_s {

nginx/src/core/ngx_string.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,12 @@ ngx_copy(u_char *dst, u_char *src, size_t len)
140140
#endif
141141

142142

143-
#define ngx_memmove(dst, src, n) (void) memmove(dst, src, n)
144-
#define ngx_movemem(dst, src, n) (((u_char *) memmove(dst, src, n)) + (n))
143+
#define ngx_memmove(dst, src, n) (void) memmove(dst, src, n)
144+
#define ngx_movemem(dst, src, n) (((u_char *) memmove(dst, src, n)) + (n))
145145

146146

147147
/* msvc and icc7 compile memcmp() to the inline loop */
148-
#define ngx_memcmp(s1, s2, n) memcmp((const char *) s1, (const char *) s2, n)
148+
#define ngx_memcmp(s1, s2, n) memcmp(s1, s2, n)
149149

150150

151151
u_char *ngx_cpystrn(u_char *dst, u_char *src, size_t n);

nginx/src/event/ngx_event.c

+7-2
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,7 @@ ngx_event_init_conf(ngx_cycle_t *cycle, void *conf)
416416
{
417417
#if (NGX_HAVE_REUSEPORT)
418418
ngx_uint_t i;
419+
ngx_core_conf_t *ccf;
419420
ngx_listening_t *ls;
420421
#endif
421422

@@ -442,7 +443,9 @@ ngx_event_init_conf(ngx_cycle_t *cycle, void *conf)
442443

443444
#if (NGX_HAVE_REUSEPORT)
444445

445-
if (!ngx_test_config) {
446+
ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
447+
448+
if (!ngx_test_config && ccf->master) {
446449

447450
ls = cycle->listening.elts;
448451
for (i = 0; i < cycle->listening.nelts; i++) {
@@ -810,7 +813,9 @@ ngx_event_process_init(ngx_cycle_t *cycle)
810813
rev->deferred_accept = ls[i].deferred_accept;
811814
#endif
812815

813-
if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {
816+
if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)
817+
&& cycle->old_cycle)
818+
{
814819
if (ls[i].previous) {
815820

816821
/*

nginx/src/event/ngx_event_openssl.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -2204,6 +2204,7 @@ ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)
22042204
#endif
22052205

22062206
if (c->ssl->last == NGX_ERROR) {
2207+
c->read->ready = 0;
22072208
c->read->error = 1;
22082209
return NGX_ERROR;
22092210
}
@@ -2270,6 +2271,7 @@ ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)
22702271
#if (NGX_HAVE_FIONREAD)
22712272

22722273
if (ngx_socket_nread(c->fd, &c->read->available) == -1) {
2274+
c->read->ready = 0;
22732275
c->read->error = 1;
22742276
ngx_connection_error(c, ngx_socket_errno,
22752277
ngx_socket_nread_n " failed");
@@ -2306,6 +2308,7 @@ ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)
23062308
return 0;
23072309

23082310
case NGX_ERROR:
2311+
c->read->ready = 0;
23092312
c->read->error = 1;
23102313

23112314
/* fall through */
@@ -2326,6 +2329,7 @@ ngx_ssl_recv_early(ngx_connection_t *c, u_char *buf, size_t size)
23262329
size_t readbytes;
23272330

23282331
if (c->ssl->last == NGX_ERROR) {
2332+
c->read->ready = 0;
23292333
c->read->error = 1;
23302334
return NGX_ERROR;
23312335
}
@@ -2425,6 +2429,7 @@ ngx_ssl_recv_early(ngx_connection_t *c, u_char *buf, size_t size)
24252429
return 0;
24262430

24272431
case NGX_ERROR:
2432+
c->read->ready = 0;
24282433
c->read->error = 1;
24292434

24302435
/* fall through */
@@ -3020,7 +3025,7 @@ ngx_ssl_sendfile(ngx_connection_t *c, ngx_buf_t *file, size_t size)
30203025
n = SSL_sendfile(c->ssl->connection, file->file->fd, file->file_pos,
30213026
size, flags);
30223027

3023-
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_sendfile: %d", n);
3028+
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_sendfile: %z", n);
30243029

30253030
if (n > 0) {
30263031

nginx/src/http/modules/ngx_http_ssi_filter_module.c

+28-1
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ static ngx_http_variable_t ngx_http_ssi_vars[] = {
329329
static ngx_int_t
330330
ngx_http_ssi_header_filter(ngx_http_request_t *r)
331331
{
332-
ngx_http_ssi_ctx_t *ctx;
332+
ngx_http_ssi_ctx_t *ctx, *mctx;
333333
ngx_http_ssi_loc_conf_t *slcf;
334334

335335
slcf = ngx_http_get_module_loc_conf(r, ngx_http_ssi_filter_module);
@@ -341,6 +341,8 @@ ngx_http_ssi_header_filter(ngx_http_request_t *r)
341341
return ngx_http_next_header_filter(r);
342342
}
343343

344+
mctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);
345+
344346
ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_ssi_ctx_t));
345347
if (ctx == NULL) {
346348
return NGX_ERROR;
@@ -367,6 +369,26 @@ ngx_http_ssi_header_filter(ngx_http_request_t *r)
367369
r->filter_need_in_memory = 1;
368370

369371
if (r == r->main) {
372+
373+
if (mctx) {
374+
375+
/*
376+
* if there was a shared context previously used as main,
377+
* copy variables and blocks
378+
*/
379+
380+
ctx->variables = mctx->variables;
381+
ctx->blocks = mctx->blocks;
382+
383+
#if (NGX_PCRE)
384+
ctx->ncaptures = mctx->ncaptures;
385+
ctx->captures = mctx->captures;
386+
ctx->captures_data = mctx->captures_data;
387+
#endif
388+
389+
mctx->shared = 0;
390+
}
391+
370392
ngx_http_clear_content_length(r);
371393
ngx_http_clear_accept_ranges(r);
372394

@@ -379,6 +401,10 @@ ngx_http_ssi_header_filter(ngx_http_request_t *r)
379401
} else {
380402
ngx_http_weak_etag(r);
381403
}
404+
405+
} else if (mctx == NULL) {
406+
ngx_http_set_ctx(r->main, ctx, ngx_http_ssi_filter_module);
407+
ctx->shared = 1;
382408
}
383409

384410
return ngx_http_next_header_filter(r);
@@ -405,6 +431,7 @@ ngx_http_ssi_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
405431
ctx = ngx_http_get_module_ctx(r, ngx_http_ssi_filter_module);
406432

407433
if (ctx == NULL
434+
|| (ctx->shared && r == r->main)
408435
|| (in == NULL
409436
&& ctx->buf == NULL
410437
&& ctx->in == NULL

nginx/src/http/modules/ngx_http_ssi_filter_module.h

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ typedef struct {
7171
u_char *captures_data;
7272
#endif
7373

74+
unsigned shared:1;
7475
unsigned conditional:2;
7576
unsigned encoding:2;
7677
unsigned block:1;

nginx/src/http/ngx_http_core_module.c

+14-1
Original file line numberDiff line numberDiff line change
@@ -3963,7 +3963,7 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
39633963

39643964
ngx_str_t *value, size;
39653965
ngx_url_t u;
3966-
ngx_uint_t n;
3966+
ngx_uint_t n, i;
39673967
ngx_http_listen_opt_t lsopt;
39683968

39693969
cscf->listen = 1;
@@ -4289,6 +4289,16 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
42894289
}
42904290

42914291
for (n = 0; n < u.naddrs; n++) {
4292+
4293+
for (i = 0; i < n; i++) {
4294+
if (ngx_cmp_sockaddr(u.addrs[n].sockaddr, u.addrs[n].socklen,
4295+
u.addrs[i].sockaddr, u.addrs[i].socklen, 0)
4296+
== NGX_OK)
4297+
{
4298+
goto next;
4299+
}
4300+
}
4301+
42924302
lsopt.sockaddr = u.addrs[n].sockaddr;
42934303
lsopt.socklen = u.addrs[n].socklen;
42944304
lsopt.addr_text = u.addrs[n].name;
@@ -4297,6 +4307,9 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
42974307
if (ngx_http_add_listen(cf, cscf, &lsopt) != NGX_OK) {
42984308
return NGX_CONF_ERROR;
42994309
}
4310+
4311+
next:
4312+
continue;
43004313
}
43014314

43024315
return NGX_CONF_OK;

nginx/src/mail/ngx_mail_core_module.c

+35-12
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
308308
ngx_str_t *value, size;
309309
ngx_url_t u;
310310
ngx_uint_t i, n, m;
311-
ngx_mail_listen_t *ls, *als;
311+
ngx_mail_listen_t *ls, *als, *nls;
312312
ngx_mail_module_t *module;
313313
ngx_mail_core_main_conf_t *cmcf;
314314

@@ -333,7 +333,7 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
333333

334334
cmcf = ngx_mail_conf_get_module_main_conf(cf, ngx_mail_core_module);
335335

336-
ls = ngx_array_push_n(&cmcf->listen, u.naddrs);
336+
ls = ngx_array_push(&cmcf->listen);
337337
if (ls == NULL) {
338338
return NGX_CONF_ERROR;
339339
}
@@ -568,30 +568,53 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
568568
return NGX_CONF_ERROR;
569569
}
570570

571-
als = cmcf->listen.elts;
572-
573571
for (n = 0; n < u.naddrs; n++) {
574-
ls[n] = ls[0];
575572

576-
ls[n].sockaddr = u.addrs[n].sockaddr;
577-
ls[n].socklen = u.addrs[n].socklen;
578-
ls[n].addr_text = u.addrs[n].name;
579-
ls[n].wildcard = ngx_inet_wildcard(ls[n].sockaddr);
573+
for (i = 0; i < n; i++) {
574+
if (ngx_cmp_sockaddr(u.addrs[n].sockaddr, u.addrs[n].socklen,
575+
u.addrs[i].sockaddr, u.addrs[i].socklen, 0)
576+
== NGX_OK)
577+
{
578+
goto next;
579+
}
580+
}
581+
582+
if (n != 0) {
583+
nls = ngx_array_push(&cmcf->listen);
584+
if (nls == NULL) {
585+
return NGX_CONF_ERROR;
586+
}
587+
588+
*nls = *ls;
589+
590+
} else {
591+
nls = ls;
592+
}
580593

581-
for (i = 0; i < cmcf->listen.nelts - u.naddrs + n; i++) {
594+
nls->sockaddr = u.addrs[n].sockaddr;
595+
nls->socklen = u.addrs[n].socklen;
596+
nls->addr_text = u.addrs[n].name;
597+
nls->wildcard = ngx_inet_wildcard(nls->sockaddr);
598+
599+
als = cmcf->listen.elts;
600+
601+
for (i = 0; i < cmcf->listen.nelts - 1; i++) {
582602

583603
if (ngx_cmp_sockaddr(als[i].sockaddr, als[i].socklen,
584-
ls[n].sockaddr, ls[n].socklen, 1)
604+
nls->sockaddr, nls->socklen, 1)
585605
!= NGX_OK)
586606
{
587607
continue;
588608
}
589609

590610
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
591611
"duplicate \"%V\" address and port pair",
592-
&ls[n].addr_text);
612+
&nls->addr_text);
593613
return NGX_CONF_ERROR;
594614
}
615+
616+
next:
617+
continue;
595618
}
596619

597620
return NGX_CONF_OK;

0 commit comments

Comments
 (0)