]> git.kaiwu.me - nginx.git/log
nginx.git
3 years agoSSL: disabled saving tickets to session cache.
Maxim Dounin [Wed, 12 Oct 2022 17:14:34 +0000 (20:14 +0300)]
SSL: disabled saving tickets to session cache.

OpenSSL tries to save TLSv1.3 sessions into session cache even when using
tickets for stateless session resumption, "because some applications just
want to know about the creation of a session".  To avoid trashing session
cache with useless data, we do not save such sessions now.

3 years agoAdded type cast to ngx_proxy_protocol_parse_uint16().
Roman Arutyunyan [Tue, 27 Sep 2022 07:31:16 +0000 (11:31 +0400)]
Added type cast to ngx_proxy_protocol_parse_uint16().

The cast is added to make ngx_proxy_protocol_parse_uint16() similar to
ngx_proxy_protocol_parse_uint32().

3 years agoPROXY protocol v2 TLV variables.
Roman Arutyunyan [Wed, 12 Oct 2022 12:58:16 +0000 (16:58 +0400)]
PROXY protocol v2 TLV variables.

The variables have prefix $proxy_protocol_tlv_ and are accessible by name
and by type.  Examples are: $proxy_protocol_tlv_0x01, $proxy_protocol_tlv_alpn.

3 years agoLog only the first line of user input on PROXY protocol v1 error.
Roman Arutyunyan [Mon, 10 Oct 2022 09:57:31 +0000 (13:57 +0400)]
Log only the first line of user input on PROXY protocol v1 error.

Previously, all received user input was logged.  If a multi-line text was
received from client and logged, it could reduce log readability and also make
it harder to parse nginx log by scripts.  The change brings to PROXY protocol
the same behavior that exists for HTTP request line in
ngx_http_log_error_handler().

3 years agoSSL: silenced GCC warnings when building with BoringSSL.
Sergey Kandaurov [Thu, 8 Sep 2022 09:53:49 +0000 (13:53 +0400)]
SSL: silenced GCC warnings when building with BoringSSL.

BoringSSL uses macro stub for SSL_CTX_set_ecdh_auto that expands to 1,
which triggers -Wunused-value "statement with no effect" warnings.

3 years agoWin32: disabled threads support in OpenSSL builds.
Maxim Dounin [Tue, 6 Sep 2022 21:47:31 +0000 (00:47 +0300)]
Win32: disabled threads support in OpenSSL builds.

Threads are disabled during UNIX builds (see b329c0ab1a48), and also not
needed for Windows builds.

This used to be the default before OpenSSL 1.1.0.

