[PATCH] Core: support for reading PROXY protocol v2 TLVs

Maxim Dounin mdounin at mdounin.ru
Thu Nov 3 01:51:55 UTC 2022


Hello!

On Wed, Nov 02, 2022 at 05:06:25PM +0400, Roman Arutyunyan wrote:

[...]

> # HG changeset patch
> # User Roman Arutyunyan <arut at nginx.com>
> # Date 1667382376 -14400
> #      Wed Nov 02 13:46:16 2022 +0400
> # Node ID dc5f16e6a243c15f58e2c6a62f7a83f536729174
> # Parent  81b4326daac70d6de70abbc3fe36d4f6e3da54a2
> Increased maximum read PROXY protocol header size.
> 
> Maximum size for reading the PROXY protocol header is increased to 4096 to
> accommodate a bigger number of TLVs, which are supported since cca4c8a715de.
> 
> Maximum size for writing the PROXY protocol header is not changed since only
> version 1 is currently supported.
> 
> diff --git a/src/core/ngx_proxy_protocol.c b/src/core/ngx_proxy_protocol.c
> --- a/src/core/ngx_proxy_protocol.c
> +++ b/src/core/ngx_proxy_protocol.c
> @@ -281,7 +281,7 @@ ngx_proxy_protocol_write(ngx_connection_
>  {
>      ngx_uint_t  port, lport;
>  
> -    if (last - buf < NGX_PROXY_PROTOCOL_MAX_HEADER) {
> +    if (last - buf < NGX_PROXY_PROTOCOL_V1_MAX_HEADER) {
>          return NULL;
>      }

A side note: here an error is detected and returned, but no 
logging of the error happens neither in ngx_proxy_protocol_write() 
nor in its callers.  This needs to be fixed.

(Given that ngx_proxy_protocol_write() can also fail due to 
ngx_connection_local_sockaddr() failure, the logging should be 
added to ngx_proxy_protocol_write() itself.  Alternatively, the 
error detection can be completely removed, given that the error 
can never happen.)

>  
> diff --git a/src/core/ngx_proxy_protocol.h b/src/core/ngx_proxy_protocol.h
> --- a/src/core/ngx_proxy_protocol.h
> +++ b/src/core/ngx_proxy_protocol.h
> @@ -13,7 +13,8 @@
>  #include <ngx_core.h>
>  
>  
> -#define NGX_PROXY_PROTOCOL_MAX_HEADER  107
> +#define NGX_PROXY_PROTOCOL_V1_MAX_HEADER  107
> +#define NGX_PROXY_PROTOCOL_MAX_HEADER     4096
>  
>  
>  struct ngx_proxy_protocol_s {
> diff --git a/src/mail/ngx_mail_proxy_module.c b/src/mail/ngx_mail_proxy_module.c
> --- a/src/mail/ngx_mail_proxy_module.c
> +++ b/src/mail/ngx_mail_proxy_module.c
> @@ -890,7 +890,7 @@ ngx_mail_proxy_send_proxy_protocol(ngx_m
>      u_char            *p;
>      ssize_t            n, size;
>      ngx_connection_t  *c;
> -    u_char             buf[NGX_PROXY_PROTOCOL_MAX_HEADER];
> +    u_char             buf[NGX_PROXY_PROTOCOL_V1_MAX_HEADER];
>  
>      s->connection->log->action = "sending PROXY protocol header to upstream";
>  
> @@ -898,7 +898,7 @@ ngx_mail_proxy_send_proxy_protocol(ngx_m
>                     "mail proxy send PROXY protocol header");
>  
>      p = ngx_proxy_protocol_write(s->connection, buf,
> -                                 buf + NGX_PROXY_PROTOCOL_MAX_HEADER);
> +                                 buf + NGX_PROXY_PROTOCOL_V1_MAX_HEADER);
>      if (p == NULL) {
>          ngx_mail_proxy_internal_server_error(s);
>          return NGX_ERROR;
> diff --git a/src/stream/ngx_stream_proxy_module.c b/src/stream/ngx_stream_proxy_module.c
> --- a/src/stream/ngx_stream_proxy_module.c
> +++ b/src/stream/ngx_stream_proxy_module.c
> @@ -894,7 +894,7 @@ ngx_stream_proxy_init_upstream(ngx_strea
>              return;
>          }
>  
> -        p = ngx_pnalloc(c->pool, NGX_PROXY_PROTOCOL_MAX_HEADER);
> +        p = ngx_pnalloc(c->pool, NGX_PROXY_PROTOCOL_V1_MAX_HEADER);
>          if (p == NULL) {
>              ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
>              return;
> @@ -902,7 +902,8 @@ ngx_stream_proxy_init_upstream(ngx_strea
>  
>          cl->buf->pos = p;
>  
> -        p = ngx_proxy_protocol_write(c, p, p + NGX_PROXY_PROTOCOL_MAX_HEADER);
> +        p = ngx_proxy_protocol_write(c, p,
> +                                     p + NGX_PROXY_PROTOCOL_V1_MAX_HEADER);
>          if (p == NULL) {
>              ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
>              return;
> @@ -946,14 +947,15 @@ ngx_stream_proxy_send_proxy_protocol(ngx
>      ngx_connection_t             *c, *pc;
>      ngx_stream_upstream_t        *u;
>      ngx_stream_proxy_srv_conf_t  *pscf;
> -    u_char                        buf[NGX_PROXY_PROTOCOL_MAX_HEADER];
> +    u_char                        buf[NGX_PROXY_PROTOCOL_V1_MAX_HEADER];
>  
>      c = s->connection;
>  
>      ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
>                     "stream proxy send PROXY protocol header");
>  
> -    p = ngx_proxy_protocol_write(c, buf, buf + NGX_PROXY_PROTOCOL_MAX_HEADER);
> +    p = ngx_proxy_protocol_write(c, buf,
> +                                 buf + NGX_PROXY_PROTOCOL_V1_MAX_HEADER);
>      if (p == NULL) {
>          ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
>          return NGX_ERROR;

Looks good.

-- 
Maxim Dounin
http://mdounin.ru/



More information about the nginx-devel mailing list