]> git.kaiwu.me - nginx.git/log
nginx.git
17 months agoSCGI: added create_loc_conf comments.
Sergey Kandaurov [Tue, 8 Oct 2024 14:24:00 +0000 (18:24 +0400)]
SCGI: added create_loc_conf comments.

17 months agoFastCGI: fixed create_loc_conf comments after 05b1a8f1e.
Sergey Kandaurov [Tue, 8 Oct 2024 13:48:15 +0000 (17:48 +0400)]
FastCGI: fixed create_loc_conf comments after 05b1a8f1e.

17 months agoSSL: fixed MSVC compilation after ebd18ec1812b.
蕭澧邦 [Sun, 3 Nov 2024 06:36:17 +0000 (14:36 +0800)]
SSL: fixed MSVC compilation after ebd18ec1812b.

MSVC generates a compilation error in case #if/#endif is used in a macro
parameter.

18 months agoUpstream: copy upstream zone DNS valid time during config reload.
Mini Hawthorne [Wed, 12 Jul 2023 19:20:45 +0000 (12:20 -0700)]
Upstream: copy upstream zone DNS valid time during config reload.

Previously, all upstream DNS entries would be immediately re-resolved
on config reload.  With a large number of upstreams, this creates
a spike of DNS resolution requests.  These spikes can overwhelm the
DNS server or cause drops on the network.

This patch retains the TTL of previous resolutions across reloads
by copying each upstream's name's expiry time across configuration
cycles.  As a result, no additional resolutions are needed.

18 months agoUpstream: per-upstream resolver.
Vladimir Homutov [Fri, 18 Oct 2019 13:33:15 +0000 (16:33 +0300)]
Upstream: per-upstream resolver.

The "resolver" and "resolver_timeout" directives can now be specified
directly in the "upstream" block.

18 months agoUpstream: pre-resolve servers on reload.
Ruslan Ermilov [Fri, 3 Nov 2017 19:22:23 +0000 (22:22 +0300)]
Upstream: pre-resolve servers on reload.

After configuration is reloaded, it may take some time for the
re-resolvable upstream servers to resolve and become available
as peers.  During this time, client requests might get dropped.

Such servers are now pre-resolved using the "cache" of already
resolved peers from the old shared memory zone.

18 months agoCore: inheritance of non-reusable shared memory zones.
Ruslan Ermilov [Fri, 3 Nov 2017 19:22:21 +0000 (22:22 +0300)]
Core: inheritance of non-reusable shared memory zones.

When re-creating a non-reusable zone, make the pointer to the old zone
available during the new zone initialization.

18 months agoUpstream: construct upstream peers from DNS SRV records.
Dmitry Volyntsev [Thu, 17 Mar 2016 15:42:31 +0000 (18:42 +0300)]
Upstream: construct upstream peers from DNS SRV records.

18 months agoUpstream: re-resolvable servers.
Ruslan Ermilov [Sat, 15 Feb 2014 11:12:34 +0000 (15:12 +0400)]
Upstream: re-resolvable servers.

Specifying the upstream server by a hostname together with the
"resolve" parameter will make the hostname to be periodically
resolved, and upstream servers added/removed as necessary.

This requires a "resolver" at the "http" configuration block.

The "resolver_timeout" parameter also affects when the failed
DNS requests will be attempted again.  Responses with NXDOMAIN
will be attempted again in 10 seconds.

Upstream has a configuration generation number that is incremented each
time servers are added/removed to the primary/backup list.  This number
is remembered by the peer.init method, and if peer.get detects a change
in configuration, it returns NGX_BUSY.

Each server has a reference counter.  It is incremented by peer.get and
decremented by peer.free.  When a server is removed, it is removed from
the list of servers and is marked as "zombie".  The memory allocated by
a zombie peer is freed only when its reference count becomes zero.

Co-authored-by: Roman Arutyunyan <arut@nginx.com>
Co-authored-by: Sergey Kandaurov <pluknet@nginx.com>
Co-authored-by: Vladimir Homutov <vl@nginx.com>
18 months agoSSL: disabled TLSv1 and TLSv1.1 by default.
Sergey Kandaurov [Wed, 9 Oct 2024 16:28:00 +0000 (20:28 +0400)]
SSL: disabled TLSv1 and TLSv1.1 by default.

TLSv1 and TLSv1.1 are formally deprecated and forbidden to negotiate due
to insufficient security reasons outlined in RFC 8996.

TLSv1 and TLSv1.1 are disabled in BoringSSL e95b0cad9 and LibreSSL 3.8.1
in the way they cannot be enabled in nginx configuration.  In OpenSSL 3.0,
they are only permitted at security level 0 (disabled by default).

The support is dropped in Chrome 84, Firefox 78, and deprecated in Safari.

