summaryrefslogtreecommitdiffhomepage
AgeCommit message (Collapse)AuthorFilesLines
2021-05-19Mail: stricter checking of IMAP tags.Maxim Dounin1-0/+11
Only "A-Za-z0-9-._" characters now allowed (which is stricter than what RFC 3501 requires, but expected to be enough for all known clients), and tags shouldn't be longer than 32 characters.
2021-05-19Mail: fixed backslash handling in IMAP literals.Maxim Dounin2-25/+19
Previously, s->backslash was set if any of the arguments was a quoted string with a backslash character. After successful command parsing this resulted in all arguments being filtered to remove backslashes. This is, however, incorrect, as backslashes should not be removed from IMAP literals. For example: S: * OK IMAP4 ready C: a01 login {9} S: + OK C: user\name "pass\"word" S: * BAD internal server error resulted in "Auth-User: username" instead of "Auth-User: user\name" as it should. Fix is to apply backslash filtering on per-argument basis during parsing.
2021-05-19Mail: removed dead s->arg_start handling.Maxim Dounin2-48/+0
As discussed in the previous change, s->arg_start handling in the "done" labels of ngx_mail_pop3_parse_command(), ngx_mail_imap_parse_command(), and ngx_mail_smtp_parse_command() is wrong: s->arg_start cannot be set there, as it is handled and cleared on all code paths where the "done" labels are reached. The relevant code is dead and now removed.
2021-05-19Mail: fixed s->arg_start clearing on invalid IMAP commands.Maxim Dounin1-0/+2
Previously, s->arg_start was left intact after invalid IMAP commands, and this might result in an argument incorrectly added to the following command. Similarly, s->backslash was left intact as well, leading to unneeded backslash removal. For example (LFs from the client are explicitly shown as "<LF>"): S: * OK IMAP4 ready C: a01 login "\<LF> S: a01 BAD invalid command C: a0000000000\2 authenticate <LF> S: a00000000002 aBAD invalid command The backslash followed by LF generates invalid command with s->arg_start and s->backslash set, the following command incorrectly treats anything from the old s->arg_start to the space after the command as an argument, and removes the backslash from the tag. If there is no space, s->arg_end will be NULL. Both things seem to be harmless though. In particular: - This can be used to provide an incorrect argument to a command without arguments. The only command which seems to look at the single argument is AUTHENTICATE, and it checks the argument length before trying to access it. - Backslash removal uses the "end" pointer, and stops due to "src < end" condition instead of scanning all the process memory if s->arg_end is NULL (and arg[0].len is huge). - There should be no backslashes in unquoted strings. An obvious fix is to clear s->arg_start and s->backslash on invalid commands, similarly to how it is done in POP3 parsing (added in 810:e3aa8f305d21) and SMTP parsing. This, however, makes it clear that s->arg_start handling in the "done" label is wrong: s->arg_start cannot be legitimately set there, as it is expected to be cleared in all possible cases when the "done" label is reached. The relevant code is dead and will be removed by the following change.
2021-05-19Mail: POP3 pipelining support.Maxim Dounin3-6/+45
The change is mostly the same as the SMTP one (04e43d03e153 and 3f5d0af4e40a), and ensures that nginx is able to properly handle or reject multiple POP3 commands, as required by the PIPELINING capability (RFC 2449). The s->cmd field is not really used and set for consistency.
2021-05-19Mail: optimized discarding invalid SMTP commands.Maxim Dounin1-1/+1
There is no need to scan buffer from s->buffer->pos, as we already scanned the buffer till "p" and wasn't able to find an LF. There is no real need for this change in SMTP, since it is at most a microoptimization of a non-common code path. Similar code in IMAP, however, will have to start scanning from "p" to be correct, since there can be newlines in IMAP literals.
2021-05-19Mail: fixed handling of invalid SMTP commands split between reads.Maxim Dounin1-3/+3
Previously, if an invalid SMTP command was split between reads, nginx failed to wait for LF before returning an error, and interpreted the rest of the command received later as a separate command. The sw_invalid state in ngx_mail_smtp_parse_command(), introduced in 04e43d03e153, did not work, since ngx_mail_smtp_auth_state() clears s->state when returning an error due to NGX_MAIL_PARSE_INVALID_COMMAND. And not clearing s->state will introduce another problem: the rest of the command would trigger duplicate error when rest of the command is received. Fix is to return NGX_AGAIN from ngx_mail_smtp_parse_command() until full command is received.
2021-05-19Mail: fixed SMTP pipelining to send the response immediately.Maxim Dounin1-5/+4
Previously, if there were some pipelined SMTP data in the buffer when a proxied connection with the backend was established, nginx called ngx_mail_proxy_handler() to send these data, and not tried to send the response to the last command. In most cases, this response was later sent along with the response to the pipelined command, but if for some reason client decides to wait for the response before finishing the next command this might result in a connection hang. Fix is to always call ngx_mail_proxy_handler() to send the response, and additionally post an event to send the pipelined data if needed.
2021-05-18HTTP/3: fixed server push after 9ec3e71f8a61.Roman Arutyunyan1-4/+3
When using server push, a segfault occured because ngx_http_v3_create_push_request() accessed ngx_http_v3_session_t object the old way. Prior to 9ec3e71f8a61, HTTP/3 session was stored directly in c->data. Now it's referenced by the v3_session field of ngx_http_connection_t.
2021-05-08MIME: added application/wasm type (ticket #1606).Maxim Dounin1-0/+1
2021-05-06Upstream: variables support in certificates.Maxim Dounin10-90/+331
2021-05-06Auth basic: changed alcf->user_file to be a pointer.Maxim Dounin1-9/+12
This saves some memory in typical case when auth_basic_user_file is not explicitly set, and unifies the code with alcf->realm.
2021-05-06Changed complex value slots to use NGX_CONF_UNSET_PTR.Maxim Dounin9-55/+39
With this change, it is now possible to use ngx_conf_merge_ptr_value() to merge complex values. This change follows much earlier changes in ngx_conf_merge_ptr_value() and ngx_conf_set_str_array_slot() in 1452:cd586e963db0 (0.6.10) and 1701:40d004d95d88 (0.6.22), and the change in ngx_conf_set_keyval_slot() (7728:485dba3e2a01, 1.19.4). To preserve compatibility with existing 3rd party modules, both NULL and NGX_CONF_UNSET_PTR are accepted for now.
2021-05-05QUIC: generic buffering for stream input.Roman Arutyunyan5-75/+77
Previously each stream had an input buffer. Now memory is allocated as bytes arrive. Generic buffering mechanism is used for this.
2021-05-05QUIC: simplified sending 1-RTT only frames.Sergey Kandaurov5-27/+19
2021-05-05QUIC: relaxed client id requirements.Vladimir Homutov3-6/+44
Client IDs cannot be reused on different paths. This change allows to reuse client id previosly seen on the same path (but with different dcid) in case when no unused client IDs are available.
2021-05-06QUIC: consider NEW_CONNECTION_ID a probing frame.Vladimir Homutov1-0/+1
According to quic-transport, 9.1: PATH_CHALLENGE, PATH_RESPONSE, NEW_CONNECTION_ID, and PADDING frames are "probing frames", and all other frames are "non-probing frames".
2021-04-28HTTP/3: clean up table from session cleanup handler.Roman Arutyunyan3-19/+13
Previously table had a separate cleanup handler.
2021-05-05HTTP/3: moved session initialization to a separate file.Roman Arutyunyan4-76/+89
Previously it was in ngx_http_v3_streams.c, but it's unrelated to streams.
2021-05-05HTTP/3: separate header files for existing source files.Roman Arutyunyan5-75/+139
2021-05-05HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c.Roman Arutyunyan4-125/+159
Previously it was parsed in ngx_http_v3_streams.c, while the streams were parsed in ngx_http_v3_parse.c. Now all parsing is done in one file. This simplifies parsing API and cleans up ngx_http_v3_streams.c.
2021-04-27HTTP/3: renamed ngx_http_v3_client_XXX() functions.Roman Arutyunyan4-17/+16
The functions are renamed to ngx_http_v3_send_XXX() similar to ngx_http_v3_send_settings() and ngx_http_v3_send_goaway().
2021-05-05HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.Roman Arutyunyan7-41/+40
2021-05-05HTTP/3: reference h3c directly from ngx_http_connection_t.Roman Arutyunyan7-32/+30
Previously, an ngx_http_v3_connection_t object was created for HTTP/3 and then assinged to c->data instead of the generic ngx_http_connection_t object. Now a direct reference is added to ngx_http_connection_t, which is less confusing and does not require a flag for http3.
2021-04-30HTTP/3: ngx_http_v3_get_session() macro.Roman Arutyunyan5-22/+24
It's used instead of accessing c->quic->parent->data directly. Apart from being simpler, it allows to change the way session is stored in the future by changing the macro.
2021-05-05HTTP/3: moved Stream Cancellation stub to ngx_http_v3_streams.c.Roman Arutyunyan2-12/+12
2021-05-04HTTP/3: fixed decoder stream stubs.Roman Arutyunyan1-5/+5
Now ngx_http_v3_ack_header() and ngx_http_v3_inc_insert_count() always generate decoder error. Our implementation does not use dynamic tables and does not expect client to send Section Acknowledgement or Insert Count Increment. Stream Cancellation, on the other hand, is allowed to be sent anyway. This is why ngx_http_v3_cancel_stream() does not return an error.
2021-05-05HTTP/3: reject empty DATA and HEADERS frames on control stream.Roman Arutyunyan1-5/+4
Previously only non-empty frames were rejected.
2021-04-28QUIC: fixed build with NGX_QUIC_DEBUG_ALLOC enabled.Vladimir Homutov1-9/+6
2021-04-29QUIC: connection migration.Vladimir Homutov17-373/+1680
The patch adds proper transitions between multiple networking addresses that can be used by a single quic connection. New networking paths are validated using PATH_CHALLENGE/PATH_RESPONSE frames.
2021-04-22Restored zeroing of ngx_channel_t in ngx_pass_open_channel().Ruslan Ermilov1-0/+2
Due to structure's alignment, some uninitialized memory contents may have been passed between processes. Zeroing was removed in 0215ec9aaa8a. Reported by Johnny Wang.
2021-04-22HTTP/3: adjusted control stream parsing.Vladimir Homutov1-0/+4
7.2.1: If a DATA frame is received on a control stream, the recipient MUST respond with a connection error of type H3_FRAME_UNEXPECTED; 7.2.2: If a HEADERS frame is received on a control stream, the recipient MUST respond with a connection error (Section 8) of type H3_FRAME_UNEXPECTED.
2021-04-21Mail: fixed reading with fully filled buffer (ticket #2159).Maxim Dounin1-11/+14
With SMTP pipelining, ngx_mail_read_command() can be called with s->buffer without any space available, to parse additional commands received to the buffer on previous calls. Previously, this resulted in recv() being called with zero length, resulting in zero being returned, which was interpreted as a connection close by the client, so nginx silently closed connection. Fix is to avoid calling c->recv() if there is no free space in the buffer, but continue parsing of the already received commands.
2021-04-21Version bump.Maxim Dounin1-2/+2
2021-04-19QUIC: renamed stream variables from sn to qs.Roman Arutyunyan2-99/+99
Currently both names are used which is confusing. Historically these were different objects, but now it's the same one. The name qs (quic stream) makes more sense than sn (stream node).
2021-04-19QUIC: renamed stream field from c to connection.Roman Arutyunyan3-41/+44
2021-04-16QUIC: fixed permitted packet types for PATH_RESPONSE.Sergey Kandaurov1-1/+1
PATH_RESPONSE was explicitly forbidden in 0-RTT since at least draft-22, but the Frame Types table was not updated until recently while in IESG evaluation.
2021-04-19QUIC: added missing checks for limits in stream frames parsing.Vladimir Homutov1-0/+8
2021-04-19QUIC: fixed parsing of unknown frame types.Vladimir Homutov2-0/+9
The ngx_quic_frame_allowed() function only expects known frame types.
2021-04-15QUIC: avoid sending extra frames in case of error.Vladimir Homutov1-0/+4
2021-04-13release-1.19.10 tagMaxim Dounin1-0/+1
2021-04-13nginx-1.19.10-RELEASErelease-1.19.10Maxim Dounin1-0/+43
2021-04-13QUIC: normalize header inclusion.Sergey Kandaurov9-18/+8
Stop including QUIC headers with no user-serviceable parts inside. This allows to provide a much cleaner QUIC interface. To cope with that, ngx_quic_derive_key() is now explicitly exported for v3 and quic modules. Additionally, this completely hides the ngx_quic_keys_t internal type.
2021-04-13QUIC: ngx_quic_frames_stream_t made opaque.Sergey Kandaurov4-15/+23
2021-04-14QUIC: separate files for SSL library interfaces.Vladimir Homutov6-507/+531
2021-04-13QUIC: separate files for tokens related processing.Vladimir Homutov5-285/+317
2021-04-13QUIC: separate files for output and ack related processing.Vladimir Homutov7-1955/+2027
2021-04-13QUIC: separate files for stream related processing.Vladimir Homutov5-1287/+1321
2021-04-13QUIC: separate files for frames related processing.Vladimir Homutov5-912/+959
2021-04-13QUIC: separate files for connection id related processing.Vladimir Homutov5-530/+566