diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2018-11-06 16:29:59 +0300 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2018-11-06 16:29:59 +0300 |
commit | 42043b4ef7e60eabed114164f36c1d2314faef1a (patch) | |
tree | 7fea674711e3b6ef9a932b94bcc1898f79ed67e6 /src/http/modules/ngx_http_grpc_module.c | |
parent | 60b93594cca9cb5d63f26e724c458ccb380ac540 (diff) | |
download | nginx-42043b4ef7e60eabed114164f36c1d2314faef1a.tar.gz nginx-42043b4ef7e60eabed114164f36c1d2314faef1a.zip |
gRPC: limited allocations due to ping and settings frames.
Diffstat (limited to 'src/http/modules/ngx_http_grpc_module.c')
-rw-r--r-- | src/http/modules/ngx_http_grpc_module.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/http/modules/ngx_http_grpc_module.c b/src/http/modules/ngx_http_grpc_module.c index e6e11b07a..18478b978 100644 --- a/src/http/modules/ngx_http_grpc_module.c +++ b/src/http/modules/ngx_http_grpc_module.c @@ -78,6 +78,9 @@ typedef struct { ngx_uint_t id; + ngx_uint_t pings; + ngx_uint_t settings; + ssize_t send_window; size_t recv_window; @@ -3584,6 +3587,12 @@ ngx_http_grpc_parse_settings(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx, ctx->rest); return NGX_ERROR; } + + if (ctx->free == NULL && ctx->settings++ > 1000) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "upstream sent too many settings frames"); + return NGX_ERROR; + } } for (p = b->pos; p < last; p++) { @@ -3736,6 +3745,12 @@ ngx_http_grpc_parse_ping(ngx_http_request_t *r, "upstream sent ping frame with ack flag"); return NGX_ERROR; } + + if (ctx->free == NULL && ctx->pings++ > 1000) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "upstream sent too many ping frames"); + return NGX_ERROR; + } } for (p = b->pos; p < last; p++) { |