This change disables TLSv1 and TLSv1.1 by default for OpenSSL 1.0.1 and
newer, where TLSv1.2 support is available.  For older library versions,
which do not have alternatives, these protocol versions remain enabled.

18 months agoUpdated security policy to include disclosure details.
jzebor-at-f5 [Fri, 11 Oct 2024 16:48:53 +0000 (09:48 -0700)]
Updated security policy to include disclosure details.

18 months agoConfigure: MSVC compatibility with PCRE2 10.43.
Thierry Bastian [Wed, 9 Oct 2024 07:18:49 +0000 (09:18 +0200)]
Configure: MSVC compatibility with PCRE2 10.43.

19 months agoQUIC: prevent deleted stream frame retransmissions.
nandsky [Mon, 30 Sep 2024 12:51:17 +0000 (20:51 +0800)]
QUIC: prevent deleted stream frame retransmissions.

Since a2a513b93cae, stream frames no longer need to be retransmitted after it
was deleted.  The frames which were retransmitted before, could be stream data
frames sent prior to a RESET_STREAM. Such retransmissions are explicitly
prohibited by RFC 9000, Section 19.4.

19 months agoVersion bump.
Sergey Kandaurov [Mon, 7 Oct 2024 15:10:39 +0000 (19:10 +0400)]
Version bump.

19 months agonginx-1.27.2-RELEASE release-1.27.2
Sergey Kandaurov [Tue, 1 Oct 2024 19:59:48 +0000 (23:59 +0400)]
nginx-1.27.2-RELEASE

19 months agoUpdated OpenSSL used for win32 builds.
Sergey Kandaurov [Tue, 1 Oct 2024 15:23:45 +0000 (19:23 +0400)]
Updated OpenSSL used for win32 builds.

19 months agoSSL: caching CA certificates.
Sergey Kandaurov [Mon, 9 Sep 2024 15:05:58 +0000 (19:05 +0400)]
SSL: caching CA certificates.

This can potentially provide a large amount of savings,
because CA certificates can be quite large.

Based on previous work by Mini Hawthorne.

19 months agoSSL: caching CRLs.
Sergey Kandaurov [Mon, 9 Sep 2024 15:05:31 +0000 (19:05 +0400)]
SSL: caching CRLs.

Based on previous work by Mini Hawthorne.

19 months agoSSL: caching certificate keys.
Sergey Kandaurov [Mon, 9 Sep 2024 15:04:18 +0000 (19:04 +0400)]
SSL: caching certificate keys.

EVP_KEY objects are a reference-counted container for key material, shallow
copies and OpenSSL stack management aren't needed as with certificates.

Based on previous work by Mini Hawthorne.

19 months agoSSL: caching certificates.
Sergey Kandaurov [Mon, 9 Sep 2024 15:03:52 +0000 (19:03 +0400)]
SSL: caching certificates.

Certificate chains are now loaded once.

The certificate cache provides each chain as a unique stack of reference
counted elements.  This shallow copy is required because OpenSSL stacks
aren't reference counted.

Based on previous work by Mini Hawthorne.

19 months agoSSL: object caching.
Sergey Kandaurov [Mon, 9 Sep 2024 15:03:20 +0000 (19:03 +0400)]
SSL: object caching.

Added ngx_openssl_cache_module, which indexes a type-aware object cache.
It maps an id to a unique instance, and provides references to it, which
are dropped when the cycle's pool is destroyed.

The cache will be used in subsequent patches.

Based on previous work by Mini Hawthorne.

19 months agoSSL: moved certificate storage out of exdata.
Sergey Kandaurov [Mon, 9 Sep 2024 15:02:27 +0000 (19:02 +0400)]
SSL: moved certificate storage out of exdata.

Instead of cross-linking the objects using exdata, pointers to configured
certificates are now stored in ngx_ssl_t, and OCSP staples are now accessed
with rbtree in it.  This allows sharing these objects between SSL contexts.

Based on previous work by Mini Hawthorne.

19 months agoFixed a typo of bpf makefile debug option.
tzssangglass [Mon, 9 Sep 2024 15:22:34 +0000 (23:22 +0800)]
Fixed a typo of bpf makefile debug option.

19 months agoAdded new primary README.md file.
Michael Vernik [Sun, 1 Sep 2024 05:42:09 +0000 (22:42 -0700)]
Added new primary README.md file.

19 months agoSSL: optional ssl_client_certificate for ssl_verify_client.
Sergey Kandaurov [Fri, 20 Sep 2024 10:08:42 +0000 (14:08 +0400)]
SSL: optional ssl_client_certificate for ssl_verify_client.