3 years agoWin32: fixed build on Windows with OpenSSL 3.0.x (ticket #2379).
Maxim Dounin [Tue, 6 Sep 2022 21:47:17 +0000 (00:47 +0300)]
Win32: fixed build on Windows with OpenSSL 3.0.x (ticket #2379).

SSL_sendfile() expects integer file descriptor as an argument, but nginx
uses OS file handles (HANDLE) to work with files on Windows, and passing
HANDLE instead of an integer correctly results in build failure.  Since
SSL_sendfile() is not expected to work on Windows anyway, the code is now
disabled on Windows with appropriate compile-time checks.

3 years agoWin32: disabled C4306 warnings with MSVC.
Maxim Dounin [Tue, 6 Sep 2022 21:47:07 +0000 (00:47 +0300)]
Win32: disabled C4306 warnings with MSVC.

Multiple C4306 warnings (conversion from 'type1' to 'type2' of greater size)
appear during 64-bit compilation with MSVC 2010 (and older) due to extensively
used constructs like "(void *) -1", so they were disabled.

In newer MSVC versions C4306 warnings were replaced with C4312 ones, and
these are not generated for such trivial type casts.

3 years agoWin32: removed misleading comment about warnings being disabled.
Maxim Dounin [Tue, 6 Sep 2022 21:47:02 +0000 (00:47 +0300)]
Win32: removed misleading comment about warnings being disabled.

Warnings being disabled are not only from the "-W4" level since e4590dfd97ff.

3 years agoSSL: fixed incorrect usage of #if instead of #ifdef.
Maxim Dounin [Tue, 6 Sep 2022 21:44:10 +0000 (00:44 +0300)]
SSL: fixed incorrect usage of #if instead of #ifdef.

In 2014ed60f17f, "#if SSL_CTRL_SET_ECDH_AUTO" test was incorrectly used
instead of "#ifdef SSL_CTRL_SET_ECDH_AUTO".  There is no practical
difference, since SSL_CTRL_SET_ECDH_AUTO evaluates to a non-zero numeric
value when defined, but anyway it's better to correctly test if the value
is defined.

3 years agoEvents: fixed style and wrong error handling in the iocp module.
Maxim Dounin [Tue, 6 Sep 2022 21:43:51 +0000 (00:43 +0300)]
Events: fixed style and wrong error handling in the iocp module.

3 years agoSSL: logging level of "bad record type" errors.
Murilo Andrade [Tue, 9 Aug 2022 20:13:46 +0000 (17:13 -0300)]
SSL: logging level of "bad record type" errors.

The SSL_R_BAD_RECORD_TYPE ("bad record type") errors are reported by
OpenSSL 1.1.1 or newer when using TLSv1.3 if the client sends a record
with unknown or unexpected type.  These errors are now logged at the
"info" level.

3 years agoVersion bump.
Maxim Dounin [Mon, 29 Aug 2022 22:52:51 +0000 (01:52 +0300)]
Version bump.

3 years agorelease-1.23.1 tag
Maxim Dounin [Tue, 19 Jul 2022 14:05:27 +0000 (17:05 +0300)]
release-1.23.1 tag

3 years agonginx-1.23.1-RELEASE release-1.23.1
Maxim Dounin [Tue, 19 Jul 2022 14:05:27 +0000 (17:05 +0300)]
nginx-1.23.1-RELEASE

3 years agoUpdated OpenSSL used for win32 builds.
Maxim Dounin [Tue, 19 Jul 2022 14:03:30 +0000 (17:03 +0300)]
Updated OpenSSL used for win32 builds.

3 years agoEvents: fixed EPOLLRDHUP with FIONREAD (ticket #2367).
Maxim Dounin [Fri, 15 Jul 2022 12:19:32 +0000 (15:19 +0300)]
Events: fixed EPOLLRDHUP with FIONREAD (ticket #2367).

When reading exactly rev->available bytes, rev->available might become 0
after FIONREAD usage introduction in efd71d49bde0.  On the next call of
ngx_readv_chain() on systems with EPOLLRDHUP this resulted in return without
any actions, that is, with rev->ready set, and this in turn resulted in no
timers set in event pipe, leading to socket leaks.

Fix is to reset rev->ready in ngx_readv_chain() when returning due to
rev->available being 0 with EPOLLRDHUP, much like it is already done in
ngx_unix_recv().  This ensures that if rev->available will become 0, on
systems with EPOLLRDHUP support appropriate EPOLLRDHUP-specific handling
will happen on the next ngx_readv_chain() call.

While here, also synced ngx_readv_chain() to match ngx_unix_recv() and
reset rev->ready when returning due to rev->available being 0 with kqueue.
This is mostly cosmetic change, as rev->ready is anyway reset when
rev->available is set to 0.

3 years agoRange filter: clearing of pre-existing Content-Range headers.
Maxim Dounin [Fri, 15 Jul 2022 04:01:44 +0000 (07:01 +0300)]
Range filter: clearing of pre-existing Content-Range headers.

Some servers might emit Content-Range header on 200 responses, and this
does not seem to contradict RFC 9110: as per RFC 9110, the Content-Range
header has no meaning for status codes other than 206 and 416.  Previously
this resulted in duplicate Content-Range headers in nginx responses handled
by the range filter.  Fix is to clear pre-existing headers.

3 years agoResolver: fixed memory leak for the "ipv4=off" case.
Sergey Kandaurov [Thu, 14 Jul 2022 17:26:54 +0000 (21:26 +0400)]
Resolver: fixed memory leak for the "ipv4=off" case.

This change partially reverts 2a77754cd9fe to properly free rn->query.

Found by Coverity (CID 1507244).

3 years agoThe "ipv4=" parameter of the "resolver" directive.
Ruslan Ermilov [Tue, 12 Jul 2022 17:44:02 +0000 (21:44 +0400)]
The "ipv4=" parameter of the "resolver" directive.

When set to "off", only IPv6 addresses will be resolved, and no
A queries are ever sent (ticket #2196).

3 years agoSSL: logging levels of various errors added in OpenSSL 1.1.1.
Maxim Dounin [Tue, 12 Jul 2022 12:55:22 +0000 (15:55 +0300)]
SSL: logging levels of various errors added in OpenSSL 1.1.1.

Starting with OpenSSL 1.1.1, various additional errors can be reported
by OpenSSL in case of client-related issues, most notably during TLSv1.3
handshakes.  In particular, SSL_R_BAD_KEY_SHARE ("bad key share"),
SSL_R_BAD_EXTENSION ("bad extension"), SSL_R_BAD_CIPHER ("bad cipher"),
SSL_R_BAD_ECPOINT ("bad ecpoint").  These are now logged at the "info"
level.

3 years agoUpstream: optimized use of SSL contexts (ticket #1234).
Maxim Dounin [Tue, 28 Jun 2022 23:47:45 +0000 (02:47 +0300)]
Upstream: optimized use of SSL contexts (ticket #1234).

To ensure optimal use of memory, SSL contexts for proxying are now
inherited from previous levels as long as relevant proxy_ssl_* directives
are not redefined.

Further, when no proxy_ssl_* directives are redefined in a server block,
we now preserve plcf->upstream.ssl in the "http" section configuration
to inherit it to all servers.

Similar changes made in uwsgi, grpc, and stream proxy.

3 years agoVersion bump.
Maxim Dounin [Tue, 28 Jun 2022 23:47:38 +0000 (02:47 +0300)]
Version bump.

3 years agorelease-1.23.0 tag
Maxim Dounin [Tue, 21 Jun 2022 14:25:37 +0000 (17:25 +0300)]
release-1.23.0 tag

3 years agonginx-1.23.0-RELEASE release-1.23.0
Maxim Dounin [Tue, 21 Jun 2022 14:25:36 +0000 (17:25 +0300)]
nginx-1.23.0-RELEASE

3 years agoUpdated OpenSSL used for win32 builds.
Maxim Dounin [Tue, 21 Jun 2022 14:09:34 +0000 (17:09 +0300)]
Updated OpenSSL used for win32 builds.

3 years agoMisc: win32 sources now preserved in release tarballs.
Maxim Dounin [Mon, 20 Jun 2022 16:30:50 +0000 (19:30 +0300)]
Misc: win32 sources now preserved in release tarballs.

This makes it possible to build nginx under Windows from release tarballs
instead of using source code repository.

3 years agoContrib: vim syntax, update core and 3rd party module directives.
Gena Makhomed [Sat, 18 Jun 2022 12:54:40 +0000 (15:54 +0300)]
Contrib: vim syntax, update core and 3rd party module directives.

List of 3rd party modules github repositories are obtained from
https://github.com/freebsd/freebsd-ports/blob/main/www/nginx-devel/Makefile.extmod

3 years agoPerl: removed unused variables, forgotten in ef6a3a99a81a.
Sergey Kandaurov [Tue, 14 Jun 2022 06:39:58 +0000 (10:39 +0400)]
Perl: removed unused variables, forgotten in ef6a3a99a81a.

3 years agoResolver: make TCP write timer event cancelable.
Aleksei Bavshin [Thu, 2 Jun 2022 03:17:23 +0000 (20:17 -0700)]
Resolver: make TCP write timer event cancelable.

Similar to 70e65bf8dfd7, the change is made to ensure that the ability to
cancel resolver tasks is fully controlled by the caller.  As mentioned in the
referenced commit, it is safe to make this timer cancelable because resolve
tasks can have their own timeouts that are not cancelable.

The scenario where this may become a problem is a periodic background resolve
task (not tied to a specific request or a client connection), which receives a
response with short TTL, large enough to warrant fallback to a TCP query.
With each event loop wakeup, we either have a previously set write timer
instance or schedule a new one.  The non-cancelable write timer can delay or
block graceful shutdown of a worker even if the ngx_resolver_ctx_t->cancelable
flag is set by the API user, and there are no other tasks or connections.

We use the resolver API in this way to maintain the list of upstream server
addresses specified with the 'resolve' parameter, and there could be third-party
modules implementing similar logic.

3 years agoStream: don't flush empty buffers created for read errors.
Aleksei Bavshin [Mon, 23 May 2022 18:29:44 +0000 (11:29 -0700)]
Stream: don't flush empty buffers created for read errors.

When we generate the last_buf buffer for an UDP upstream recv error, it does
not contain any data from the wire. ngx_stream_write_filter attempts to forward
it anyways, which is incorrect (e.g., UDP upstream ECONNREFUSED will be
translated to an empty packet).

This happens because we mark the buffer as both 'flush' and 'last_buf', and
ngx_stream_write_filter has special handling for flush with certain types of
connections (see d127837c714f32b0ba4855a6).  The flags are meant to be
mutually exclusive, so the fix is to ensure that flush and last_buf are not set
at the same time.

Reproduction:

stream {
    upstream unreachable {
        server     127.0.0.1:8880;
    }
    server {
        listen     127.0.0.1:8998 udp;
        proxy_pass unreachable;
    }
}

1 0.000000000    127.0.0.1 → 127.0.0.1    UDP 47 45588 → 8998 Len=5
2 0.000166300    127.0.0.1 → 127.0.0.1    UDP 47 51149 → 8880 Len=5
3 0.000172600    127.0.0.1 → 127.0.0.1    ICMP 75 Destination unreachable (Port
unreachable)
4 0.000202400    127.0.0.1 → 127.0.0.1    UDP 42 8998 → 45588 Len=0

Fixes d127837c714f.

3 years agoMp4: fixed potential overflow in ngx_http_mp4_crop_stts_data().
Maxim Dounin [Tue, 7 Jun 2022 18:58:52 +0000 (21:58 +0300)]
Mp4: fixed potential overflow in ngx_http_mp4_crop_stts_data().

Both "count" and "duration" variables are 32-bit, so their product might
potentially overflow.  It is used to reduce 64-bit start_time variable,
and with very large start_time this can result in incorrect seeking.

Found by Coverity (CID 1499904).

3 years agoUpstream: handling of certificates specified as an empty string.
Sergey Kandaurov [Tue, 7 Jun 2022 16:08:57 +0000 (20:08 +0400)]
Upstream: handling of certificates specified as an empty string.

Now, if the directive is given an empty string, such configuration cancels
loading of certificates, in particular, if they would be otherwise inherited
from the previous level.  This restores previous behaviour, before variables
support in certificates was introduced (3ab8e1e2f0f7).

3 years agoUpstream: fixed X-Accel-Expires/Cache-Control/Expires handling.
Maxim Dounin [Mon, 6 Jun 2022 21:07:12 +0000 (00:07 +0300)]
Upstream: fixed X-Accel-Expires/Cache-Control/Expires handling.

Previously, if caching was disabled due to Expires in the past, nginx
failed to cache the response even if it was cacheable as per subsequently
parsed Cache-Control header (ticket #964).

Similarly, if caching was disabled due to Expires in the past,
"Cache-Control: no-cache" or "Cache-Control: max-age=0", caching was not
used if it was cacheable as per subsequently parsed X-Accel-Expires header.

Fix is to avoid disabling caching immediately after parsing Expires in
the past or Cache-Control, but rather set flags which are later checked by
ngx_http_upstream_process_headers() (and cleared by "Cache-Control: max-age"
and X-Accel-Expires).

Additionally, now X-Accel-Expires does not prevent parsing of cache control
extensions, notably stale-while-revalidate and stale-if-error.  This
ensures that order of the X-Accel-Expires and Cache-Control headers is not
important.

Prodded by Vadim Fedorenko and Yugo Horie.

3 years agoUpstream: fixed build without http cache (broken by cd73509f21e2).
Maxim Dounin [Mon, 30 May 2022 21:14:11 +0000 (00:14 +0300)]
Upstream: fixed build without http cache (broken by cd73509f21e2).

3 years agoHeaders filter: improved memory allocation error handling.
Maxim Dounin [Mon, 30 May 2022 18:25:57 +0000 (21:25 +0300)]
Headers filter: improved memory allocation error handling.

3 years agoMultiple WWW-Authenticate headers with "satisfy any;".
Maxim Dounin [Mon, 30 May 2022 18:25:56 +0000 (21:25 +0300)]
Multiple WWW-Authenticate headers with "satisfy any;".

If a module adds multiple WWW-Authenticate headers (ticket #485) to the
response, linked in r->headers_out.www_authenticate, all headers are now
cleared if another module later allows access.

This change is a nop for standard modules, since the only access module which
can add multiple WWW-Authenticate headers is the auth request module, and
it is checked after other standard access modules.  Though this might
affect some third party access modules.

Note that if a 3rd party module adds a single WWW-Authenticate header
and not yet modified to set the header's next pointer to NULL, attempt to
clear such a header with this change will result in a segmentation fault.

3 years agoAuth request: multiple WWW-Authenticate headers (ticket #485).
Maxim Dounin [Mon, 30 May 2022 18:25:54 +0000 (21:25 +0300)]
Auth request: multiple WWW-Authenticate headers (ticket #485).

When using auth_request with an upstream server which returns 401
(Unauthorized), multiple WWW-Authenticate headers from the upstream server
response are now properly copied to the response.

3 years agoUpstream: multiple WWW-Authenticate headers (ticket #485).
Maxim Dounin [Mon, 30 May 2022 18:25:53 +0000 (21:25 +0300)]
Upstream: multiple WWW-Authenticate headers (ticket #485).

When using proxy_intercept_errors and an error page for error 401
(Unauthorized), multiple WWW-Authenticate headers from the upstream server
response are now properly copied to the response.

3 years agoUpstream: handling of multiple Vary headers (ticket #1423).
Maxim Dounin [Mon, 30 May 2022 18:25:51 +0000 (21:25 +0300)]
Upstream: handling of multiple Vary headers (ticket #1423).

Previously, only the last header value was used when caching.

3 years agoUpstream: duplicate headers ignored or properly linked.
Maxim Dounin [Mon, 30 May 2022 18:25:49 +0000 (21:25 +0300)]
Upstream: duplicate headers ignored or properly linked.

Most of the known duplicate upstream response headers are now ignored
with a warning.

If syntax permits multiple headers, these are now properly linked to
the lists, notably Vary and WWW-Authenticate.  This makes it possible
to further handle such lists where it makes sense.

3 years agoUpstream: header handlers can now return parsing errors.
Maxim Dounin [Mon, 30 May 2022 18:25:48 +0000 (21:25 +0300)]
Upstream: header handlers can now return parsing errors.

With this change, duplicate Content-Length and Transfer-Encoding headers
are now rejected.  Further, responses with invalid Content-Length or
Transfer-Encoding headers are now rejected, as well as responses with both
Content-Length and Transfer-Encoding.

3 years agoUpstream: all known headers in u->headers_in are linked lists now.
Maxim Dounin [Mon, 30 May 2022 18:25:46 +0000 (21:25 +0300)]
Upstream: all known headers in u->headers_in are linked lists now.

3 years agoAll known output headers can be linked lists now.
Maxim Dounin [Mon, 30 May 2022 18:25:45 +0000 (21:25 +0300)]
All known output headers can be linked lists now.

The h->next pointer properly provided as NULL in all cases where known
output headers are added.

Note that there are 3rd party modules which might not do this, and it
might be risky to rely on this for arbitrary headers.

3 years agoUpstream: simplified Accept-Ranges handling.
Maxim Dounin [Mon, 30 May 2022 18:25:43 +0000 (21:25 +0300)]
Upstream: simplified Accept-Ranges handling.

The u->headers_in.accept_ranges field is not used anywhere and hence removed.

3 years agoUpstream: simplified Content-Encoding handling.
Maxim Dounin [Mon, 30 May 2022 18:25:42 +0000 (21:25 +0300)]
Upstream: simplified Content-Encoding handling.

Since introduction of offset handling in ngx_http_upstream_copy_header_line()
in revision 573:58475592100c, the ngx_http_upstream_copy_content_encoding()
function is no longer needed, as its behaviour is exactly equivalent to
ngx_http_upstream_copy_header_line() with appropriate offset.  As such,
the ngx_http_upstream_copy_content_encoding() function was removed.

Further, the u->headers_in.content_encoding field is not used anywhere,
so it was removed as well.

Further, Content-Encoding handling no longer depends on NGX_HTTP_GZIP,
as it can be used even without any gzip handling compiled in (for example,
in the charset filter).

3 years agoUpstream: style.
Maxim Dounin [Mon, 30 May 2022 18:25:40 +0000 (21:25 +0300)]
Upstream: style.

3 years agoPerl: combining unknown headers during $r->header_in() lookup.
Maxim Dounin [Mon, 30 May 2022 18:25:38 +0000 (21:25 +0300)]
Perl: combining unknown headers during $r->header_in() lookup.

3 years agoPerl: all known input headers are handled identically.
Maxim Dounin [Mon, 30 May 2022 18:25:36 +0000 (21:25 +0300)]
Perl: all known input headers are handled identically.

As all known input headers are now linked lists, these are now handled
identically.  In particular, this makes it possible to access properly
combined values of headers not specifically handled previously, such
as "Via" or "Connection".

3 years agoAll non-unique input headers are now linked lists.
Maxim Dounin [Mon, 30 May 2022 18:25:35 +0000 (21:25 +0300)]
All non-unique input headers are now linked lists.

The ngx_http_process_multi_header_lines() function is removed, as it is
exactly equivalent to ngx_http_process_header_line().  Similarly,
ngx_http_variable_header() is used instead of ngx_http_variable_headers().

3 years agoReworked multi headers to use linked lists.
Maxim Dounin [Mon, 30 May 2022 18:25:33 +0000 (21:25 +0300)]
Reworked multi headers to use linked lists.

Multi headers are now using linked lists instead of arrays.  Notably,
the following fields were changed: r->headers_in.cookies (renamed
to r->headers_in.cookie), r->headers_in.x_forwarded_for,
r->headers_out.cache_control, r->headers_out.link, u->headers_in.cache_control
u->headers_in.cookies (renamed to u->headers_in.set_cookie).

The r->headers_in.cookies and u->headers_in.cookies fields were renamed
to r->headers_in.cookie and u->headers_in.set_cookie to match header names.

The ngx_http_parse_multi_header_lines() and ngx_http_parse_set_cookie_lines()
functions were changed accordingly.

With this change, multi headers are now essentially equivalent to normal
headers, and following changes will further make them equivalent.

3 years agoCombining unknown headers during variables lookup (ticket #1316).
Maxim Dounin [Mon, 30 May 2022 18:25:32 +0000 (21:25 +0300)]
Combining unknown headers during variables lookup (ticket #1316).

Previously, $http_*, $sent_http_*, $sent_trailer_*, $upstream_http_*,
and $upstream_trailer_* variables returned only the first header (with
a few specially handled exceptions: $http_cookie, $http_x_forwarded_for,
$sent_http_cache_control, $sent_http_link).

With this change, all headers are returned, combined together.  For
example, $http_foo variable will be "a, b" if there are "Foo: a" and
"Foo: b" headers in the request.

Note that $upstream_http_set_cookie will also return all "Set-Cookie"
headers (ticket #1843), though this might not be what one want, since
the "Set-Cookie" header does not follow the list syntax (see RFC 7230,
section 3.2.2).

3 years agoUwsgi: combining headers with identical names (ticket #1724).
Maxim Dounin [Mon, 30 May 2022 18:25:30 +0000 (21:25 +0300)]
Uwsgi: combining headers with identical names (ticket #1724).

The uwsgi specification states that "The uwsgi block vars represent a
dictionary/hash".  This implies that no duplicate headers are expected.

Further, provided headers are expected to follow CGI specification,
which also requires to combine headers (RFC 3875, section "4.1.18.
Protocol-Specific Meta-Variables"): "If multiple header fields with
the same field-name are received then the server MUST rewrite them
as a single value having the same semantics".

3 years agoSCGI: combining headers with identical names (ticket #1724).
Maxim Dounin [Mon, 30 May 2022 18:25:28 +0000 (21:25 +0300)]
SCGI: combining headers with identical names (ticket #1724).

SCGI specification explicitly forbids headers with duplicate names
(section "3. Request Format"): "Duplicate names are not allowed in
the headers".

Further, provided headers are expected to follow CGI specification,
which also requires to combine headers (RFC 3875, section "4.1.18.
Protocol-Specific Meta-Variables"): "If multiple header fields with
the same field-name are received then the server MUST rewrite them
as a single value having the same semantics".

3 years agoFastCGI: combining headers with identical names (ticket #1724).
Maxim Dounin [Mon, 30 May 2022 18:25:27 +0000 (21:25 +0300)]
FastCGI: combining headers with identical names (ticket #1724).

FastCGI responder is expected to receive CGI/1.1 environment variables
in the parameters (see section "6.2 Responder" of the FastCGI specification).
Obviously enough, there cannot be multiple environment variables with
the same name.

Further, CGI specification (RFC 3875, section "4.1.18. Protocol-Specific
Meta-Variables") explicitly requires to combine headers: "If multiple
header fields with the same field-name are received then the server MUST
rewrite them as a single value having the same semantics".

3 years agoPerl: fixed $r->header_in("Connection").
Maxim Dounin [Mon, 30 May 2022 18:25:25 +0000 (21:25 +0300)]
Perl: fixed $r->header_in("Connection").

Previously, the r->header_in->connection pointer was never set despite
being present in ngx_http_headers_in, resulting in incorrect value returned
by $r->header_in("Connection") in embedded perl.

3 years agoFixed runtime handling of systems without EPOLLRDHUP support.
Marcus Ball [Sun, 29 May 2022 23:38:07 +0000 (02:38 +0300)]
Fixed runtime handling of systems without EPOLLRDHUP support.

In 7583:efd71d49bde0 (nginx 1.17.5) along with introduction of the
ioctl(FIONREAD) support proper handling of systems without EPOLLRDHUP
support in the kernel (but with EPOLLRDHUP in headers) was broken.

Before the change, rev->available was never set to 0 unless
ngx_use_epoll_rdhup was also set (that is, runtime test for EPOLLRDHUP
introduced in 6536:f7849bfb6d21 succeeded).  After the change,
rev->available might reach 0 on systems without runtime EPOLLRDHUP
support, stopping further reading in ngx_readv_chain() and ngx_unix_recv().
And, if EOF happened to be already reported along with the last event,
it is not reported again by epoll_wait(), leading to connection hangs
and timeouts on such systems.

This affects Linux kernels before 2.6.17 if nginx was compiled
with newer headers, and, more importantly, emulation layers, such as
DigitalOcean's App Platform's / gVisor's epoll emulation layer.

Fix is to explicitly check ngx_use_epoll_rdhup before the corresponding
rev->pending_eof tests in ngx_readv_chain() and ngx_unix_recv().

3 years agoVersion bump.
Maxim Dounin [Sun, 29 May 2022 23:37:59 +0000 (02:37 +0300)]
Version bump.

3 years agoUpdated OpenSSL and zlib used for win32 builds.
Maxim Dounin [Mon, 23 May 2022 23:51:49 +0000 (02:51 +0300)]
Updated OpenSSL and zlib used for win32 builds.

4 years agoConfigure: recognize arm64 machine name as a synonym for aarch64.
Sergey Kandaurov [Fri, 29 Apr 2022 13:38:01 +0000 (17:38 +0400)]
Configure: recognize arm64 machine name as a synonym for aarch64.

In particular, this sets a reasonable cacheline size on FreeBSD and macOS,
which prefer to use this name and both lack _SC_LEVEL1_DCACHE_LINESIZE.

4 years agoSSL: logging level of "application data after close notify".
Sergey Kandaurov [Tue, 8 Feb 2022 14:35:27 +0000 (17:35 +0300)]
SSL: logging level of "application data after close notify".

Such fatal errors are reported by OpenSSL 1.1.1, and similarly by BoringSSL,
if application data is encountered during SSL shutdown, which started to be
observed on the second SSL_shutdown() call after SSL shutdown fixes made in
09fb2135a589 (1.19.2).  The error means that the client continues to send
application data after receiving the "close_notify" alert (ticket #2318).
Previously it was reported as SSL_shutdown() error of SSL_ERROR_SYSCALL.

4 years agoYear 2022.
Sergey Kandaurov [Fri, 4 Feb 2022 10:29:31 +0000 (13:29 +0300)]
Year 2022.

4 years agoHTTP/2: fixed closed_nodes overflow (ticket #1708).
Maxim Dounin [Thu, 3 Feb 2022 19:46:01 +0000 (22:46 +0300)]
HTTP/2: fixed closed_nodes overflow (ticket #1708).

With large http2_max_concurrent_streams or http2_max_concurrent_pushes, more
than 255 ngx_http_v2_node_t structures might be allocated, eventually leading
to h2c->closed_nodes overflow when closing corresponding streams.  This will
in turn result in additional allocations in ngx_http_v2_get_node_by_id().

While mostly harmless, it can result in excessive memory usage by a HTTP/2
connection, notably in configurations with many keepalive_requests allowed.
Fix is to use ngx_uint_t for h2c->closed_nodes instead of unsigned:8.

4 years agoHTTP/2: made it possible to flush response headers (ticket #1743).
Maxim Dounin [Wed, 2 Feb 2022 22:44:38 +0000 (01:44 +0300)]
HTTP/2: made it possible to flush response headers (ticket #1743).

Response headers can be buffered in the SSL buffer.  But stream's fake
connection buffered flag did not reflect this, so any attempts to flush
the buffer without sending additional data were stopped by the write filter.

It does not seem to be possible to reflect this in fc->buffered though, as
we never known if main connection's c->buffered corresponds to the particular
stream or not.  As such, fc->buffered might prevent request finalization
due to sending data on some other stream.

Fix is to implement handling of flush buffers when the c->need_flush_buf
flag is set, similarly to the existing last buffer handling.  The same
flag is now used for UDP sockets in the stream module instead of explicit
checking of c->type.

4 years agoCache: fixed race in ngx_http_file_cache_forced_expire().
Maxim Dounin [Tue, 1 Feb 2022 13:29:28 +0000 (16:29 +0300)]
Cache: fixed race in ngx_http_file_cache_forced_expire().

During configuration reload two cache managers might exist for a short
time.  If both tried to delete the same cache node, the "ignore long locked
inactive cache entry" alert appeared in logs.  Additionally,
ngx_http_file_cache_forced_expire() might be also called by worker
processes, with similar results.

Fix is to ignore cache nodes being deleted, similarly to how it is
done in ngx_http_file_cache_expire() since 3755:76e3a93821b1.  This
was somehow missed in 7002:ab199f0eb8e8, when ignoring long locked
cache entries was introduced in ngx_http_file_cache_forced_expire().

4 years agoCore: added autotest for UDP segmentation offloading.
Vladimir Homutov [Wed, 26 Jan 2022 17:40:00 +0000 (20:40 +0300)]
Core: added autotest for UDP segmentation offloading.

4 years agoCore: added function for local source address cmsg.
Vladimir Homutov [Tue, 25 Jan 2022 12:48:58 +0000 (15:48 +0300)]
Core: added function for local source address cmsg.

4 years agoCore: made the ngx_sendmsg() function non-static.
Vladimir Homutov [Tue, 25 Jan 2022 12:48:56 +0000 (15:48 +0300)]
Core: made the ngx_sendmsg() function non-static.

The NGX_HAVE_ADDRINFO_CMSG macro is defined when at least one of methods
to deal with corresponding control message is available.

4 years agoCore: the ngx_event_udp.h header file.
Vladimir Homutov [Tue, 25 Jan 2022 12:41:48 +0000 (15:41 +0300)]
Core: the ngx_event_udp.h header file.

4 years agoVersion bump.
Vladimir Homutov [Thu, 27 Jan 2022 10:44:09 +0000 (13:44 +0300)]
Version bump.

4 years agorelease-1.21.6 tag
Maxim Dounin [Tue, 25 Jan 2022 15:03:52 +0000 (18:03 +0300)]
release-1.21.6 tag

4 years agonginx-1.21.6-RELEASE release-1.21.6
Maxim Dounin [Tue, 25 Jan 2022 15:03:51 +0000 (18:03 +0300)]
nginx-1.21.6-RELEASE

4 years agoSSL: always renewing tickets with TLSv1.3 (ticket #1892).
Maxim Dounin [Mon, 24 Jan 2022 14:18:50 +0000 (17:18 +0300)]
SSL: always renewing tickets with TLSv1.3 (ticket #1892).

Chrome only uses TLS session tickets once with TLS 1.3, likely following
RFC 8446 Appendix C.4 recommendation.  With OpenSSL, this works fine with
built-in session tickets, since these are explicitly renewed in case of
TLS 1.3 on each session reuse, but results in only two connections being
reused after an initial handshake when using ssl_session_ticket_key.

Fix is to always renew TLS session tickets in case of TLS 1.3 when using
ssl_session_ticket_key, similarly to how it is done by OpenSSL internally.

4 years agoContrib: vim syntax adjusted to save cpoptions (ticket #2276).
Maxim Dounin [Fri, 21 Jan 2022 21:28:51 +0000 (00:28 +0300)]
Contrib: vim syntax adjusted to save cpoptions (ticket #2276).

Line continuation as used in the syntax file might be broken if "compatible"
is set or "C" is added to cpoptions.  Fix is to set the "cpoptions" option
to vim default value at script start and restore it later, see
":help use-cpo-save".

4 years agoCore: simplify reader lock release.
Pavel Pautov [Thu, 20 Jan 2022 01:37:34 +0000 (17:37 -0800)]
Core: simplify reader lock release.

4 years agoSSL: free pkey on SSL_CTX_set0_tmp_dh_pkey() failure.
Sergey Kandaurov [Mon, 17 Jan 2022 14:05:12 +0000 (17:05 +0300)]
SSL: free pkey on SSL_CTX_set0_tmp_dh_pkey() failure.

The behaviour was changed in OpenSSL 3.0.1:
https://git.openssl.org/?p=openssl.git;a=commitdiff;h=bf17b7b

4 years agoAvoid sending "Connection: keep-alive" when shutting down.
Maxim Dounin [Mon, 10 Jan 2022 23:23:49 +0000 (02:23 +0300)]
Avoid sending "Connection: keep-alive" when shutting down.

When a worker process is shutting down, keepalive is not used: this is checked
before the ngx_http_set_keepalive() call in ngx_http_finalize_connection().
Yet the "Connection: keep-alive" header was still sent, even if we know that
the worker process is shutting down, potentially resulting in additional
requests being sent to the connection which is going to be closed anyway.
While clients are expected to be able to handle asynchronous close events
(see ticket #1022), it is certainly possible to send the "Connection: close"
header instead, informing the client that the connection is going to be closed
and potentially saving some unneeded work.

With this change, we additionally check for worker process shutdown just
before sending response headers, and disable keepalive accordingly.

4 years agoEvents: fixed balancing between workers with EPOLLEXCLUSIVE.
Maxim Dounin [Wed, 29 Dec 2021 22:08:46 +0000 (01:08 +0300)]
Events: fixed balancing between workers with EPOLLEXCLUSIVE.

Linux with EPOLLEXCLUSIVE usually notifies only the process which was first
to add the listening socket to the epoll instance.  As a result most of the
connections are handled by the first worker process (ticket #2285).  To fix
this, we re-add the socket periodically, so other workers will get a chance
to accept connections.

4 years agoVersion bump.
Maxim Dounin [Wed, 29 Dec 2021 19:59:53 +0000 (22:59 +0300)]
Version bump.

4 years agorelease-1.21.5 tag
Maxim Dounin [Tue, 28 Dec 2021 15:28:38 +0000 (18:28 +0300)]
release-1.21.5 tag

4 years agonginx-1.21.5-RELEASE release-1.21.5
Maxim Dounin [Tue, 28 Dec 2021 15:28:37 +0000 (18:28 +0300)]
nginx-1.21.5-RELEASE

4 years agoUpdated OpenSSL and PCRE used for win32 builds.
Maxim Dounin [Tue, 28 Dec 2021 14:56:16 +0000 (17:56 +0300)]
Updated OpenSSL and PCRE used for win32 builds.

4 years agoSupport for sendfile(SF_NOCACHE).
Maxim Dounin [Mon, 27 Dec 2021 16:49:26 +0000 (19:49 +0300)]
Support for sendfile(SF_NOCACHE).

The SF_NOCACHE flag, introduced in FreeBSD 11 along with the new non-blocking
sendfile() implementation by glebius@, makes it possible to use sendfile()
along with the "directio" directive.

4 years agoSSL: SSL_sendfile(SF_NODISKIO) support.
Maxim Dounin [Mon, 27 Dec 2021 16:48:42 +0000 (19:48 +0300)]
SSL: SSL_sendfile(SF_NODISKIO) support.

4 years agoSimplified sendfile(SF_NODISKIO) usage.
Maxim Dounin [Mon, 27 Dec 2021 16:48:33 +0000 (19:48 +0300)]
Simplified sendfile(SF_NODISKIO) usage.

Starting with FreeBSD 11, there is no need to use AIO operations to preload
data into cache for sendfile(SF_NODISKIO) to work.  Instead, sendfile()
handles non-blocking loading data from disk by itself.  It still can, however,
return EBUSY if a page is already being loaded (for example, by a different
process).  If this happens, we now post an event for the next event loop
iteration, so sendfile() is retried "after a short period", as manpage
recommends.

The limit of the number of EBUSY tolerated without any progress is preserved,
but now it does not result in an alert, since on an idle system event loop
iteration might be very short and EBUSY can happen many times in a row.
Instead, SF_NODISKIO is simply disabled for one call once the limit is
reached.

With this change, sendfile(SF_NODISKIO) is now used automatically as long as
sendfile() is enabled, and no longer requires "aio on;".

4 years agoRemoved "aio sendfile", deprecated since 1.7.11.
Maxim Dounin [Mon, 27 Dec 2021 16:47:05 +0000 (19:47 +0300)]
Removed "aio sendfile", deprecated since 1.7.11.

4 years agoCore: added NGX_REGEX_MULTILINE for 3rd party modules.
Maxim Dounin [Fri, 24 Dec 2021 22:07:18 +0000 (01:07 +0300)]
Core: added NGX_REGEX_MULTILINE for 3rd party modules.

Notably, NAXSI is known to misuse ngx_regex_compile() with rc.options set
to PCRE_CASELESS | PCRE_MULTILINE.  With PCRE2 support, and notably binary
compatibility changes, it is no longer possible to set PCRE[2]_MULTILINE
option without using proper interface.  To facilitate correct usage,
this change adds the NGX_REGEX_MULTILINE option.

4 years agoPCRE2 and PCRE binary compatibility.
Maxim Dounin [Fri, 24 Dec 2021 22:07:16 +0000 (01:07 +0300)]
PCRE2 and PCRE binary compatibility.

With this change, dynamic modules using nginx regex interface can be used
regardless of the variant of the PCRE library nginx was compiled with.

If a module is compiled with different PCRE library variant, in case of
ngx_regex_exec() errors it will report wrong function name in error
messages.  This is believed to be tolerable, given that fixing this will
require interface changes.

4 years agoPCRE2 library support.
Maxim Dounin [Fri, 24 Dec 2021 22:07:15 +0000 (01:07 +0300)]
PCRE2 library support.

The PCRE2 library is now used by default if found, instead of the
original PCRE library.  If needed for some reason, this can be disabled
with the --without-pcre2 configure option.

To make it possible to specify paths to the library and include files
via --with-cc-opt / --with-ld-opt, the library is first tested without
any additional paths and options.  If this fails, the pcre2-config script
is used.

Similarly to the original PCRE library, it is now possible to build PCRE2
from sources with nginx configure, by using the --with-pcre= option.
It automatically detects if PCRE or PCRE2 sources are provided.

Note that compiling PCRE2 10.33 and later requires inttypes.h.  When
compiling on Windows with MSVC, inttypes.h is only available starting
with MSVC 2013.  In older versions some replacement needs to be provided
("echo '#include <stdint.h>' > pcre2-10.xx/src/inttypes.h" is good enough
for MSVC 2010).

The interface on nginx side remains unchanged.

4 years agoConfigure: simplified PCRE compilation.
Maxim Dounin [Fri, 24 Dec 2021 22:07:14 +0000 (01:07 +0300)]
Configure: simplified PCRE compilation.

Removed ICC-specific PCRE optimizations which tried to link with PCRE
object files instead of the library.  Made compiler-specific code
minimal.

4 years agoCore: ngx_regex.c style cleanup.
Maxim Dounin [Fri, 24 Dec 2021 22:07:12 +0000 (01:07 +0300)]
Core: ngx_regex.c style cleanup.

Notably, ngx_pcre_pool and ngx_pcre_studies are renamed to ngx_regex_pool
and ngx_regex_studies, respectively.

4 years agoCore: fixed ngx_pcre_studies cleanup.
Maxim Dounin [Fri, 24 Dec 2021 22:07:10 +0000 (01:07 +0300)]
Core: fixed ngx_pcre_studies cleanup.

If a configuration parsing fails for some reason, ngx_regex_module_init()
is not called, and ngx_pcre_studies remained set despite the fact that
the pool it was allocated from is already freed.  This might result in
a segmentation fault during runtime regular expression compilation, such
as in SSI, for example, in the single process mode, or if a worker process
died and was respawned from a master process in such an inconsistent state.

Fix is to clear ngx_pcre_studies from the pool cleanup handler (which is
anyway used to free JIT-compiled patterns).

4 years agoMoved Huffman coding out of HTTP/2.
Ruslan Ermilov [Tue, 21 Dec 2021 04:54:16 +0000 (07:54 +0300)]
Moved Huffman coding out of HTTP/2.

ngx_http_v2_huff_decode.c and ngx_http_v2_huff_encode.c are renamed
to ngx_http_huff_decode.c and ngx_http_huff_encode.c.

4 years agoContrib: vim syntax, update core and 3rd party module directives.
Gena Makhomed [Mon, 20 Dec 2021 18:02:48 +0000 (20:02 +0200)]
Contrib: vim syntax, update core and 3rd party module directives.

4 years agoHTTP/2: fixed sendfile() aio handling.
Maxim Dounin [Thu, 25 Nov 2021 19:02:10 +0000 (22:02 +0300)]
HTTP/2: fixed sendfile() aio handling.

With sendfile() in threads ("aio threads; sendfile on;"), client connection
can block on writing, waiting for sendfile() to complete.  In HTTP/2 this
might result in the request hang, since an attempt to continue processing
in thread event handler will call request's write event handler, which
is usually stopped by ngx_http_v2_send_chain(): it does nothing if there
are no additional data and stream->queued is set.  Further, HTTP/2 resets
stream's c->write->ready to 0 if writing blocks, so just fixing
ngx_http_v2_send_chain() is not enough.

Can be reproduced with test suite on Linux with:

TEST_NGINX_GLOBALS_HTTP="aio threads; sendfile on;" prove h2*.t

The following tests currently fail: h2_keepalive.t, h2_priority.t,
h2_proxy_max_temp_file_size.t, h2.t, h2_trailers.t.

Similarly, sendfile() with AIO preloading on FreeBSD can block as well,
with similar results.  This is, however, harder to reproduce, especially
on modern FreeBSD systems, since sendfile() usually does not return EBUSY.

Fix is to modify ngx_http_v2_send_chain() so it actually tries to send
data to the main connection when called, and to make sure that
c->write->ready is set by the relevant event handlers.

4 years agoHTTP/2: fixed "task already active" with sendfile in threads.
Maxim Dounin [Thu, 25 Nov 2021 19:02:05 +0000 (22:02 +0300)]
HTTP/2: fixed "task already active" with sendfile in threads.

With sendfile in threads, "task already active" alerts might appear in logs
if a write event happens on the main HTTP/2 connection, triggering a sendfile
in threads while another thread operation is already running.  Observed
with "aio threads; aio_write on; sendfile on;" and with thread event handlers
modified to post a write event to the main HTTP/2 connection (though can
happen without any modifications).

Similarly, sendfile() with AIO preloading on FreeBSD can trigger duplicate
aio operation, resulting in "second aio post" alerts.  This is, however,
harder to reproduce, especially on modern FreeBSD systems, since sendfile()
usually does not return EBUSY.

Fix is to avoid starting a sendfile operation if other thread operation
is active by checking r->aio in the thread handler (and, similarly, in
aio preload handler).  The added check also makes duplicate calls protection
redundant, so it is removed.

4 years agoSSL: $ssl_curve (ticket #2135).
Sergey Kandaurov [Mon, 1 Nov 2021 15:09:34 +0000 (18:09 +0300)]
SSL: $ssl_curve (ticket #2135).

The variable contains a negotiated curve used for the handshake key
exchange process.  Known curves are listed by their names, unknown
ones are shown in hex.

Note that for resumed sessions in TLSv1.2 and older protocols,
$ssl_curve contains the curve used during the initial handshake,
while in TLSv1.3 it contains the curve used during the session
resumption (see the SSL_get_negotiated_group manual page for
details).

The variable is only meaningful when using OpenSSL 3.0 and above.
With older versions the variable is empty.

4 years agoVersion bump.
Sergey Kandaurov [Tue, 23 Nov 2021 09:52:43 +0000 (12:52 +0300)]
Version bump.

4 years agorelease-1.21.4 tag
Maxim Dounin [Tue, 2 Nov 2021 14:49:22 +0000 (17:49 +0300)]
release-1.21.4 tag

4 years agonginx-1.21.4-RELEASE release-1.21.4
Maxim Dounin [Tue, 2 Nov 2021 14:49:22 +0000 (17:49 +0300)]
nginx-1.21.4-RELEASE