summaryrefslogtreecommitdiffhomepage
path: root/src (follow)
AgeCommit message (Collapse)AuthorFilesLines
2021-07-13HTTP/3: response trailers support.Roman Arutyunyan1-16/+118
2021-07-22QUIC: avoid processing 1-RTT with incomplete handshake in OpenSSL.Sergey Kandaurov1-0/+14
OpenSSL is known to provide read keys for an encryption level before the level is active in TLS, following the old BoringSSL API. In BoringSSL, it was then fixed to defer releasing read keys until QUIC may use them.
2021-07-20QUIC: the "quic_gso" directive.Vladimir Homutov4-2/+25
The directive enables usage of UDP segmentation offloading by quic. By default, gso is disabled since it is not always operational when detected (depends on interface configuration).
2021-07-20Core: fixed errno clobbering in ngx_sendmsg().Vladimir Homutov1-9/+9
This was broken by 2dfd313f22f2.
2021-07-15Merged with the default branch.Sergey Kandaurov22-206/+247
2021-07-15Core: added separate function for local source address cmsg.Vladimir Homutov3-82/+77
2021-07-15QUIC: added support for segmentation offloading.Vladimir Homutov2-10/+240
To improve output performance, UDP segmentation offloading is used if available. If there is a significant amount of data in an output queue and path is verified, QUIC packets are not sent one-by-one, but instead are collected in a buffer, which is then passed to kernel in a single sendmsg call, using UDP GSO. Such method greatly decreases number of system calls and thus system load.
2021-07-15Core: made the ngx_sendmsg() function non-static.Vladimir Homutov2-68/+124
Additionally, the ngx_init_srcaddr_cmsg() function is introduced which initializes control message with connection local address. The NGX_HAVE_ADDRINFO_CMSG macro is defined when at least one of methods to deal with corresponding control message is available.
2021-07-12Core: the ngx_event_udp.h header file.Vladimir Homutov2-27/+44
2021-07-05Win32: use only preallocated memory in send/recv chain functions.Ruslan Ermilov2-12/+20
The ngx_wsasend_chain() and ngx_wsarecv_chain() functions were modified to use only preallocated memory, and the number of preallocated wsabufs was increased to 64.
2021-07-05QUIC: fixed padding calculation.Vladimir Homutov1-0/+3
Sometimes, QUIC packets need to be of certain (or minimal) size. This is achieved by adding PADDING frames. It is possible, that adding padding will affect header size, thus forcing us to recalculate padding size once more.
2021-07-05Use only preallocated memory in ngx_readv_chain() (ticket #1408).Ruslan Ermilov1-1/+1
In d1bde5c3c5d2, the number of preallocated iovec's for ngx_readv_chain() was increased. Still, in some setups, the function might allocate memory for iovec's from a connection pool, which is only freed when closing the connection. The ngx_readv_chain() function was modified to use only preallocated memory, similarly to the ngx_writev_chain() change in 8e903522c17a.
2021-07-01HTTP/3: quic-qpack term updates.Sergey Kandaurov10-232/+232
Renamed header -> field per quic-qpack naming convention, in particular: - Header Field -> Field Line - Header Block -> (Encoded) Field Section - Without Name Reference -> With Literal Name - Header Acknowledgement -> Section Acknowledgment
2021-06-30QUIC: consider max_ack_delay=16384 invalid.Roman Arutyunyan3-3/+3
As per RFC 9000: Values of 2^14 or greater are invalid.
2021-06-28Disabled control characters in the Host header.Maxim Dounin1-3/+4
Control characters (0x00-0x1f, 0x7f) and space are not expected to appear in the Host header. Requests with such characters in the Host header are now unconditionally rejected.
2021-06-28Improved logging of invalid headers.Maxim Dounin6-13/+28
In 71edd9192f24 logging of invalid headers which were rejected with the NGX_HTTP_PARSE_INVALID_HEADER error was restricted to just the "client sent invalid header line" message, without any attempts to log the header itself. This patch returns logging of the header up to the invalid character and the character itself. The r->header_end pointer is now properly set in all cases to make logging possible. The same logging is also introduced when parsing headers from upstream servers.
2021-06-28Disabled control characters and space in header names.Maxim Dounin3-4/+4
Control characters (0x00-0x1f, 0x7f), space, and colon were never allowed in header names. The only somewhat valid use is header continuation which nginx never supported and which is explicitly obsolete by RFC 7230. Previously, such headers were considered invalid and were ignored by default (as per ignore_invalid_headers directive). With this change, such headers are unconditionally rejected. It is expected to make nginx more resilient to various attacks, in particular, with ignore_invalid_headers switched off (which is inherently unsecure, though nevertheless sometimes used in the wild).
2021-06-28Disabled control characters in URIs.Maxim Dounin1-14/+28
Control characters (0x00-0x1f, 0x7f) were never allowed in URIs, and must be percent-encoded by clients. Further, these are not believed to appear in practice. On the other hand, passing such characters might make various attacks possible or easier, despite the fact that currently allowed control characters are not significant for HTTP request parsing.
2021-06-28Disabled spaces in URIs (ticket #196).Maxim Dounin4-70/+11
From now on, requests with spaces in URIs are immediately rejected rather than allowed. Spaces were allowed in 31e9677b15a1 (0.8.41) to handle bad clients. It is believed that now this behaviour causes more harm than good.
2021-06-28Core: escaping of chars not allowed in URIs per RFC 3986.Maxim Dounin1-16/+29
Per RFC 3986 only the following characters are allowed in URIs unescaped: unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" And "%" can appear as a part of escaping itself. The following characters are not allowed and need to be escaped: %00-%1F, %7F-%FF, " ", """, "<", ">", "\", "^", "`", "{", "|", "}". Not escaping ">" is known to cause problems at least with MS Exchange (see http://nginx.org/pipermail/nginx-ru/2010-January/031261.html) and in Tomcat (ticket #2191). The patch adds escaping of the following chars in all URI parts: """, "<", ">", "\", "^", "`", "{", "|", "}". Note that comments are mostly preserved to outline important characters being escaped.
2021-06-28Core: fixed comment about escaping in arguments.Maxim Dounin1-1/+1
After 4954530db2af, the ";" character is escaped by ngx_escape_uri(NGX_ESCAPE_ARGS).
2021-06-28Disabled requests with both Content-Length and Transfer-Encoding.Maxim Dounin1-2/+9
HTTP clients are not allowed to generate such requests since Transfer-Encoding introduction in RFC 2068, and they are not expected to appear in practice except in attempts to perform a request smuggling attack. While handling of such requests is strictly defined, the most secure approach seems to reject them.
2021-06-28Added CONNECT method rejection.Maxim Dounin4-17/+31
No valid CONNECT requests are expected to appear within nginx, since it is not a forward proxy. Further, request line parsing will reject proper CONNECT requests anyway, since we don't allow authority-form of request-target. On the other hand, RFC 7230 specifies separate message length rules for CONNECT which we don't support, so make sure to always reject CONNECTs to avoid potential abuse.
2021-06-28Moved TRACE method rejection to a better place.Maxim Dounin1-7/+7
Previously, TRACE requests were rejected before parsing Transfer-Encoding. This is not important since keepalive is not enabled at this point anyway, though rejecting such requests after properly parsing other headers is less likely to cause issues in case of further code changes.
2021-06-23QUIC: fixed client certificates verification in stream.Vladimir Homutov1-0/+4
The stream session requires 'ssl' flag to be set in order to perform certificate verification.
2021-06-21QUIC: fixed double memzero of new frames in ngx_quic_alloc_frame().Sergey Kandaurov1-1/+1
2021-06-21Core: added the ngx_rbtree_data() macro.Vladimir Homutov3-5/+6
2021-06-18Fixed format strings for ngx_win32_version.Maxim Dounin1-3/+3
2021-06-17QUIC: compact initial secrets table.Sergey Kandaurov1-32/+6
2021-06-17gRPC: RST_STREAM(NO_ERROR) handling micro-optimization.Sergey Kandaurov1-0/+4
After 2096b21fcd10, a single RST_STREAM(NO_ERROR) may not result in an error. This change removes several unnecessary ctx->type checks for such a case.
2021-06-17gRPC: handling GOAWAY with a higher last stream identifier.Sergey Kandaurov1-0/+9
Previously, once received from upstream, it couldn't limit opening additional streams in a cached keepalive connection.
2021-06-16QUIC: using compile time block/iv length for tokens.Sergey Kandaurov1-4/+8
Reference values can be found in RFC 3602, 2.1, 2.4.
2021-06-16QUIC: optimized initial secrets key length computation.Sergey Kandaurov1-6/+6
AES-128 key length is known in compile time.
2021-06-16QUIC: consistent use of 12-byte buffers in nonce computation.Sergey Kandaurov1-9/+9
All supported cipher suites produce 96-bit IV (RFC 5116, 5.1, RFC 8439, 2.3). This eliminates a few magic numbers and run-time overhead.
2021-06-16QUIC: consistent use of 5-byte buffers for header protection.Sergey Kandaurov1-8/+11
The output buffer is now also of 5 bytes. Header protection uses stream ciphers, which don't produce extra output nor PKCS padding.
2021-06-16QUIC: updated specification references.Sergey Kandaurov11-70/+128
This includes updating citations and further clarification.
2021-06-11HTTP/3: client GOAWAY support.Roman Arutyunyan6-0/+49
2021-06-11HTTP/3: generate more H3_FRAME_UNEXPECTED.Roman Arutyunyan1-3/+23
As per quic-http-34, these are the cases when this error should be generated: If an endpoint receives a second SETTINGS frame on the control stream, the endpoint MUST respond with a connection error of type H3_FRAME_UNEXPECTED SETTINGS frames MUST NOT be sent on any stream other than the control stream. If an endpoint receives a SETTINGS frame on a different stream, the endpoint MUST respond with a connection error of type H3_FRAME_UNEXPECTED. A client MUST NOT send a PUSH_PROMISE frame. A server MUST treat the receipt of a PUSH_PROMISE frame as a connection error of type H3_FRAME_UNEXPECTED; see Section 8. The MAX_PUSH_ID frame is always sent on the control stream. Receipt of a MAX_PUSH_ID frame on any other stream MUST be treated as a connection error of type H3_FRAME_UNEXPECTED. Receipt of an invalid sequence of frames MUST be treated as a connection error of type H3_FRAME_UNEXPECTED; see Section 8. In particular, a DATA frame before any HEADERS frame, or a HEADERS or DATA frame after the trailing HEADERS frame, is considered invalid. A CANCEL_PUSH frame is sent on the control stream. Receiving a CANCEL_PUSH frame on a stream other than the control stream MUST be treated as a connection error of type H3_FRAME_UNEXPECTED. The GOAWAY frame is always sent on the control stream.
2021-06-11HTTP/3: reordered H3_MISSING_SETTINGS and H3_FRAME_UNEXPECTED.Roman Arutyunyan1-6/+6
The quic-http-34 is ambiguous as to what error should be generated for the first frame in control stream: Each side MUST initiate a single control stream at the beginning of the connection and send its SETTINGS frame as the first frame on this stream. If the first frame of the control stream is any other frame type, this MUST be treated as a connection error of type H3_MISSING_SETTINGS. If a DATA frame is received on a control stream, the recipient MUST respond with a connection error of type H3_FRAME_UNEXPECTED. If a HEADERS frame is received on a control stream, the recipient MUST respond with a connection error of type H3_FRAME_UNEXPECTED. Previously, H3_FRAME_UNEXPECTED had priority, but now H3_MISSING_SETTINGS has. The arguments in the spec sound more compelling for H3_MISSING_SETTINGS.
2021-06-10QUIC: improved errors readability.Vladimir Homutov2-1/+3
2021-06-09QUIC: persistent congestion calculation.Vladimir Homutov3-13/+112
According to RFC 9002 (quic-recovery) 7.6.
2021-06-07QUIC: stream flow control refactored.Roman Arutyunyan4-64/+179
- Function ngx_quic_control_flow() is introduced. This functions does both MAX_DATA and MAX_STREAM_DATA flow controls. The function is called from STREAM and RESET_STREAM frame handlers. Previously, flow control was only accounted for STREAM. Also, MAX_DATA flow control was not accounted at all. - Function ngx_quic_update_flow() is introduced. This function advances flow control windows and sends MAX_DATA/MAX_STREAM_DATA. The function is called from RESET_STREAM frame handler, stream cleanup handler and stream recv() handler.
2021-06-01Fixed SSL logging with lingering close.Maxim Dounin3-0/+9
Recent fixes to SSL shutdown with lingering close (554c6ae25ffc, 1.19.5) broke logging of SSL variables. To make sure logging of SSL variables works properly, avoid freeing c->ssl when doing an SSL shutdown before lingering close. Reported by Reinis Rozitis (http://mailman.nginx.org/pipermail/nginx/2021-May/060670.html).
2021-06-01SSL: ngx_ssl_shutdown() rework.Maxim Dounin1-22/+21
Instead of calling SSL_free() with each return point, introduced a single place where cleanup happens. As a positive side effect, this fixes two potential memory leaks on ngx_handle_read_event() and ngx_handle_write_event() errors where there were no SSL_free() calls (though unlikely practical, as errors there are only expected to happen due to bugs or kernel issues).
2021-06-01HTTP/3: undo 5a92523e50d3 after parser refactoring (e1eb7f4ca9f1).Sergey Kandaurov1-1/+0
This is no longer needed after HTTP/3 request processing has moved into its own function ngx_http_v3_process_header().
2021-06-01HTTP/3: fixed parsing encoder insertions with empty header value.Sergey Kandaurov1-0/+2
When starting processing a new encoder instruction, the header state is not memzero'ed because generally it's burdensome. If the header value is empty, this resulted in inserting a stale value left from the previous instruction. Based on a patch by Zhiyong Sun.
2021-05-31HTTP/3: removed $http3 that served its purpose.Sergey Kandaurov2-54/+1
To specify final protocol version by hand: add_header Alt-Svc h3=":443";
2021-05-31Core: disabled SO_REUSEADDR on UDP sockets while testing config.Maxim Dounin1-11/+14
On Linux, SO_REUSEADDR allows completely duplicate UDP sockets, so using SO_REUSEADDR when testing configuration results in packets being dropped if there is an existing traffic on the sockets being tested (ticket #2187). While dropped packets are expected with UDP, it is better to avoid this when possible. With this change, SO_REUSEADDR is no longer set on datagram sockets when testing configuration.
2021-05-31Core: disabled cloning sockets when testing config (ticket #2188).Maxim Dounin1-10/+13
Since we anyway do not set SO_REUSEPORT when testing configuration (see ecb5cd305b06), trying to open additional sockets does not make much sense, as all these additional sockets are expected to result in EADDRINUSE errors from bind(). On the other hand, there are reports that trying to open these sockets takes significant time under load: total configuration testing time greater than 15s was observed in ticket #2188, compared to less than 1s without load. With this change, no additional sockets are opened during testing configuration.
2021-05-31Version bump.Maxim Dounin1-2/+2