Starting from TLSv1.1 (as seen since draft-ietf-tls-rfc2246-bis-00),
the "certificate_authorities" field grammar of the CertificateRequest
message was redone to allow no distinguished names.  In TLSv1.3, with
the restructured CertificateRequest message, this can be similarly
done by optionally including the "certificate_authorities" extension.
This allows to avoid sending DNs at all.

In practice, aside from published TLS specifications, all supported
SSL/TLS libraries allow to request client certificates with an empty
DN list for any protocol version.  For instance, when operating in
TLSv1, this results in sending the "certificate_authorities" list as
a zero-length vector, which corresponds to the TLSv1.1 specification.
Such behaviour goes back to SSLeay.

The change relaxes the requirement to specify at least one trusted CA
certificate in the ssl_client_certificate directive, which resulted in
sending DNs of these certificates (closes #142).  Instead, all trusted
CA certificates can be specified now using the ssl_trusted_certificate
directive if needed.  A notable difference that certificates specified
in ssl_trusted_certificate are always loaded remains (see 3648ba7db).

Co-authored-by: Praveen Chaudhary <praveenc@nvidia.com>
19 months agoProxy: proxy_pass_trailers directive.
Sergey Kandaurov [Tue, 10 Sep 2024 12:48:11 +0000 (16:48 +0400)]
Proxy: proxy_pass_trailers directive.

The directive allows to pass upstream response trailers to client.

20 months agoFixed a typo in win-utf.
Shaikh Yaser [Thu, 5 Sep 2024 15:17:54 +0000 (20:47 +0530)]
Fixed a typo in win-utf.

20 months agoAdded CI based on GitHub Actions.
Konstantin Pavlov [Thu, 18 Jul 2024 20:42:43 +0000 (13:42 -0700)]
Added CI based on GitHub Actions.

Pushes to master and stable branches will result in buildbot-like checks
on multiple OSes and architectures.

Pull requests will be checked on a public Ubuntu GitHub runner.

20 months agoAdded GitHub templates.
Maryna Herasimovich [Thu, 29 Aug 2024 20:06:48 +0000 (13:06 -0700)]
Added GitHub templates.

20 months agoAdded contributing guidelines.
Maryna Herasimovich [Thu, 29 Aug 2024 03:43:08 +0000 (20:43 -0700)]
Added contributing guidelines.

20 months agoAdded security policy.
Maryna Herasimovich [Thu, 29 Aug 2024 03:51:54 +0000 (20:51 -0700)]
Added security policy.

20 months agoAdded Code of Conduct.
Maryna Herasimovich [Thu, 29 Aug 2024 03:13:13 +0000 (20:13 -0700)]
Added Code of Conduct.

20 months agoRemoved C-style comments from LICENSE.
Roman Arutyunyan [Thu, 29 Aug 2024 13:14:25 +0000 (17:14 +0400)]
Removed C-style comments from LICENSE.

20 months agoMoved LICENSE and README to root.
Roman Arutyunyan [Thu, 29 Aug 2024 12:24:03 +0000 (16:24 +0400)]
Moved LICENSE and README to root.

20 months agoSwitched GNUmakefile from hg to git.
Roman Arutyunyan [Thu, 29 Aug 2024 12:03:58 +0000 (16:03 +0400)]
Switched GNUmakefile from hg to git.

20 months agoRemoved .hgtags file.
Roman Arutyunyan [Thu, 29 Aug 2024 12:03:27 +0000 (16:03 +0400)]
Removed .hgtags file.

20 months agoStream: OCSP stapling. default
Sergey Kandaurov [Thu, 22 Aug 2024 10:57:46 +0000 (14:57 +0400)]
Stream: OCSP stapling.

20 months agoStream: client certificate validation with OCSP.
Sergey Kandaurov [Thu, 22 Aug 2024 10:57:45 +0000 (14:57 +0400)]
Stream: client certificate validation with OCSP.

20 months agoVersion bump.
Sergey Kandaurov [Tue, 20 Aug 2024 17:18:30 +0000 (21:18 +0400)]
Version bump.

20 months agorelease-1.27.1 tag
Sergey Kandaurov [Mon, 12 Aug 2024 14:21:01 +0000 (18:21 +0400)]
release-1.27.1 tag

20 months agonginx-1.27.1-RELEASE release-1.27.1
Sergey Kandaurov [Mon, 12 Aug 2024 14:20:52 +0000 (18:20 +0400)]
nginx-1.27.1-RELEASE

20 months agoUpdated OpenSSL used for win32 builds.
Sergey Kandaurov [Mon, 12 Aug 2024 14:20:49 +0000 (18:20 +0400)]
Updated OpenSSL used for win32 builds.

20 months agoMp4: rejecting unordered chunks in stsc atom.
Roman Arutyunyan [Mon, 12 Aug 2024 14:20:45 +0000 (18:20 +0400)]
Mp4: rejecting unordered chunks in stsc atom.

Unordered chunks could result in trak->end_chunk smaller than trak->start_chunk
in ngx_http_mp4_crop_stsc_data().  Later in ngx_http_mp4_update_stco_atom()
this caused buffer overread while trying to calculate trak->end_offset.

20 months agoMp4: fixed buffer underread while updating stsz atom.
Roman Arutyunyan [Mon, 12 Aug 2024 14:20:43 +0000 (18:20 +0400)]
Mp4: fixed buffer underread while updating stsz atom.

While cropping an stsc atom in ngx_http_mp4_crop_stsc_data(), a 32-bit integer
overflow could happen, which could result in incorrect seeking and a very large
value stored in "samples".  This resulted in a large invalid value of
trak->end_chunk_samples.  This value is further used to calculate the value of
trak->end_chunk_samples_size in ngx_http_mp4_update_stsz_atom().  While doing
this, a large invalid value of trak->end_chunk_samples could result in reading
memory before stsz atom start.  This could potentially result in a segfault.

21 months agoStream ssl_preread: do not reallocate a parsed SNI host.
Sergey Kandaurov [Fri, 9 Aug 2024 15:12:26 +0000 (19:12 +0400)]
Stream ssl_preread: do not reallocate a parsed SNI host.

We own this memory from the session pool.

21 months agoQUIC: zero out existing keying material only.
Sergey Kandaurov [Fri, 9 Aug 2024 15:12:26 +0000 (19:12 +0400)]
QUIC: zero out existing keying material only.

Previously, this used to have extra ngx_explicit_memzero() calls
from within ngx_quic_keys_cleanup(), which might be suboptimal.

21 months agoQUIC: discarding 0-RTT keys.
Sergey Kandaurov [Fri, 9 Aug 2024 15:12:25 +0000 (19:12 +0400)]
QUIC: discarding 0-RTT keys.

For simplicity, this is done on successful decryption of a 1-RTT packet.

21 months agoTypo fixed.
Sergey Kandaurov [Fri, 9 Aug 2024 15:12:23 +0000 (19:12 +0400)]
Typo fixed.

21 months agoVersion bump.
Sergey Kandaurov [Fri, 9 Aug 2024 14:01:42 +0000 (18:01 +0400)]
Version bump.

21 months agoHTTP/2: close connections initialized during graceful shutdown.
Kasei Wang [Thu, 18 Jul 2024 13:43:25 +0000 (17:43 +0400)]
HTTP/2: close connections initialized during graceful shutdown.

In some rare cases, graceful shutdown may happen while initializing an HTTP/2
connection.  Previously, such a connection ignored the shutdown and remained
active.  Now it is gracefully closed prior to processing any streams to
eliminate the shutdown delay.

22 months agoStream: allow servers with no handler.
Roman Arutyunyan [Thu, 27 Jun 2024 13:29:56 +0000 (17:29 +0400)]
Stream: allow servers with no handler.

Previously handlers were mandatory.  However they are not always needed.
For example, a server configured with ssl_reject_handshake does not need a
handler.  Such servers required a fake handler to pass the check.  Now handler
absence check is moved to runtime.  If handler is missing, the connection is
closed with 500 code.

23 months agorelease-1.27.0 tag
Sergey Kandaurov [Tue, 28 May 2024 13:22:30 +0000 (17:22 +0400)]
release-1.27.0 tag

23 months agonginx-1.27.0-RELEASE release-1.27.0
Sergey Kandaurov [Tue, 28 May 2024 13:19:38 +0000 (17:19 +0400)]
nginx-1.27.0-RELEASE

23 months agoHTTP/3: fixed handling of zero-length literal field line.
Sergey Kandaurov [Tue, 28 May 2024 13:20:45 +0000 (17:20 +0400)]
HTTP/3: fixed handling of zero-length literal field line.

Previously, st->value was passed with NULL data pointer to header handlers.

23 months agoQUIC: ngx_quic_buffer_t use-after-free protection.
Roman Arutyunyan [Tue, 28 May 2024 13:19:21 +0000 (17:19 +0400)]
QUIC: ngx_quic_buffer_t use-after-free protection.

Previously the last chain field of ngx_quic_buffer_t could still reference freed
chains and buffers after calling ngx_quic_free_buffer().  While normally an
ngx_quic_buffer_t object should not be used after freeing, resetting last_chain
field would prevent a potential use-after-free.

23 months agoQUIC: ignore CRYPTO frames after handshake completion.
Roman Arutyunyan [Tue, 28 May 2024 13:19:08 +0000 (17:19 +0400)]
QUIC: ignore CRYPTO frames after handshake completion.

Sending handshake-level CRYPTO frames after the client's Finished message could
lead to memory disclosure and a potential segfault, if those frames are sent in
one packet with the Finished frame.

23 months agoHTTP/3: fixed dynamic table overflow.
Roman Arutyunyan [Tue, 28 May 2024 13:18:50 +0000 (17:18 +0400)]
HTTP/3: fixed dynamic table overflow.

While inserting a new entry into the dynamic table, first the entry is added,
and then older entries are evicted until table size is within capacity.  After
the first step, the number of entries may temporarily exceed the maximum
calculated from capacity by one entry, which previously caused table overflow.

The easiest way to trigger the issue is to keep adding entries with empty names
and values until first eviction.

The issue was introduced by 987bee4363d1.

23 months agoHTTP/3: decoder stream pre-creation.
Roman Arutyunyan [Tue, 28 May 2024 13:18:28 +0000 (17:18 +0400)]
HTTP/3: decoder stream pre-creation.

Previously a decoder stream was created on demand for sending Section
Acknowledgement, Stream Cancellation and Insert Count Increment.  If conditions
for sending any of these instructions never happen, a decoder stream is not
created at all.  These conditions include client not using the dynamic table and
no streams abandoned by server (RFC 9204, Section 2.2.2.2).  However RFC 9204,
Section 4.2 defines only one condition for not creating a decoder stream:

   An endpoint MAY avoid creating a decoder stream if its decoder sets
   the maximum capacity of the dynamic table to zero.

The change enables pre-creation of the decoder stream at HTTP/3 session
initialization if maximum dynamic table capacity is not zero.  Note that this
value is currently hardcoded to 4096 bytes and is not configurable, so the
stream is now always created.

Also, the change fixes a potential stack overflow when creating a decoder
stream in ngx_http_v3_send_cancel_stream() while draining a request stream by
ngx_drain_connections().  Creating a decoder stream involves calling
ngx_get_connection(), which calls ngx_drain_connections(), which will drain the
same request stream again.  If client's MAX_STREAMS for uni stream is high
enough, these recursive calls will continue until we run out of stack.
Otherwise, decoder stream creation will fail at some point and the request
stream connection will be drained.  This may result in use-after-free, since
this connection could still be referenced up the stack.

23 months agoQUIC: client transport parameter data length checking.
Sergey Kandaurov [Tue, 28 May 2024 13:17:19 +0000 (17:17 +0400)]
QUIC: client transport parameter data length checking.

2 years agoUpstream: variables support in proxy_limit_rate and friends.
J Carter [Sat, 25 Nov 2023 21:57:09 +0000 (21:57 +0000)]
Upstream: variables support in proxy_limit_rate and friends.

23 months agoOptimized chain link usage (ticket #2614).
Roman Arutyunyan [Thu, 23 May 2024 15:15:38 +0000 (19:15 +0400)]
Optimized chain link usage (ticket #2614).

Previously chain links could sometimes be dropped instead of being reused,
which could result in increased memory consumption during long requests.

A similar chain link issue in ngx_http_gzip_filter_module was fixed in
da46bfc484ef (1.11.10).

Based on a patch by Sangmin Lee.

23 months agoConfigure: fixed building libatomic test.
Edgar Bonet [Thu, 16 May 2024 09:15:10 +0000 (11:15 +0200)]
Configure: fixed building libatomic test.

Using "long *" instead of "AO_t *" leads either to -Wincompatible-pointer-types
or -Wpointer-sign warnings, depending on whether long and size_t are compatible
types (e.g., ILP32 versus LP64 data models).  Notably, -Wpointer-sign warnings
are enabled by default in Clang only, and -Wincompatible-pointer-types is an
error starting from GCC 14.

Signed-off-by: Edgar Bonet <bonet@grenoble.cnrs.fr>
2 years agoStream pass: disabled passing from or to udp.
Roman Arutyunyan [Fri, 3 May 2024 16:26:05 +0000 (20:26 +0400)]
Stream pass: disabled passing from or to udp.

Passing from udp was not possible for the most part due to preread buffer
restriction.  Passing to udp could occasionally work, but the connection would
still be bound to the original listen rbtree, which prevented it from being
deleted on connection closure.

2 years agoSSL: fixed possible configuration overwrite loading "engine:" keys.
Sergey Kandaurov [Fri, 3 May 2024 16:29:01 +0000 (20:29 +0400)]
SSL: fixed possible configuration overwrite loading "engine:" keys.

When loading certificate keys via ENGINE_load_private_key() in runtime,
it was possible to overwrite configuration on ENGINE_by_id() failure.
OpenSSL documention doesn't describe errors in details, the only reason
I found in the comment to example is when the engine is not available.

2 years agoHTTP/3: fixed handling of malformed request body length.
Sergey Kandaurov [Fri, 3 May 2024 16:28:32 +0000 (20:28 +0400)]
HTTP/3: fixed handling of malformed request body length.

Previously, a request body larger than declared in Content-Length resulted in
a 413 status code, because Content-Length was mistakenly used as the maximum
allowed request body, similar to client_max_body_size.  Following the HTTP/3
specification, such requests are now rejected with the 400 error as malformed.

2 years agoVersion bump.
Sergey Kandaurov [Fri, 3 May 2024 16:28:22 +0000 (20:28 +0400)]
Version bump.

2 years agorelease-1.25.5 tag
Roman Arutyunyan [Tue, 16 Apr 2024 14:29:59 +0000 (18:29 +0400)]
release-1.25.5 tag

2 years agonginx-1.25.5-RELEASE release-1.25.5
Roman Arutyunyan [Tue, 16 Apr 2024 14:27:50 +0000 (18:27 +0400)]
nginx-1.25.5-RELEASE

2 years agoStream pass: limited the number of passes per connection.
Roman Arutyunyan [Thu, 11 Apr 2024 07:37:30 +0000 (11:37 +0400)]
Stream pass: limited the number of passes per connection.

Previously a cycle in pass configuration resulted in stack overflow.

2 years agoQUIC: fixed close timer processing with early data.
Vladimir Khomutov [Wed, 10 Apr 2024 06:38:10 +0000 (09:38 +0300)]
QUIC: fixed close timer processing with early data.

The ngx_quic_run() function uses qc->close timer to limit the handshake
duration.  Normally it is removed by ngx_quic_do_init_streams() which is
called once when we are done with initial SSL processing.

The problem happens when the client sends early data and streams are
initialized in the ngx_quic_run() -> ngx_quic_handle_datagram() call.
The order of set/remove timer calls is now reversed; the close timer is
set up and the timer fires when assigned, starting the unexpected connection
close process.

The fix is to skip setting the timer if streams were initialized during
handling of the initial datagram.  The idle timer for quic is set anyway,
and stream-related timeouts are managed by application layer.

2 years agoConfigure: allow cross-compiling to Windows using Clang.
Piotr Sikora [Mon, 26 Feb 2024 20:00:48 +0000 (20:00 +0000)]
Configure: allow cross-compiling to Windows using Clang.

Signed-off-by: Piotr Sikora <piotr@aviatrix.com>
2 years agoConfigure: fixed "make install" when cross-compiling to Windows.
Piotr Sikora [Mon, 26 Feb 2024 20:00:46 +0000 (20:00 +0000)]
Configure: fixed "make install" when cross-compiling to Windows.

Signed-off-by: Piotr Sikora <piotr@aviatrix.com>
2 years agoConfigure: added support for Homebrew on Apple Silicon.
Piotr Sikora [Mon, 26 Feb 2024 20:00:43 +0000 (20:00 +0000)]
Configure: added support for Homebrew on Apple Silicon.

Signed-off-by: Piotr Sikora <piotr@aviatrix.com>
2 years agoConfigure: set cache line size for more architectures.
Sergey Kandaurov [Wed, 27 Mar 2024 15:36:51 +0000 (19:36 +0400)]
Configure: set cache line size for more architectures.

Based on a patch by Piotr Sikora.

2 years agoDetect cache line size at runtime on macOS.
Piotr Sikora [Mon, 26 Feb 2024 20:00:40 +0000 (20:00 +0000)]
Detect cache line size at runtime on macOS.

Notably, Apple Silicon CPUs have 128 byte cache line size,
which is twice the default configured for generic aarch64.

Signed-off-by: Piotr Sikora <piotr@aviatrix.com>
2 years agoConfigure: fixed Linux crypt_r() test to add libcrypt.
Sergey Kandaurov [Mon, 26 Feb 2024 20:00:38 +0000 (20:00 +0000)]
Configure: fixed Linux crypt_r() test to add libcrypt.

Previously, the resulting binary was successfully linked
because libcrypt was added in a separate test for crypt().

Patch by Piotr Sikora.

2 years agoWin32: fixed unique file index calculations.
Piotr Sikora [Mon, 26 Feb 2024 20:00:35 +0000 (20:00 +0000)]
Win32: fixed unique file index calculations.

The old code was breaking strict aliasing rules.

Signed-off-by: Piotr Sikora <piotr@aviatrix.com>
2 years agoRewrite: fixed "return" directive without response text.
Piotr Sikora [Mon, 26 Feb 2024 20:00:28 +0000 (20:00 +0000)]
Rewrite: fixed "return" directive without response text.

Previously, the response text wasn't initialized and the rewrite module
was sending response body set to NULL.

Found with UndefinedBehaviorSanitizer (pointer-overflow).

Signed-off-by: Piotr Sikora <piotr@aviatrix.com>
2 years agoFixed undefined behaviour with IPv4-mapped IPv6 addresses.
Sergey Kandaurov [Mon, 18 Mar 2024 13:14:30 +0000 (17:14 +0400)]
Fixed undefined behaviour with IPv4-mapped IPv6 addresses.

Previously, it could result when left-shifting signed integer due to implicit
integer promotion, such that the most significant bit appeared on the sign bit.

In practice, though, this results in the same left value as with an explicit
cast, at least on known compilers, such as GCC and Clang.  The reason is that
in_addr_t, which is equivalent to uint32_t and same as "unsigned int" in ILP32
and LP64 data type models, has the same type width as the intermediate after
integer promotion, so there's no side effects such as sign-extension.  This
explains why adding an explicit cast does not change object files in practice.

Found with UndefinedBehaviorSanitizer (shift).

Based on a patch by Piotr Sikora.

2 years agoGeo: fixed uninitialized memory access.
Piotr Sikora [Thu, 14 Mar 2024 14:37:20 +0000 (18:37 +0400)]
Geo: fixed uninitialized memory access.

While copying ngx_http_variable_value_t structures to geo binary base
in ngx_http_geo_copy_values(), and similarly in the stream module,
uninitialized parts of these structures are copied as well.  These
include the "escape" field and possible holes.  Calculating crc32 of
this data triggers uninitialized memory access.

Found with MemorySanitizer.

Signed-off-by: Piotr Sikora <piotr@aviatrix.com>
2 years agoStream: $server_name.
Sergey Kandaurov [Fri, 22 Mar 2024 14:39:50 +0000 (18:39 +0400)]
Stream: $server_name.

2 years agoStream: moved fastopen compatibility check.
Roman Arutyunyan [Thu, 18 Jan 2024 15:12:38 +0000 (19:12 +0400)]
Stream: moved fastopen compatibility check.

The move makes the code look similar to the corresponding code in http module.

2 years agoStream: the "setfib" parameter of the "listen" directive.
Sergey Kandaurov [Fri, 22 Mar 2024 10:53:19 +0000 (14:53 +0400)]
Stream: the "setfib" parameter of the "listen" directive.

The FreeBSD SO_SETFIB support.

2 years agoStream: the "accept_filter" parameter of the "listen" directive.
Sergey Kandaurov [Fri, 22 Mar 2024 10:53:19 +0000 (14:53 +0400)]
Stream: the "accept_filter" parameter of the "listen" directive.

The FreeBSD accept filters support.

2 years agoStream: the "deferred" parameter of the "listen" directive.
Sergey Kandaurov [Fri, 22 Mar 2024 10:53:19 +0000 (14:53 +0400)]
Stream: the "deferred" parameter of the "listen" directive.

The Linux TCP_DEFER_ACCEPT support.

2 years agoStream: reshuffled ngx_stream_listen_opt_t fields.
Sergey Kandaurov [Fri, 22 Mar 2024 10:53:19 +0000 (14:53 +0400)]
Stream: reshuffled ngx_stream_listen_opt_t fields.

In preparation for adding more parameters to the listen directive,
and to be in sync with the corresponding structure in the http module.
No functional changes.

2 years agoOverhauled some diagnostic messages akin to 1b05b9bbcebf.
Sergey Kandaurov [Fri, 22 Mar 2024 10:51:14 +0000 (14:51 +0400)]
Overhauled some diagnostic messages akin to 1b05b9bbcebf.

2 years agoStream: using ngx_stream_ssl_srv_conf_t *sscf naming convention.
Sergey Kandaurov [Fri, 22 Mar 2024 10:18:51 +0000 (14:18 +0400)]
Stream: using ngx_stream_ssl_srv_conf_t *sscf naming convention.

Originally, the stream module was developed based on the mail module,
following the existing style.  Then it was diverged to closely follow
the http module development.  This change updates style to use sscf
naming convention troughout the stream module, which matches the http
module code style.  No functional changes.

2 years agoStream: ngx_stream_pass_module.
Roman Arutyunyan [Wed, 21 Feb 2024 13:36:02 +0000 (17:36 +0400)]
Stream: ngx_stream_pass_module.

The module allows to pass connections from Stream to other modules such as HTTP
or Mail, as well as back to Stream.  Previously, this was only possible with
proxying.  Connections with preread buffer read out from socket cannot be
passed.

The module allows selective SSL termination based on SNI.

    stream {
        server {
            listen 8000 default_server;
            ssl_preread on;
            ...
        }

        server {
            listen 8000;
            server_name foo.example.com;
            pass 127.0.0.1:8001; # to HTTP
        }

        server {
            listen 8000;
            server_name bar.example.com;
            ...
        }
    }

    http {
        server {
            listen 8001 ssl;
            ...

            location / {
                root html;
            }
        }
    }

2 years agoStream: virtual servers.
Roman Arutyunyan [Thu, 14 Dec 2023 17:58:39 +0000 (21:58 +0400)]
Stream: virtual servers.

Server name is taken either from ngx_stream_ssl_module or
ngx_stream_ssl_preread_module.

The change adds "default_server" parameter to the "listen" directive,
as well as the following directives: "server_names_hash_max_size",
"server_names_hash_bucket_size", "server_name" and "ssl_reject_handshake".

2 years agoStream: socket peek in preread phase.
Roman Arutyunyan [Wed, 13 Dec 2023 14:04:55 +0000 (18:04 +0400)]
Stream: socket peek in preread phase.

Previously, preread buffer was always read out from socket, which made it
impossible to terminate SSL on the connection without introducing additional
SSL BIOs.  The following patches will rely on this.

Now, when possible, recv(MSG_PEEK) is used instead, which keeps data in socket.
It's called if SSL is not already terminated and if an egde-triggered event
method is used.  For epoll, EPOLLRDHUP support is also required.

2 years agoVersion bump.
Roman Arutyunyan [Thu, 21 Mar 2024 13:06:21 +0000 (17:06 +0400)]
Version bump.

2 years agorelease-1.25.4 tag
Sergey Kandaurov [Wed, 14 Feb 2024 16:03:00 +0000 (20:03 +0400)]
release-1.25.4 tag

2 years agonginx-1.25.4-RELEASE release-1.25.4
Sergey Kandaurov [Wed, 14 Feb 2024 11:55:46 +0000 (15:55 +0400)]
nginx-1.25.4-RELEASE

2 years agoUpdated OpenSSL and zlib used for win32 builds.
Sergey Kandaurov [Wed, 14 Feb 2024 11:55:42 +0000 (15:55 +0400)]
Updated OpenSSL and zlib used for win32 builds.

2 years agoQUIC: fixed stream cleanup (ticket #2586).
Roman Arutyunyan [Wed, 14 Feb 2024 11:55:37 +0000 (15:55 +0400)]
QUIC: fixed stream cleanup (ticket #2586).

Stream connection cleanup handler ngx_quic_stream_cleanup_handler() calls
ngx_quic_shutdown_stream() after which it resets the pointer from quic stream
to the connection (sc->connection = NULL).  Previously if this call failed,
sc->connection retained the old value, while the connection was freed by the
application code.  This resulted later in a second attempt to close the freed
connection, which lead to allocator double free error.

The fix is to reset the sc->connection pointer in case of error.

2 years agoQUIC: trial packet decryption in response to invalid key update.
Sergey Kandaurov [Wed, 14 Feb 2024 11:55:34 +0000 (15:55 +0400)]
QUIC: trial packet decryption in response to invalid key update.

Inspired by RFC 9001, Section 6.3, trial packet decryption with the current
keys is now used to avoid a timing side-channel signal.  Further, this fixes
segfault while accessing missing next keys (ticket #2585).

2 years agoQUIC: fixed unsent MTU probe acknowledgement.
Roman Arutyunyan [Wed, 14 Feb 2024 12:56:28 +0000 (16:56 +0400)]
QUIC: fixed unsent MTU probe acknowledgement.

Previously if an MTU probe send failed early in ngx_quic_frame_sendto()
due to allocation error or congestion control, the application level packet
number was not increased, but was still saved as MTU probe packet number.
Later when a packet with this number was acknowledged, the unsent MTU probe
was acknowledged as well.  This could result in discovering a bigger MTU than
supported by the path, which could lead to EMSGSIZE (Message too long) errors
while sending further packets.

The problem existed since PMTUD was introduced in 58afcd72446f (1.25.2).
Back then only the unlikely memory allocation error could trigger it.  However
in efcdaa66df2e congestion control was added to ngx_quic_frame_sendto() which
can now trigger the issue with a higher probability.

2 years agoHTTP/3: added more compatibility checks for "listen ... quic".
Sergey Kandaurov [Tue, 30 Jan 2024 15:19:26 +0000 (19:19 +0400)]
HTTP/3: added more compatibility checks for "listen ... quic".

Now "fastopen", "backlog", "accept_filter", "deferred", and "so_keepalive"
parameters are not allowed with "quic" in the "listen" directive.

Reported by Izorkin.

2 years agoSSL: fixed $ssl_curves allocation error handling.
Sergey Kandaurov [Tue, 30 Jan 2024 15:18:31 +0000 (19:18 +0400)]
SSL: fixed $ssl_curves allocation error handling.